【问题标题】:Scrapy crawling fails if too many spiders are used (Crawled 0 pages)如果使用了太多的蜘蛛,Scrapy 抓取会失败(抓取 0 页)
【发布时间】:2019-06-22 20:09:04
【问题描述】:

我正在尝试从流行的转售平台上抓取价格。对于每个项目,我用不同的搜索标签实例化同一个蜘蛛。少于大约 300 个项目的过程工作得非常好,仅此而已。 每个蜘蛛都会在关闭之前将其结果写入文档,因此没有特殊的管道或产生层次结构。

我尝试了不同的方法,例如

    for c in collection:
        for item in c.get_items():
            crawler = Pricecrawler(c.collection_id, item.id, item.name)
            print(crawler)
            process.crawl(crawler, collection_id=c.collection_id, item_id=item.id, search=(item.name))
    process.start()

或者

    runner = CrawlerRunner(settings)
    d = []
    for c in collection:
        for item in c.get_items():
            crawler = Pricecrawler(c.collection_id, item.id, item.name)
            print(crawler)
            runner.crawl(crawler, collection_id=c.collection_id, item_id=item.id, search=(""+item.name))
            d = runner.join()
            d.addBoth(lambda _: reactor.stop())
    reactor.run()

(对于较少数量的蜘蛛,这两个工作正常,另一个尝试使用子进程发出scrapy命令行命令不起作用)。

在过去的两周里,我尝试了不同的设置和插件以不同的组合和不同的值,结果没有任何明显的变化。 (虽然我当然没有尝试过所有可能的组合) 设置和插件,如

#settings.set('USER_AGENT', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)')
#settings.set('TELNETCONSOLE_ENABLED', 'False')
#settings.set('TELNETCONSOLE_PORT', None)
#settings.set('CONCURRENT_REQUESTS', 8)
#settings.set('DEPTH_PRIORITY', 8)
#settings.set('DOWNLOAD_TIMEOUT', 360)
#settings.set('REACTOR_THREADPOOL_MAXSIZE', 20)
#settings.set('COOKIES_ENABLED', False)
#settings.set('DOWNLOAD_DELAY', 2)
#settings.set('DEPTH_LIMIT', 10)
#settings.set('DOWNLOADER_MIDDLEWARES', {'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
#                                        'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400})

#settings.set('PROXY_POOL_ENABLED', True)
#settings.set('DOWNLOADER_MIDDLEWARES', {'scrapy_proxy_pool.middlewares.ProxyPoolMiddleware': 610,
#               'scrapy_proxy_pool.middlewares.BanDetectionMiddleware': 620})

#settings.set('CONCURRENT_REQUESTS', 100)
#settings.set('CONCURRENT_REQUESTS_PER_DOMAIN', 100)
#settings.set('DEPTH_PRIORITY', 1)
#settings.set('DOWNLOAD_TIMEOUT', 360)

等等……

蜘蛛被这样实例化:

    for c in collection:
        for item in c.get_items():
            crawler = Pricecrawler(c.collection_id, item.id, item.name)
            print(crawler)
            process.crawl(crawler, collection_id=c.collection_id, item_id=item.id, search=(item.name))
    process.start()

由于爬虫本身正在工作,当从命令行发出或集合仅包含大约 300 个项目时,我认为应该没有问题。 上面的参数放在一起形成搜索标签。

超过 300 项的结果需要几分钟的时间

YYYY-MM-DD HH:MM:SS [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)

提前感谢您的宝贵时间。

不要忘记:我愿意接受新的方法来运行一个具有不同参数的蜘蛛的多个实例,即使它需要更多时间。

【问题讨论】:

    标签: python scrapy web-crawler


    【解决方案1】:

    注意CrawlerRunner.crawl方法的第一个参数不是Crawler的实例,而是一个类。

    尝试这样传递:

    process.crawl(
        Pricecrawler, 
        collection_id=c.collection_id, 
        item_id=item.id, 
        search=item.name
    )
    

    【讨论】:

    • 非常感谢!你是绝对正确的。可悲的是,解决这个问题并没有解决主要问题。然而,在 Linux 上使用 Anaconda 设置一个新的 scrapy 项目(而在 Windows 上设置了不工作的版本)修复了它。除了您更正的部分之外的代码仍然相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多