Html 如何修复刮擦深度爬行不工作

Html 如何修复刮擦深度爬行不工作,html,hyperlink,web-scraping,scrapy,web-crawler,Html,Hyperlink,Web Scraping,Scrapy,Web Crawler,我目前正在尝试使用scrapy创建一个小型web抓取原型。 我当前的问题与链接提取和跟踪有关 我正在尝试创建scrapy浏览页面,并找到指向页面的链接(目前还没有图像和其他内容),但我不知道如何正确地设置参数 这是我正在使用的蜘蛛: class DefaultSpider(CrawlSpider): name = "default" session_id = -1 rules = [Rule(LinkExtractor(allow=()),callb

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

我正在尝试创建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)

蜘蛛似乎在页面中找不到任何链接。我想我做得不对。我尝试将另一个函数作为回调函数而不是parse方法。(同时更改规则回调参数)


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

爬行爬行器
是一种特殊的爬行器,它添加了
规则
支持跟踪链接(顺便说一句,不提取链接)

为了让这个爬行器工作,您需要使用
start\u请求
parse
方法

关于获取链接,我建议使用
LinkExtractor
,这会使提取更干净:

发痒

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
的更多更新信息可用

爬行蜘蛛
是一种特殊的蜘蛛,它添加了
规则
支持跟踪链接(顺便说一句,不提取链接)

为了让这个爬行器工作,您需要使用
start\u请求
parse
方法

关于获取链接,我建议使用
LinkExtractor
,这会使提取更干净:

发痒

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
的更多更新信息可用

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

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)

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

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)

我理解你的主张,但我想你误解了我的意思,我正确地编辑了标题和代码,以便让它更清楚。我想做一个深入的感谢!可能您没有阅读我答案的第一部分,但是当使用
CrawlSpider
时,您不能覆盖
start\u请求
parse
方法。我一直在你的代码中看到这些,所以这可能是你的爬行器无法工作的原因。“我尝试将另一个函数作为回调函数而不是解析方法(也更改了规则回调参数)”我引用。如果我重写解析或使用另一个方法作为回调,它的作用是相同的。我理解你的主张,但我认为你误解了我的意思,我正确地编辑了标题和代码以使其更清楚。我想做一个深入的感谢!可能您没有阅读我答案的第一部分,但是当使用
CrawlSpider
时,您不能覆盖
start\u请求
parse
方法。我一直在你的代码中看到这些,所以这可能是你的爬行器无法工作的原因。“我尝试将另一个函数作为回调函数而不是解析方法(也更改了规则回调参数)”我引用。如果我重写解析或使用另一个方法作为回调,它的作用是相同的。