Scrapy深度爬行不起作用

时间:2017-02-28 17:15:15

标签: html hyperlink web-scraping scrapy web-crawler

我目前正在尝试使用scrapy创建一个小型网络报废原型。 我目前的问题与链接提取和跟踪有关。

我试图让scrapy浏览页面并查找页面链接(暂时不是图片和其他内容),但我不知道如何正确地对其进行参数化。

这是我使用的蜘蛛:

class DefaultSpider(CrawlSpider):

    name = "default"
    session_id = -1
    rules = [Rule(LinkExtractor(allow=()),callback='parse', follow=True)]

def start_requests(self):
     #not relevent code that gives an URL list to be scrawled
     for url in listurl:

     #make scrappy follow only the current domain url.
     self.rules[0].allow=url
        yield scrapy.Request(url=url, callback=self.parse)

def parse(self, response):
     page = Website(response.url,response.text)
     DBInterface.store(page)

蜘蛛似乎没有在页面中找到任何链接。我想我没有以正确的方式做到这一点。我尝试将另一个函数作为回调而不是parse方法。 (也改变规则回调参数)

def processlinks (self,response)
    page = Website(response.url,response.text)
    DBInterface.store(page)

编辑:更新代码+标题以便正确理解..

2 个答案:

答案 0 :(得分:0)

CrawlSpider是一种特殊的蜘蛛,可以为关注链接添加rules支持(不是通过提取它们)。

要让此蜘蛛工作,您start_requestsparse方法can't override

关于获取链接,我建议使用LinkExtractor使提取更清洁:

来自scrapy的

def find_links(self, response):
    for link in LinkExtractor().extract_links(response):
        logging.info('Extracting new url' + link.url)
        yield scrapy.Request(link.url, callback=self.insert_linkDB)

LinkExtractor的更多信息和更新信息in the documentation

答案 1 :(得分:0)

使CrawlSpider处理初始网址的方式与随后使用LinkExtractor提取的方式相同,这有点棘手,这就是您想要的。问题是,不应为您手动启动的任何请求定义自定义回调,因为这会阻止LinkExtractor工作。另一方面,您希望为每个已爬网的URL执行某些操作,包括初始URL。对于使用LinkExtractor提取的网址,您可以在定义规则时提供回调,但这显然不适用于未使用这些规则提取的初始网址。为此,Scrapy提供了另一种方法parse_start_url(response),您可以并且应该覆盖它。因此,在您的情况下,以下内容可以满足您的需求:

class DefaultSpider(CrawlSpider):

    name = "default"
    session_id = -1
    rules = [Rule(LinkExtractor(allow=()),callback='parse_results', follow=True)]

def start_requests(self):
     #not relevent code that gives an URL list to be scrawled
     for url in listurl:

     #make scrappy follow only the current domain url.
     self.rules[0].allow=url
        yield scrapy.Request(url=url)

def parse_start_url(self, response):
     self.parse_results(response)

def parse_results(self, response):
     page = Website(response.url,response.text)
     DBInterface.store(page)