403 Запрещено на запросы.пост через Python, хотя Google Chrome получает ответ - PullRequest
0 голосов
/ 16 января 2019

Я очень плохо знаком с веб-скребком. Я пытаюсь получить данные продавцов флипкарт для продукта путем обратного инжиниринга запросов и очистки данных. URL, который я пробую: https://www.flipkart.com/sellers?pid=HSAFFJWT2WUYHHHX,, который содержит список продавцов для определенного продукта.

Когда я открываю вкладку сети в Google Chrome, я вижу, что она делает POST-запрос к: https://www.flipkart.com/api/3/page/dynamic/product-sellers с полезной нагрузкой запроса как: {"requestContext":{"productId":"HSAFFJWT2WUYHHHX"},"locationContext":{"pincode":"110092"}}

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

С другой стороны, я успешно использовал Selenium , чтобы открыть эту страницу (https://www.flipkart.com/sellers?pid=HSAFFJWT2WUYHHHX), а затем проанализировать данные продавцов, используя Beautiful Soup . Однако селен очень очень медленно. Вот почему я пытаюсь получить json напрямую, который динамически заполняет данные продавцов на этой странице. Я пытался сделать запрос на отправку из моего кода, а также почтальона, но безуспешно.

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, подобный этому, программно: response

Но я получаю 403 Запрещено. Несмотря на то, что для входа на страницу пользователь не требуется.

Возможно, есть какой-то жетон безопасности, который API ожидает, что я не дал, поэтому его бросок 403 Запрещен.

Может кто-нибудь помочь мне выяснить, что мне не хватает, чтобы получить Json?

Спасибо!

1 Ответ

0 голосов
/ 17 января 2019

Добавлено в 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
...