直接使用POST请求URL不起作用

时间:2019-05-28 02:33:47

标签: web-scraping scrapy

我正在尝试取消电影院的放映时间。当我观察到该站点用于检索放映时间(https://www.majorcineplex.com/booking2/search_showtime/cinema=1)的POST请求时,它可以正常工作。

但是,当我直接在浏览器中使用POST请求(https://www.majorcineplex.com/ajaxbooking/ajax_showtime)时。它向我显示“此节目没有任何信息”。

我发现这很奇怪,因为两者都是从同一个Chrome浏览器中触发的,但结果却有所不同。

对于提供的任何帮助/建议,我预先表示感谢。

更新2019年5月29日

这是我的Scrapy蜘蛛代码。

基本上从响应中,我正在尝试使用 class = book_st_contain 检索div元素。

我已经确定该div元素在HTML中,就像我使用Chrome开发工具所检查过的一样。但是,当我运行蜘蛛时,它不存在。

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)

1 个答案:

答案 0 :(得分:0)

您需要确保标题和发布的正文与您在浏览器devtools中看到的匹配:

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-TypeX-Requested-With标头,并与您在检查器中看到的值匹配。