Ускорьте скребок

Я scrapy веб-страниц с помощью довольно простого скребка с помощью scrapy . Я совершенно новичок в scrapy и даже python, но сумел написать паука, который выполняет эту работу. Это, однако, очень медленно (требуется около 28 часов для сканирования 23770 страниц).

Я просмотрел веб-страницу scrapy и списки рассылки и stackoverflow , но я не могу найти общие рекомендации для написания быстрых сканеров, понятных для новичков. Может быть, моя проблема не в самом паук, а в том, как я ее запускаю. Все предложения приветствуются!

Я перечислил свой код ниже, если это необходимо.

 from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.item import Item, Field import re class Sale(Item): Adresse = Field() Pris = Field() Salgsdato = Field() SalgsType = Field() KvmPris = Field() Rum = Field() Postnummer = Field() Boligtype = Field() Kvm = Field() Bygget = Field() class HouseSpider(BaseSpider): name = 'House' allowed_domains = ["http://boliga.dk/"] start_urls = ['http://www.boliga.dk/salg/resultater?so=1&type=Villa&type=Ejerlejlighed&type=R%%C3%%A6kkehus&kom=&amt=&fraPostnr=&tilPostnr=&iPostnr=&gade=&min=&max=&byggetMin=&byggetMax=&minRooms=&maxRooms=&minSize=&maxSize=&minsaledate=1992&maxsaledate=today&kode=&p=%d' %n for n in xrange(1, 23770, 1)] def parse(self, response): hxs = HtmlXPathSelector(response) sites = hxs.select("id('searchresult')/tr") items = [] for site in sites: item = Sale() item['Adresse'] = site.select("td[1]/a[1]/text()").extract() item['Pris'] = site.select("td[2]/text()").extract() item['Salgsdato'] = site.select("td[3]/text()").extract() Temp = site.select("td[4]/text()").extract() Temp = Temp[0] m = re.search('\r\n\t\t\t\t\t(.+?)\r\n\t\t\t\t', Temp) if m: found = m.group(1) item['SalgsType'] = found else: item['SalgsType'] = Temp item['KvmPris'] = site.select("td[5]/text()").extract() item['Rum'] = site.select("td[6]/text()").extract() item['Postnummer'] = site.select("td[7]/text()").extract() item['Boligtype'] = site.select("td[8]/text()").extract() item['Kvm'] = site.select("td[9]/text()").extract() item['Bygget'] = site.select("td[10]/text()").extract() items.append(item) return items 

Благодаря!

3 Solutions collect form web for “Ускорьте скребок”

Вот набор вещей, которые нужно попробовать:

  • используйте последнюю версию scrapy (если не используете уже)
  • проверьте, используются ли нестандартные средние
  • попробуйте увеличить параметры CONCURRENT_REQUESTS_PER_DOMAIN , CONCURRENT_REQUESTS ( docs )
  • отключить ведение журнала LOG_ENABLED = False ( docs )
  • попробуйте ввести элемент в цикле, а не собирать предметы в список items и возвращать их
  • использовать локальный кеш-DNS (см. этот поток )
  • проверьте, использует ли этот сайт порог загрузки и ограничивает скорость загрузки (см. эту тему )
  • log cpu и использование памяти во время паука – посмотрите, есть ли там проблемы
  • попробуйте запустить тот же паук под scrapyd service
  • посмотрите, будет ли grequests + lxml работать лучше (спросите, нужна ли вам какая-либо помощь в реализации этого решения)
  • попробуйте запустить Scrapy на pypy , см. Running Scrapy on PyPy

Надеюсь, это поможет.

Глядя на ваш код, я бы сказал, что большая часть времени тратится на сетевые запросы, а не на обработку ответов. Все советы, которые @alecxe предоставляет в своем ответе, применяются, но я бы предложил параметр HTTPCACHE_ENABLED , так как он кэширует запросы и избегает делать это во второй раз. Это помогло бы при следующих обходах и даже в автономном режиме. Подробнее см. В документах: http://doc.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.contrib.downloadermiddleware.httpcache

Я также работаю на веб-лоскуте, используя оптимизированный C #, и он заканчивается загрузкой процессора, поэтому я переключаюсь на C.

Анализ HTML удаляет кеш данных с процессором и почти уверен, что ваш процессор не использует SSE 4.2 вообще, поскольку вы можете получить доступ к этой функции только с помощью C / C ++.

Если вы выполняете математику, вы быстро вычисляете привязку, но не привязываетесь к памяти.

  • Не удается извлечь текст и найти все по BeautifulSoup
  • Scrapy с вложенным массивом
  • Как запустить Scrapy из сценария Python
  • Функция parse () python scrapy (), где возвращается возвращаемое значение?
  • Python - простой способ очистить Google, загрузить лучшие N хитов (целые .html документы) для данного поиска?
  • Скрученная ошибка Python - проблемы с скрипом
  • scrapy от выхода скрипта в json
  • Как прочитать файл, загруженный selenium webdriver в python
  •  
    Interesting Posts for Van-Lav

    sklearn: TFIDF Transformer: Как получить значения tf-idf данных слов в документе

    Проверьте требования к поддержке python 3

    django просмотров – 502 плохой шлюз

    Использование OpenCV detectMultiScale для поиска моего лица

    Как я могу гарантировать, что re.findall () останавливается в нужном месте?

    Python на моем Mac – это беспорядок, помогите мне удалить то, что мне не нужно

    В Python, как работает цикл for с диапазоном?

    Получите идентификатор учетной записи AWS от Boto

    Разделить список по разделителю кортежей

    Как установить django 1.4

    Что такое generator.throw () хорошо для?

    Как поместить текст в строку ввода: как запросить ввод пользователя в командной строке, предоставляя ответ «по умолчанию», который пользователь может редактировать или удалять?

    Как печатать класс или объекты класса с помощью print ()?

    Счетчики с высокой совместимостью без осколков

    Каков самый быстрый способ создания эскизов изображений в Python?

    Python - лучший язык программирования в мире.