对于我试图刮掉的页面,我有时会在响应中得到一个“占位符”页面,其中包含一些自动重新加载的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然而,当重试逻辑被调用并发出新请求时,它们包含的页面和链接似乎不会被爬行或刮掉。我的想法是,通过使用self.parse ( CrawlSpider使用的)应用爬行规则和dont_filter=True,我可以避免重复的过滤器。但是,使用DUPEFILTER_DEBUG = True,我可以看到重试请求被过滤掉了。
我是不是遗漏了什么,还是有更好的方法来处理?如果可能的话,我希望避免使用类似splash之类的东西来执行动态js呈现的复杂性,而且这种情况只会间歇性地发生。
发布于 2015-09-19 04:09:15
我会考虑使用http://doc.scrapy.org/en/1.0/topics/downloader-middleware.html#writing-your-own-downloader-middleware --类似于内建一。
示例实现(未测试):
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别忘了激活它。
https://stackoverflow.com/questions/32664022
复制相似问题