首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复Scrapy在深度爬行中不起作用

如何修复Scrapy在深度爬行中不起作用
EN

Stack Overflow用户
提问于 2017-03-01 01:15:15
回答 2查看 504关注 0票数 1

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

我试图让scrapy浏览页面并找到指向页面的链接(目前不是图像和其他内容),但我不知道如何正确设置参数。

这是我正在使用的蜘蛛:

代码语言:javascript
运行
复制
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)

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

代码语言:javascript
运行
复制
def processlinks (self,response)
    page = Website(response.url,response.text)
    DBInterface.store(page)

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

EN

回答 2

Stack Overflow用户

发布于 2017-03-01 02:26:36

CrawlSpider是一种特殊的爬行器,它添加了rules支持来跟踪链接(而不是提取链接)。

要让这个爬行器工作,需要can't override start_requestsparse方法

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

来自scrapy

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2017-05-30 08:38:51

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

代码语言:javascript
运行
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42514918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档