首页 文章

Scrapy Crawler多个域在检索源页面后完成且没有错误

提问于
浏览
1

试图让Scrapy抓取多个域 . 我让它简单地工作,但有些事情发生了变化,我不知道是什么 . 我的理解是“CrawlSpider”有关于要遵循的链接的规则应遵循任何允许的链接,直到深度设置或域耗尽 .

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class BbcSpider(CrawlSpider):
    name = 'bbcnews'
    allowed_domains = [
        'www.bbc.com']

    start_urls = [
        'http://www.bbc.com/news']

    rules = (Rule(LinkExtractor(allow=()), callback='parse', follow=True),)

    def parse(self, response):
        print(response.url)

如果我想抓取多个域,我会更改“allowed_domains”和“start_urls”

allowed_domains = [
        'www.bbc.com',
        'www.voanews.com']

    start_urls = [
        'http://www.bbc.com/news',
        'https://www.voanews.com/p/6290.html']

但是,在我运行“scrapy crawl bbcnews”的两种情况下,爬虫只检索源站点然后退出 .

编辑:

好的,只要只有1个域和1个起始URL,此代码就可以正常工作 . 如果我添加多个,蜘蛛只会抓取起始页面 .

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class BbcfarsiSpider(CrawlSpider):
    name = 'bbcfarsi'
    allowed_domains = ['bbc.com']
    start_urls = ['http://bbc.com/persian']
    rules = (Rule(LinkExtractor(allow=('persian'),), callback='parse', follow=True), )

def parse(self, response):
    pass

编辑#2:如果我将解析函数移到课外,它没有问题 . 问题是我不能以那种方式输出任何东西 . 在类中具有parse函数(即使它只是填充了pass)导致只请求起始页和robot.txt

2 回答

  • 0

    我想当你使用 callback='parse' 时,它会回到内置的解析方法 . 您可以尝试使用 callback='self.parse' 吗?这可能会触发您的解析方法而不是默认方法

  • 0

    不确定为什么,但如果我将规则回调更改为callback ='parse_link'并重命名该函数以匹配,一切正常 . 代码看起来应该如下所示:

    import scrapy
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy.linkextractors import LinkExtractor
    
    class BbcSpider(CrawlSpider):
        name = 'bbcnews'
        allowed_domains = [
            'www.bbc.com',
            'www.voanews.com',]
    
        start_urls = [
            'http://www.bbc.com/news',
            'https://www.voanews.com/p/6290.html',]
    
        rules = (Rule(LinkExtractor(allow=()), callback='parse_link', follow=True),)
    
        def parse_link(self, response):
            yield {
                'url' : response.url ,
            }
    

    编辑:请参阅下面的Chetan mishra的评论以获得解释 . 我显然没有仔细查看文档 .

相关问题