2017-02-28 70 views
1

我目前正在尝试创建一个使用scrapy的小型web报废原型。 我目前的问题与链接提取和跟随有关。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) 

蜘蛛。我想我没有按照正确的方式去做。我试图将另一个函数作为回调而不是解析方法。 (改变规则回调参数太)

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

编辑:更新代码+正确认识冠军。

回答

0

CrawlSpider是一种特殊的蜘蛛,增加了rules支持跟随链接(不BTW提取它们) 。

对于这种蜘蛛的工作,你can't overridestart_requestsparse方法

关于取得联系,我会建议使用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

+0

我理解你的主张,但我想你是误会了我的意思,我适当编辑的标题和我的代码,以使其更清晰。我想做一个深入的感谢! – Neil

+1

也许你没有读过我的答案的第一部分,但是当使用'CrawlSpider'时,你不能重写'start_requests'和'parse'方法。我一直在你的代码中看到这些,所以这可能是你的蜘蛛不工作的原因。 – eLRuLL

+0

“我试图将另一个函数作为回调而不是解析方法(更改规则回调参数)”我引用。如果我重写解析或使用另一个方法作为回调,它的行为方式相同。 – Neil

0

使CrawlSpider处理初始URL的方式与随后使用LinkExtractor进行提取的方式相同,这在这里是您想要的,这有点棘手。问题在于不应该为您手动启动的任何请求定义自定义回调,因为它会阻止LinkExtractor的工作。另一方面,您希望为每个抓取的网址执行一些操作,包括初始网址。对于使用LinkExtractor提取的这些URL,可以在定义规则时提供回调,但对于未使用这些规则提取的初始URL,这显然不起作用。为此,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)