【问题标题】:Scrapy Crawler multiple domains completes with no errors after retrieving source pages检索源页面后,Scrapy Crawler 多个域完成且没有错误
【发布时间】:2018-11-12 23:57:26
【问题描述】:

试图让 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 函数移到类之外,它就没有问题。问题是我不能以这种方式输出任何东西。在类中使用 parse 函数(即使它只是用 pass 填充)导致只请求起始页和 robots.txt

【问题讨论】:

    标签: python-3.x scrapy


    【解决方案1】:

    不太确定为什么,但如果我将规则回调更改为 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 的评论以获取解释。我显然没有足够仔细地查看文档。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 试一试。同样的结果。它实际上并没有执行类中定义的解析函数中的内容,并在抓取“start_urls”后退出。
      • 看到CrawlSpider的代码,这种行为似乎是意料之中的。他们在 CrawlSpider 类的 init 中编译规则,并制作您传递的方法名称的可调用对象。 github.com/scrapy/scrapy/blob/master/scrapy/spiders/crawl.py 如果您传递“parse”,它将被重定向到 CrawlSpider 类中的 parse 方法,而不是您的实现类中的方法。即使在官方文档中,他们也使用了不同名称的方法(parse_item)doc.scrapy.org/en/latest/topics/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 2021-11-14
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      相关资源
      最近更新 更多