Html 如何修复刮擦深度爬行不工作
我目前正在尝试使用scrapy创建一个小型web抓取原型。 我当前的问题与链接提取和跟踪有关 我正在尝试创建scrapy浏览页面,并找到指向页面的链接(目前还没有图像和其他内容),但我不知道如何正确地设置参数 这是我正在使用的蜘蛛: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
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
方法。我一直在你的代码中看到这些,所以这可能是你的爬行器无法工作的原因。“我尝试将另一个函数作为回调函数而不是解析方法(也更改了规则回调参数)”我引用。如果我重写解析或使用另一个方法作为回调,它的作用是相同的。