我目前正在尝试使用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)
编辑:更新代码+标题以便正确理解..
答案 0 :(得分:0)
CrawlSpider
是一种特殊的蜘蛛,可以为关注链接添加rules
支持(不是通过提取它们)。
要让此蜘蛛工作,您start_requests
和parse
方法can't override
关于获取链接,我建议使用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
的更多信息和更新信息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)