Scrapy:CrawlSpider在为其他域工作时未执行特定域的回调

8ljdwjyq  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(127)

我正试图从https://www.oddsportal.com/中删除NBA的历史数据。
使用下面的代码,回调不会执行。但是,当我将oddsportal.com更改为nba.com时,我没有遇到任何问题。
我不知道这是为什么。建议?

import scrapy
from scrapy.loader import ItemLoader
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from nba_scrapper.items import NbaScrapperItem

import re

class GetGameSpider(CrawlSpider):
    name = 'get_game_spider'
    allowed_domains = ['oddsportal.com']
    start_urls = ['https://www.oddsportal.com']

    rules = (
        Rule(callback='parse_games',follow=True),
    )

    def parse_games(self, response):
        l = ItemLoader(item=NbaScrapperItem(), selector=response)

        this_item = l.load_item()
        yield this_item
yzckvree

yzckvree1#

Scrapy首先在spider中查找start_requests方法,如果不存在这样的方法,则查找start_requests,并开始使用默认的解析方法为列表中的每个url创建请求对象,因为您的spider使用的是start_urls列表,所以scrapy会自动假定第一个回调函数应该是parse方法。因此,当它发现没有时,它就放弃了。
有两个简单的补救办法。
1.将parse_games方法的名称更改为parse
1.实现start_requests方法并显式指示每个请求使用parse_games方法作为回调。
例如:

class GetGameSpider(CrawlSpider):
    name = 'get_game_spider'
    allowed_domains = ['oddsportal.com']

    def start_requests(self):
        urls = ['https://www.oddsportal.com']
        for url in urls:
            yield scrapy.Request(url, callback=self.parse_games)

    def parse_games(self, response):
        l = ItemLoader(item=NbaScrapperItem(), selector=response)
        this_item = l.load_item()
        yield this_item

相关问题