URL-адрес запроса POST не работает при прямом использовании

Я пытаюсь установить царапать расписание сеансов на сайте кинотеатра. Когда я наблюдаю за запросами POST, которые сайт использует для получения сеансов (https://www.majorcineplex.com/booking2/search_showtime/cinema=1), он работает правильно.

Однако, когда я использую запрос POST (https://www.majorcineplex.com/ajaxbooking/ajax_showtime) непосредственно в браузере. Он показывает мне «Нет информации для этого шоу».

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

Заранее благодарю за любую помощь/совет.

Обновление от 29 мая 2019 г.

Вот мой код для паука Scrapy.

В основном из ответа я пытаюсь получить элемент div с класс = book_st_contain.

Я уверен, что этот элемент div находится в HTML, как я проверил с помощью Chrome Dev Tools. Однако его просто нет, когда я запускаю паука.

class SessionSpider(scrapy.Spider):
    name = 'session'
    start_urls = [
      'https://www.majorcineplex.com/booking2/search_showtime/cinema=1'
    ]

    def parse(self, response):
        f = open('response.txt', 'w')
        f.write(response.text)

Привет, добро пожаловать в переполнение стека. Вы уверены, что запросы, отправляемые на сервер, одинаковы (включая заголовки)? Вы можете использовать инструменты браузера F12 или такой инструмент, как Fiddler, чтобы исследовать это.

Jeroen Heier 28.05.2019 05:50

Привет Jeroen, да, я очень уверен, что URL-адрес запросов был таким же. Я проверил с помощью Chrome Dev Tool, и фактический URL-адрес (majorcineplex.com/booking2/search_showtime/cinema=1) использовал тот же запрос POST. (majorcineplex.com/ajaxbooking/ajax_showtime). Единственная разница заключалась в том, что я использовал запрос POST непосредственно в браузере Chrome. Я попробовал CURL, REST-Client в VS Code, но до сих пор не получаю расписание сеансов.

Shawn Parker 28.05.2019 06:29

Эй, @ShawnParker, в основном вопросе об отладке должен быть ваш код, результаты, которые вы получаете, и результаты, которые вы ожидаете. Не могли бы вы предоставить свой код скрапинга? По крайней мере та часть, которая составляет Request объект и, возможно, settings.py содержимое?

Granitosaurus 28.05.2019 08:24

Привет, @Granitosaurus, спасибо за ответ. Я обновил основной вопрос своими кодами. Ценю вашу помощь и советы.

Shawn Parker 29.05.2019 13:51
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скраппинг с помощью PHP: Пошаговое руководство
Веб-скрейпинг становится все более популярным и сегодня является одной из актуальных тем в IT-сообществе. В результате несколько библиотек помогают...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
0
4
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо убедиться, что заголовки и опубликованное тело соответствуют тем, которые вы видите в инструментах разработки вашего браузера:

chrome inspector tool showing major.com post request

Скребковый паук, который воспроизведет это, будет выглядеть примерно так:

class MySpider(spider):
    name = 'major'

    showtime_url = "https://www.majorcineplex.com/ajaxbooking/ajax_showtime"
    showtime_headers = {
        'Accept': "*/*",
        'X-Requested-With': "XMLHttpRequest",
        'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8",
    }
    showtime_payload = "movie_text=&cinema_text = {}".format

    def start_requests():
        # crawl cinemas with ids 1 to 10
        for cinema in range(1, 10):
            payload = self.showtime_payload(cinema)
            yield Request(
                self.showtime_url,
                headers=self.showtime_headers,
                body=payload,
                method='POST'
            )

В первую очередь вы должны убедиться, что заголовки Content-Type и X-Requested-With присутствуют и соответствуют значениям, которые вы видите в своем инспекторе.

Другие вопросы по теме