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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (30)

试图让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个起始网址,请确保此代码正常工作。如果我添加了其中一个,蜘蛛只抓取起始页面。

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:如果我在课堂之外移动解析函数,它没有问题。这个问题是我无法输出任何东西。在类中具有解析功能(即使它只是填写了通行证)导致仅请求起始页和robot.txt

提问于
用户回答回答于

不太确定为什么,但是如果我将规则回调更改为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 ,
        }

扫码关注云+社区

领取腾讯云代金券