Scrapy: найти HTTP-вызов от нажатия кнопки - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь очистить листовки с сайта flipp.com/weekly_ads с помощью Scrapy.Прежде чем я смогу очистить листовки, мне нужно ввести код города и выполнить поиск местных листовок (на сайте это делается нажатием кнопки).

Я пытаюсь ввести значение и симулировать «нажатие кнопки» с помощью Scrapy.

Сначала я думал, что смогу использовать FormRequest.from_response для поиска формыи введите мой код города в качестве значения.Однако кнопка написана на javascript, что означает, что форма не может быть найдена.

Итак, я попытался найти HTTP-вызов через Inspect Element> Developer Tools> Network> XHR, чтобы проверить, будет ли какой-либо из вызовов вызыватьзагрузите эквивалентную страницу flipp с новым, введенным кодом города (мой код города).

Теперь я очень плохо знаком с Scrapy и HTTP-запросами / ответами, поэтому я не уверен, что найденная ссылкаисправить один (как, например, ответ с новым кодом города), или нет.

Это запрос, который я нашел:

https://gateflipp.flippback.com/bf/flipp/data?locale=en-us&postal_code=90210&sid=10775773055673477

Я использовал произвольный почтовый индекс для запроса (90210).

Я подозреваю, что это неверный запрос, но в случае, если я ошибаюсь, и это правильно:

Как перейти к - flipp.com/weekly_ads/groceries из этого запроса, сохраняя новый код города?

Если это неверно:

Как ввести значение для кнопки JavaScript и получить результат с помощью Scrapy?

import scrapy
import requests
import json

class flippSpider(scrapy.Spider):
    name = "flippSpider"
    postal_code = "M1T2R8"
    start_urls = ["https://flipp.com/weekly_ads"]

    def parse(self, response): #Input value and simulate button click
        return Request() #Find http call to simulate button click with correct field/value parameters

    def parse_formrequest(self, response):
        yield scrapy.Request("https://flipp.com/weekly_ads/groceries", callback= self.parse_groceries)

def parse_groceries(self, response):
        flyers = []
        flyer_names = response.css("class.flyer-name").extract()
        for flyer_name in flyer_names:
            flyer = FlippspiderItem()
            flyer["name"] = flyer_name
            flyers.append(flyer)
            self.log(flyer["name"])
            print(flyer_name)
        return flyers

Я ожидал найти фактический запрос кнопки javascript в ссылках XHR, но тот, который я нашел, кажется неправильным.

Редактировать: я не хочу использовать Selenium, он медленный, и я не хочубраузер, чтобы всплыть во время выполнения паука.

1 Ответ

0 голосов
/ 28 декабря 2018

Я подозреваю, что это неправильный запрос, но в случае, если я ошибаюсь, и это правильно:

Это правильный URL-адрес для получения данных, которые приводят этот веб-сайт в действие;вещи, которые вы видите на экране при переходе на flipp.com/weekly_ads/groceries, просто упаковывают эти данные в HTML

. Как перейти к - flipp.com/weekly_ads/groceries из этого запроса, сохраняя при этом новыйкод города?

Я уверен, что вы задаете неправильный вопрос.Вам не нужно - и на самом деле переход к flipp.com/weekly_ads/groceries на 100% не будет делать то, что вы хотите в любом случае.Вы можете заметить, что когда вы нажимаете «Продовольственные товары», содержимое 1014 * изменяется, но браузер не переходит на какую-либо новую страницу и не отправляет новый запрос XHR.Таким образом, все, что вам нужно, находится в этом JSON.Происходит то, что они используют flyers.*.categories, который содержит "Groceries", чтобы сузить 129 листовок, которые возвращаются только к тем, которые связаны с продуктами.

Что касается "поддержания нового кода города", этопохожий «неправильный вопрос», потому что каждый фрагмент данных, возвращаемый этим XHR, попадает в соответствующий почтовый индекс.Таким образом, вам не нужно ничего повторно отправлять, и я не буду ожидать, что какие-либо данные, которые будут возвращены из вашего postal_code=90210 запроса, будут содержать 30309 (или что-то еще).

Верьте или нетвы на самом деле в прекрасном месте: вам не нужно иметь дело со сложными запросами CSS или XPath, чтобы освободить данные из его HTML-тюрьмы: они достаточно любезны, чтобы предоставить вам API для своих данных.Вам просто нужно разобраться с распаковкой контента из их структуры в свой.

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