【问题标题】:how to fix Scrapy in depth crawling not working如何修复 Scrapy 深度爬行不起作用
【发布时间】:2017-07-19 18:54:50
【问题描述】:

我目前正在尝试使用 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 scrapy 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)

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

【问题讨论】:

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


    【解决方案1】:

    CrawlSpider 是一种特殊的蜘蛛,它添加了rules 支持以跟踪链接(顺便说一句,不提取它们)。

    为了让这个蜘蛛工作,你 can't override start_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 获得

    【讨论】:

    • 我理解你的提议,但我认为你误解了我的意思,我正确地编辑了标题和我的代码以使其更清晰。我想做一个深入的谢谢!
    • 可能您没有阅读我回答的第一部分,但是在使用CrawlSpider 时,您无法覆盖start_requestsparse 方法。我一直在你的代码中看到这些,所以这可能是你的蜘蛛不工作的原因。
    • “我尝试将另一个函数作为回调而不是解析方法。(也更改规则回调参数)”我引用。如果我覆盖解析或使用其他方法作为回调,它的行为方式相同。
    【解决方案2】:

    CrawlSpider 处理初始 URL 的方式与随后使用 LinkExtractor 提取的 URL 相同,这有点棘手,这正是您想要的。问题是您不应该为您手动发起的任何请求定义自定义回调,因为它会阻止 LinkExtractor 工作。另一方面,您希望对每个已抓取的 URL 执行一些操作,包括初始 URL。对于使用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)
    

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多