【问题标题】:Scrapy and GearmanScrapy 和 Gearman
【发布时间】:2016-02-19 01:22:02
【问题描述】:

我正在使用 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()

这是我的 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

我能够从 worker 和 spider 打印一个或多个 URL,并确保它们在第一次工作运​​行和第二次非工作运行时被传递。我花了 2 天时间,但没有得到任何结果。我将不胜感激。

【问题讨论】:

  • 让我提供更多细节。我没有嫁给scrapy。此时,我愿意拿出来,但我还没有找到更好的东西。另一方面,Gearman 工作得很好。这是我想要完成的。我想构建一个蜘蛛,将它部署到多台机器上,启动多个齿轮工作人员以接收 URL,并让工作人员调用蜘蛛从脚本中抓取。我已经能够用我拥有的所有其他东西(外部 API)来做到这一点,但是 scrapy 继续失败:( 任何方向都有助于包括一个 scrapy 的替代方案。
  • 我也研究了scrapyd。看起来它更适合广泛爬行。在 scrapy.cfg 中加载目标列表并关闭它。我的 URL 由用户加载,只有那些页面被爬取,这些 url 不断变化,这就是为什么我宁愿通过队列喂它们。

标签: python scrapy scrapy-spider gearman python-gearman


【解决方案1】:

好吧,我决定放弃 Scrapy。 我环顾四周,每个人都不断指出扭曲反应堆的局限性。我决定构建自己的爬虫,而不是与框架抗争,它非常成功地满足了我的需求。我能够启动多个齿轮工作人员并使用我构建的刮板在服务器场中同时刮取数据。

如果有人有兴趣,我从这篇简单的文章开始构建刮板。 我使用 gearman 客户端查询数据库并将多个 url 发送给工作人员,工作人员抓取 URL 并将更新查询返回给数据库。成功!! :)

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

【讨论】:

    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多