【问题标题】:403 Forbidden on requests.post through Python although google chrome receiving response403 Forbidden on requests.post through Python 尽管谷歌浏览器收到响应
【发布时间】:2019-06-11 00:20:38
【问题描述】:

我对网络抓取非常陌生。我正在尝试通过对请求进行逆向工程并抓取数据来获取产品的 Flipkart 卖家数据。 我正在尝试的 URL 是:https://www.flipkart.com/sellers?pid=HSAFFJWT2WUYHHHX,其中包含特定产品的卖家列表。

当我在 Google chrome 中打开网络选项卡时,我可以看到它向:https://www.flipkart.com/api/3/page/dynamic/product-sellers 发出 POST 请求,请求有效负载为: {"requestContext":{"productId":"HSAFFJWT2WUYHHHX"},"locationContext":{"pincode":"110092"}}

我在我的代码中复制了浏览器发送的请求标头和有效负载,但我收到的是 403 Forbidden 消息,而不是有效的 JSON 数据。

或者,我已经成功地使用 Selenium 打开此页面 (https://www.flipkart.com/sellers?pid=HSAFFJWT2WUYHHHX),然后使用 Beautiful Soup 解析卖家数据。但是,硒非常非常慢。这就是为什么我试图直接获取在此页面上动态填充卖家数据的 json。 我已经尝试从我的代码和 Postman 发出发布请求,但没有成功。

import requests
import json
headers = {
            'Accept': '*/*',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'en-US,en;q=0.9',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
            'Connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
            'Referer' :   'https://www.flipkart.com/sellers?pid=HSAFFJWT2WUYHHHX',
            'Content-Type': 'application/json',
            'Origin': 'https://www.flipkart.com',
            'Host': 'www.flipkart.com',
            'Pragma': 'no-cache'
            }

url = "https://www.flipkart.com/api/3/page/dynamic/product-sellers"
payLoad = {"requestContext":{"productId":"HSAFFJWT2WUYHHHX"},"locationContext":{"pincode":"001195"}}
response = requests.post(url,headers = headers,data = json.dumps(payLoad))
print(response.status_code,response.reason)
print(response.text)
print(response.request.headers)

我希望以编程方式获得这样的 Json:

但我收到了 403 Forbidden。即使该页面不需要用户登录。

也许 API 期望我没有给出一些安全令牌,这就是它抛出 403 Forbidden 的原因。

谁能帮我弄清楚我缺少什么来获取 Json?

谢谢!

【问题讨论】:

    标签: python web-scraping beautifulsoup http-headers google-chrome-devtools


    【解决方案1】:

    在 x-user-agent 中添加。试一试:

    import requests
    import json
    headers = {
                'Accept': '*/*',
                'Accept-Encoding': 'gzip, deflate, br',
                'Accept-Language': 'en-US,en;q=0.9',
                'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
                'Connection': 'keep-alive',
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
                'X-user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 FKUA/website/41/website/Desktop',
                'Referer' :   'https://www.flipkart.com/sellers?pid=HSAFFJWT2WUYHHHX',
                'Content-Type': 'application/json',
                'Origin': 'https://www.flipkart.com',
                'Host': 'www.flipkart.com',
                'Pragma': 'no-cache'
                }
    
    url = "https://www.flipkart.com/api/3/page/dynamic/product-sellers"
    payLoad = {"requestContext":{"productId":"HSAFFJWT2WUYHHHX"},"locationContext":{"pincode":"001195"}}
    response = requests.post(url,headers = headers,data = json.dumps(payLoad))
    print(response.status_code,response.reason)
    print(response.text)
    print(response.request.headers)
    

    输出:

    print(response.status_code,response.reason)
    200 OK
    

    【讨论】:

    • X-user-agent 对我不起作用,我必须添加一个 User-Agent 标头。我认为这取决于接收 REST API(在我的情况下是 Pluralsight)。我成功使用了:'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2012-06-25
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多