簡體   English   中英

Scrapy和Gearman

[英]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()

這是我的Spider的代碼。

    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

我能夠打印出工作程序和Spider的一個或多個URL,並確保它們在第一個正常運行和第二個非正常運行中獲得通過。 我花了兩天時間,卻一無所獲。 我將不勝感激任何指針。

好吧,我決定放棄Scrapy。 我環顧四周,每個人都不斷指出扭曲反應堆的局限性。 我決定不開發框架,而是決定構建自己的刮板,並且對於我所需要的而言,它非常成功。 我能夠啟動多個齒輪工,並使用我構建的刮板在服務器場中同時刮刮數據。

如果有人感興趣,我將從這篇簡單的文章開始構建刮板。 我使用Gearman客戶端查詢數據庫並將多個URL發送給工作人員,該工作人員抓取URL並向數據庫進行更新查詢。 成功!! :)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM