Scrapy по предыдущим ссылкам

1

Я пытаюсь использовать ссылки предыдущего года, используя scrapy, начиная с url ' https://umanity.jp/en/racedata/race_6.php '. В этом URL-адресе текущий год - 2018, и есть предыдущая кнопка. Когда вы нажимаете эту кнопку, она переходит к 2017, 2016... до 2000 года. Но scrapy spider я записывал остановки в 2017 году. Мой код:

import scrapy


class RaceSpider(scrapy.Spider):
    name = 'test'
    allowed_domains = ['umanity.jp']
    start_urls = ['https://umanity.jp/en/racedata/race_6.php']  # start to scrape from this url

    def parse(self, response):
        previous_year_btn = response.xpath('//div[@class="newslist_year_select m_bottom5"]/*[1]')
        if previous_year_btn.extract_first()[1] == 'a':
            href = previous_year_btn.xpath('./@href').extract_first()
            follow_link = response.urljoin(href)
            yield scrapy.Request(follow_link, self.parse_years)

    def parse_years(self, response):
        print(response.url)  # prints only year 2017

Не могу понять, почему он останавливается в 2017 году и не идет в предыдущие годы. В чем проблема?

Теги:
web-scraping
scrapy
scrapy-spider

2 ответа

1
Лучший ответ

Проблема в том, что функция parse_years не ищет никаких дополнительных ссылок.

Переключатель:
yield scrapy.Request(follow_link, self.parse_years) до
yield scrapy.Request(follow_link, self.parse) и все годы найдены, потому что функция parse продолжает находить ссылки.

Если вам нужны две отдельные функции (возможно, parse_years чтобы что-то сделать с данными и parse чтобы найти следующую ссылку), это выполнимо.

parse_years просто понадобится:

def parse_years(self, response):
    print(response.url)  # prints only year 2017
    yield from self.parse(response)
1

Вам необходимо отправить запрос на self.parse; не self.parse_years для достижения результатов. Я попытался выгнать ваш hardcoded index из xpaths, чтобы сделать его менее склонным к перерыву. Попробуйте подход ниже:

class RaceSpider(scrapy.Spider):
    name = 'test'
    allowed_domains = ['umanity.jp']
    start_urls = ['https://umanity.jp/en/racedata/race_6.php']  # start to scrape from this url

    def parse(self, response):
        previous_year_btn = response.xpath('//div[contains(@class,"newslist_year_select")]/a')
        if 'race_prev.gif' in previous_year_btn.xpath('.//img/@src').extract_first():
            href = previous_year_btn.xpath('./@href').extract_first()
            yield scrapy.Request(response.urljoin(href), self.parse)
            print(response.url)

Однако, сохраняя второй способ жизни:

def parse(self, response):      
    yield scrapy.Request(response.url, self.parse_years)  #this is the fix

    previous_year_btn = response.xpath('//div[contains(@class,"newslist_year_select")]/a')
    if 'race_prev.gif' in previous_year_btn.xpath('.//img/@src').extract_first():
        href = previous_year_btn.xpath('./@href').extract_first()
        yield scrapy.Request(response.urljoin(href), self.parse)

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню