如果使用过多的蜘蛛,则抓取爬网将失败(已爬网0页)

时间:2019-06-22 20:09:04

标签: python scrapy web-crawler

我正试图从一个受欢迎的转售平台上获取价格。对于每个项目,我都使用不同的搜索标签实例化同一蜘蛛。少于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)

谢谢您的时间。

别忘了:即使需要更多时间,我仍然对如何运行一个具有不同参数的蜘蛛的多个实例持开放态度。

1 个答案:

答案 0 :(得分:1)

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

尝试像这样通过它:

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