【问题标题】:Scrapy process less than succesfully crawledScrapy 进程未成功爬取
【发布时间】:2018-10-24 23:37:02
【问题描述】:

我的刮刀有 2 个问题:

  1. 尽管我使用'COOKIES_ENABLED': False 和旋转代理,它应该为每个请求提供不同的 IP,但一段时间后它会得到很多 302。我通过在几次 302s 后重新启动刮板解决了它

  2. 我看到 scraper 成功爬取的次数比它处理的要多得多,我无法用它做任何事情。在下面的示例中,我收到了 121 200 条响应,但只处理了 27

蜘蛛

class MySpider(Spider):
    name = 'MySpider'
    custom_settings = {
        'DOWNLOAD_DELAY': 0,
        'RETRY_TIMES': 1,
        'LOG_LEVEL': 'DEBUG',
        'CLOSESPIDER_ERRORCOUNT': 3,
        'COOKIES_ENABLED': False,
    }
    # I need to manually control when spider to stop, otherwise it runs forever
    handle_httpstatus_list = [301, 302]

    def start_requests(self):
        for row in self.df.itertuples():
            yield Request(
                url=row.link,
                callback=self.parse,
                priority=100
            )

    def close(self, reason):
        self.logger.info('TOTAL ADDED: %s' % self.added)

    def parse(self, r):
        if r.status == 302:
            # I need to manually control when spider to stop, otherwise it runs forever
            raise CloseSpider("")
        else:
            # do parsing stuff
                self.added += 1
                self.logger.info('{} left'.format(len(self.df[self.df['status'] == 0])))

输出

2018-08-08 12:24:24 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://mytarget.com/url1> (referer: None)
2018-08-08 12:24:24 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://mytarget.com/url2> (referer: None)
2018-08-08 12:24:24 [MySpider] INFO: 52451 left
2018-08-08 12:24:24 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://mytarget.com/url3> (referer: None)
2018-08-08 12:24:24 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://mytarget.com/url4> (referer: None)
2018-08-08 12:24:24 [MySpider] INFO: 52450 left
2018-08-08 12:24:24 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://mytarget.com/url4> (referer: None)


2018-08-08 12:24:37 [MySpider] INFO: TOTAL ADDED: 27
2018-08-08 12:24:37 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/exception_count': 1,
...
...
 'downloader/response_status_count/200': 121,
 'downloader/response_status_count/302': 4,

它成功抓取了很多(3x4x 倍于抓取)。 如何强制处理已抓取的所有内容?

我可以牺牲速度,但我不想浪费成功爬取的200s

【问题讨论】:

  • 如果你打开302指向的页面,你看到了什么?
  • 重定向到验证码页面
  • 好吧,我想这不是你能控制的。回复:缺少的 200,你确定你没有在解析的早期返回,在你增加 self.added 之前?
  • 1.我100%确定它没有被解析。 2.scrape真的很奇怪,但是不解析就退出了。我相信一定有办法控制它
  • 抱歉,我在代码中看不到任何会导致此问题的内容!

标签: python scrapy scrapy-spider


【解决方案1】:

当您CloseSpider() 时,调度程序可能没有将所有200 响应传递给parse() 方法。

记录并忽略302s,然后让蜘蛛完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多