Scrapy and Gearman
Я использую Scrapy 1.0.5 и Gearman для создания распределенных пауков. Идея состоит в том, чтобы создать паука, вызвать его из сценария рабочего-механика и передать 20 URL-адресов за раз, чтобы сканировать его с клиента-механика на рабочего, а затем на паука.
Я могу запустить работника, передать ему 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 дня и ничего с этим не получил. Буду признателен за любые указатели.
1 ответ
Ну, я решил отказаться от Scrapy. Я много осматривался, и все продолжали указывать на ограничение скрученного реактора. Вместо того, чтобы бороться со структурой, я решил построить свой собственный скребок, и он оказался очень успешным для того, что мне было нужно. Я могу раскрутить несколько рабочих-механиков и использовать созданный мной скребок для одновременной очистки данных в ферме серверов.
Если кому-то интересно, я начал с этой простой статьи по сборке скребка. Я использую клиент Gearman для запроса к БД и отправки нескольких URL-адресов работнику, рабочий очищает URL-адреса и выполняет запрос на обновление обратно в БД. Успех!!:)