Я пытаюсь использовать ссылки предыдущего года, используя 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 году и не идет в предыдущие годы. В чем проблема?
Проблема в том, что функция 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)
Вам необходимо отправить запрос на 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)