Скрэпи и Гирман

Я использую Scrapy 1.0.5 и Gearman для создания распределенных пауков. Идея состоит в том, чтобы создать паука, вызвать его из сценария рабочего механизма Gearman и передать 20 URL-адресов за раз, чтобы сканировать из клиента Gearman рабочему, а затем пауку.

Я могу запустить работника, передать ему URL-адреса от клиента к пауку для сканирования. Первый URL-адрес или массив URL-адресов подбираются и сканируются. Когда паук готов, я не могу использовать его повторно. Я получаю сообщение журнала, что паук закрыт. Когда я снова запускаю клиент, паук снова открывается, но не сканирует.

Вот мой рабочий:

import gearman
import json
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


gm_worker = gearman.GearmanWorker(['localhost:4730'])

def task_listener_reverse(gearman_worker, gearman_job):
    process = CrawlerProcess(get_project_settings())

    data = json.loads(gearman_job.data)
    if(data['vendor_name'] == 'walmart'):
        process.crawl('walmart', url=data['url_list'])
        process.start() # the script will block here until the crawling is finished
        return 'completed'

# gm_worker.set_client_id is optional
gm_worker.set_client_id('python-worker')
gm_worker.register_task('reverse', task_listener_reverse)

# Enter our work loop and call gm_worker.after_poll() after each time we timeout/see socket activity
gm_worker.work()

Вот код моего Паука.

    from crawler.items import CrawlerItemLoader
from scrapy.spiders import Spider




class WalmartSpider(Spider):
    name = "walmart"

    def __init__(self, **kw):
        super(WalmartSpider, self).__init__(**kw)
        self.start_urls = kw.get('url')
        self.allowed_domains = ["walmart.com"]

    def parse(self, response):

        item = CrawlerItemLoader(response=response)

        item.add_value('url', response.url)


        #Title
        item.add_xpath('title', '//div/h1/span/text()')

        if(response.xpath('//div/h1/span/text()')):
            title = response.xpath('//div/h1/span/text()')


        item.add_value('title', title)

        yield item.load_item()

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

При втором запуске паук открывается и никаких результатов. Это то, что я возвращаю, и это останавливается

    2016-02-19 01:16:30 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2016-02-19 01:16:30 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2016-02-19 01:16:30 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2016-02-19 01:16:30 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2016-02-19 01:16:30 [scrapy] INFO: Enabled item pipelines: MySQLStorePipeline
2016-02-19 01:16:30 [scrapy] INFO: Enabled item pipelines: MySQLStorePipeline
2016-02-19 01:16:30 [scrapy] INFO: Spider opened
2016-02-19 01:16:30 [scrapy] INFO: Spider opened
2016-02-19 01:16:30 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-02-19 01:16:30 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-02-19 01:16:30 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6047
2016-02-19 01:16:30 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6047

Я смог распечатать URL-адрес или URL-адреса от рабочего и паука и убедиться, что они были переданы при первом рабочем и втором нерабочем запусках. Я потратил 2 дня и ничего не добился с ним. Буду признателен за любые указатели.


person user1135662    schedule 19.02.2016    source источник
comment
Позвольте мне предоставить более подробную информацию. Я не женат на Скрэпи. На данный момент я готов взять его, но я пока не нашел ничего лучше. С другой стороны, Gearman работал довольно хорошо. Вот чего я пытаюсь добиться. Я хотел бы создать паука, развернуть его на нескольких машинах, запустить несколько рабочих передач Gearman для получения URL-адресов и заставить рабочих вызывать паука для сканирования из сценария. Я смог сделать это со всем остальным, что у меня есть (внешние API), но scrapy продолжает давать сбой :( Любое направление поможет, включая альтернативу scrapy.   -  person user1135662    schedule 21.02.2016
comment
Я также посмотрел в scrapyd. Похоже, это больше для широкого ползания. Загрузите список целей в scrapy.cfg и вперед. Мои URL-адреса загружаются пользователями, и сканируются только эти страницы, эти URL-адреса постоянно меняются, и поэтому я предпочел бы кормить их через очередь.   -  person user1135662    schedule 21.02.2016


Ответы (1)


Ну, я решил отказаться от Scrapy. Я много оглядывался, и все указывали на ограниченность искривленного реактора. Вместо того, чтобы бороться с фреймворком, я решил создать свой собственный парсер, и он оказался очень успешным для того, что мне было нужно. Я могу запустить несколько рабочих передач Gearman и использовать парсер, который я создал, для одновременной очистки данных на ферме серверов.

Если кому-то интересно, я начал с этой простой статьи, чтобы построить парсер. Я использую клиент gearman для запроса БД и отправки нескольких URL-адресов рабочему, рабочий очищает URL-адреса и выполняет запрос на обновление обратно в БД. Успех!! :)

http://docs.python-guide.org/en/latest/scenarios/scrape/

person user1135662    schedule 08.03.2016