Scrapy Load More Issue - CSS Селектор - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь очистить веб-сайт, на котором есть ссылка «Показать больше» внизу страницы, которая приводит к большему количеству данных для очистки. Вот ссылка на страницу сайта: https://untappd.com/v/total-wine-more/47792. Вот мой полный код:

class Untap(scrapy.Spider):
name = "Untappd"
allowed_domains = ["untappd.com"]
start_urls = [
    'https://untappd.com/v/total-wine-more/47792' #URL: Major liquor store chain with Towson location.
]

def parse(self, response):
    for beer_details in response.css('div.beer-details'):
        yield {
            'name': beer_details.css('h5 a::text').getall(), #Name of Beer
            'type': beer_details.css('h5 em::text').getall(), #Style of Beer
            'ABVIBUs': beer_details.css('h6 span::text').getall(), #ABV and IBU of Beer
            'Brewery': beer_details.css('h6 span a::text').getall() #Brewery that produced Beer  
        }
    load_more = response.css('a.yellow button more show-more-section track-click::attr(href)').get()
    if load_more is not None:
        load_more = response.urljoin(load_more)
        yield scrapy.Request(load_more, callback=self.parse)

Я пытался использовать нижний блок «load_more», чтобы продолжить загружать больше данных для очистки, но никакие входные данные с HTML с веб-сайта не работали.

Вот HTML с веб-сайта.

<a href="javascript:void(0);" class="yellow button more show-more-section track-click" data-track="venue" data-href=":moremenu" data-section-id="140216931" data-venue-id="47792" data-menu-id="38988361">Show More Beers</a>

Я хочу, чтобы паук почистил то, что показано на сайте, затем нажмите ссылку и продолжите чистку страницы. Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 02 мая 2020

Краткий ответ:

curl 'https://untappd.com/venue/more_menu/47792/15?section_id=140248357' -H 'x-requested-with: XMLHttpRequest'

Нажатие на эту кнопку запускает javascript, поэтому вам нужно будет использовать селен для автоматизации этого, но, к счастью, вы не будете:).

Вы можете увидеть, используя Инструменты разработчика, когда вы нажимаете эту кнопку, он запрашивает данные в соответствии с показанным шаблоном, увеличиваясь каждый раз на 15 (после /47792/), поэтому в первый раз: https://untappd.com/venue/more_menu/47792/15?section_id=140248357 второй раз: https://untappd.com/venue/more_menu/47792/30?section_id=140248357 затем: https://untappd.com/venue/more_menu/47792/45?section_id=140248357' и так далее.

Но если вы попытаетесь получить его непосредственно из браузера, он не получит никакого содержимого, поскольку они ожидают заголовок 'x-required-with: XMLHttpRequest', указывающий, что это запрос AJAX.

Таким образом, у вас есть шаблон URL и необходимый заголовок, необходимый для кодирования вашего скребка.

Остальное - проанализировать каждый ответ. :)

PD: возможно, параметр section_id может измениться (мой отличается от вашего), но у вас уже есть атрибут data-section-id="140248357" в кнопке HTML.

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