Обратный вызов запроса Scrapy не входит в следующую функцию - PullRequest
0 голосов
/ 27 февраля 2020

Вот мой код:

import scrapy

class BookingSpider(scrapy.Spider):
    name = 'booking-spider'
    allowed_domains = ['booking.com']
    start_urls = [
        'https://www.booking.com/country.de.html?aid=356980;label=gog235jc-1DCAIoLDgcSAdYA2gsiAEBmAEHuAEHyAEP2AED6AEB'
        '-AECiAIBqAIDuAK7q7DyBcACAQ;sid=8de61678ac61d10a89c13a3941fd3dcd'
    ]

    # get country page
    def parse(self, response):

        for countryurl in response.xpath('//a[contains(text(),"Schweiz")]/@href'):
            url = response.urljoin(countryurl.extract())
            print("COUNTRYURL", url)
            yield scrapy.Request(url, callback=self.parse_country)

    # get page of all hotels in a country
    def parse_country(self, response):

        for hotelsurl in response.xpath('//a[@class="bui-button bui-button--secondary"]/@href'):
            url = response.urljoin(hotelsurl.extract())
            print("HOTELURL", url)
            yield scrapy.Request(url, callback=self.parse_hotel)

    def parse_hotel(self, response):

        print("entering parse_hotel")
        hotelurl = response.xpath('//*[(@ id = "hp_hotel_name")]')
        print("URL", hotelurl)

Это не go в функции parse_hotel. Не могу понять почему? Где моя ошибка? Заранее благодарю за ваши предложения!

1 Ответ

0 голосов
/ 28 февраля 2020

Проблема в этой строке

response.xpath('//a[@class="bui-button bui-button--secondary"]/@href')

Здесь ваш XPATH извлекает такие URL:

https://www.booking.com/searchresults.de.html?dest_id=204;dest_type=country&

Но они должны быть примерно такими:

https://www.booking.com/searchresults.de.html?label=gen173nr-1DCAIoLDgcSAdYBGhSiAEBmAEHuAEHyAEM2AED6AEB-AECiAIBqAIDuAKz_uDyBcACAQ;sid=a3807e20e99c61282850cfdf02041c07;dest_id=204;dest_type=country&

Из-за этого ваш паук пытается открыть ту же веб-страницу, и он блокируется Scrapy Dupefilter. Вот причина, по которой обратный вызов не вызывается.

Я думаю, отсутствующая часть в URL генерируется JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...