Скремблирование целевых страниц списка доменов

У меня есть достаточно длинный список веб-сайтов, которые я хочу загрузить (index.html или эквивалентные) страницы. В настоящее время я использую Scrapy (очень люблю парней за этим - это потрясающая основа). Scrapy работает медленнее в этой конкретной задаче, чем хотелось бы, и мне интересно, будет ли wget или другая альтернатива быстрее, если бы была проста. Есть идеи?

(Вот что я делаю с помощью Scrapy. Что-нибудь, что я могу сделать, чтобы оптимизировать scrapy для этой задачи?)

Итак, у меня есть список начальных URL-адресов, например

start_urls = [google.com               yahoo.com               aol.com]

И я очищаю текст от каждого ответа и сохраняю его в xml. Мне нужно включить offsitemiddleware, чтобы разрешить несколько доменов.

Scrapy работает, как ожидалось, но кажется медленным (около 1000 в час или 1 каждые 4 секунды). Есть ли способ ускорить это, увеличив количество CONCURRENT_REQUESTS_PER_SPIDER при запуске одного паук? Что-нибудь еще?

Ответы

Ответ 1

Если вам нужен способ одновременной загрузки нескольких сайтов с помощью python, вы можете сделать это со стандартными библиотеками, такими как:

import threading
import urllib

maxthreads = 4

sites = ['google.com', 'yahoo.com', ] # etc.

class Download(threading.Thread):
   def run (self):
       global sites
       while sites:
           site = sites.pop()
           print "start", site
           urllib.urlretrieve('http://' + site, site)
           print "end  ", site

for x in xrange(min(maxthreads, len(sites))):
    Download().start()

Вы также можете проверить httplib2 или PycURL, чтобы выполнить загрузку вместо urllib.

Я не совсем понимаю, как вы хотите, чтобы очищенный текст выглядел как xml, но вы могли бы использовать xml.etree.ElementTree из стандартной библиотеки или вы могли бы установить BeautifulSoup (что было бы лучше, поскольку он обрабатывал неверную разметку).