python – Scrapy CrawlSpider重试刮
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Scrapy CrawlSpider重试刮,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1461字,纯文字阅读大概需要3分钟。
内容图文
对于我试图抓取的页面,我有时会在我的响应中找到一个“占位符”页面,其中包含一些自动加载的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.parse和dont_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重试刮全部内容,希望文章能够帮你解决python – Scrapy CrawlSpider重试刮所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。