scrapy-splash不会使用CrawlerSpider递归爬行

时间:2016-11-14 09:16:15

标签: scrapy splash scrapy-splash

我在我的CrawlerSpider process_request中集成了scrapy-splash,如下所示:

 def process_request(self,request):
    request.meta['splash']={
        'args': {
            # set rendering arguments here
            'html': 1,
        }
    }
    return request

问题是抓取只是在第一个深度呈现网址, 我想知道即使使用错误的http代码或重定向的响应,我怎么能得到响应;

提前致谢,

1 个答案:

答案 0 :(得分:0)

您的问题可能与此有关:https://github.com/scrapy-plugins/scrapy-splash/issues/92

简而言之,尝试将其添加到解析回调函数中:

def parse_item(self, response):
    """Parse response into item also create new requests."""

    page = RescrapItem()
    ...
    yield page

    if isinstance(response, (HtmlResponse, SplashTextResponse)):
        seen = set()
        for n, rule in enumerate(self._rules):
            links = [lnk for lnk in rule.link_extractor.extract_links(response)
                     if lnk not in seen]
            if links and rule.process_links:
                links = rule.process_links(links)
            for link in links:
                seen.add(link)
                r = SplashRequest(url=link.url, callback=self._response_downloaded, 
                                              args=SPLASH_RENDER_ARGS)
                r.meta.update(rule=rule, link_text=link.text)
                yield rule.process_request(r)

万一,你想知道为什么这可以返回项目和新请求。这是来自文档:https://doc.scrapy.org/en/latest/topics/spiders.html

  

在回调函数中,您解析响应(网页)并返回   或者提取数据的dicts,项目对象,请求对象,或者   可迭代这些对象。这些请求还将包含回调   (也许是相同的)然后由Scrapy下载然后他们的   由指定的回调处理的响应。