gpt4 book ai didi

python - Scrapy CrawlSpider 重试抓取

转载 作者:行者123 更新时间:2023-11-28 21:49:59 26 4
gpt4 key购买 nike

对于我试图抓取的页面,我有时会在我的响应中返回一个“占位符”页面,其中包含一些自动重新加载的 javascript,直到它获得真正的页面。我可以检测到这种情况何时发生,并且我想重试下载和抓取页面。我在 CrawlSpider 中使用的逻辑类似于:

def parse_page(self, response):
url = response.url

# Check to make sure the page is loaded
if 'var PageIsLoaded = false;' in response.body:
self.logger.warning('parse_page encountered an incomplete rendering of {}'.format(url))
yield Request(url, self.parse, dont_filter=True)
return

...
# Normal parsing logic

但是,似乎在调用重试逻辑并发出新请求时,页面及其包含的链接不会被抓取或抓取。我的想法是,通过使用 CrawlSpider 用来应用爬网规则的 self.parsedont_filter=True,我可以避免重复的过滤器。但是,对于 DUPEFILTER_DEBUG = True,我可以看到重试请求被过滤掉了。

我是不是遗漏了什么,或者有更好的方法来处理这个问题吗?如果可能的话,我想避免使用诸如 splash 之类的东西进行动态 js 渲染的复杂性,这只会间歇性地发生。

最佳答案

我会考虑拥有一个 custom Retry Middleware相反 - 类似于 built-in one .

示例实现(未测试):

import logging

logger = logging.getLogger(__name__)


class RetryMiddleware(object):
def process_response(self, request, response, spider):
if 'var PageIsLoaded = false;' in response.body:
logger.warning('parse_page encountered an incomplete rendering of {}'.format(response.url))
return self._retry(request) or response

return response

def _retry(self, request):
logger.debug("Retrying %(request)s", {'request': request})

retryreq = request.copy()
retryreq.dont_filter = True
return retryreq

别忘了 activate

关于python - Scrapy CrawlSpider 重试抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32664022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com