首页 > 解决方案 > 该站点如何形成 POST 请求的标头?

问题描述

我正在尝试了解当用户输入邮政编码并从以下网站发出“POST”命令(通过单击“立即购买”按钮)时如何构建标题:

在此处输入图像描述

我相信这个“​​POST”请求的有趣部分是该站点如何形成以下标头,但我无法弄清楚它是如何做到的(我怀疑有一些 JavaScript/Angular 代码负责):

x-ccwfdfx7-a
x-ccwfdfx7-b
x-ccwfdfx7-c
x-ccwfdfx7-d
x-ccwfdfx7-f
x-ccwfdfx7-z

因此,我尝试使用该requests模块以访客身份登录,以了解有关此流程如何工作的更多信息:

  1. 与 requests.Session()
  2. 使用 cloudcraper.create_scraper()

到目前为止,我所有的尝试都失败了。这是我的代码:

import requests  
from requests_toolbelt.utils import dump   #pip install requests_toolbelt
import cloudscraper   #pip install cloudscraper

#with requests.Session() as session:
with cloudscraper.create_scraper(
        browser={
            'custom': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
        }
    ) as session:

        CITY = XXXXX
        ZIPCODE = XXXXX

        #get cookies
        url = 'http://www.peapod.com'
        res1 = session.get(url)
        session.headers['Referer'] = 'https://www.peapod.com/'

        #get more cookies
        url = 'http://www.peapod.com/login'
        res2 = session.get(url)

        #get more cookies
        url = 'https://www.peapod.com/ppd/bundles/js/ppdBundle.js'
        res3 = session.get(url)

        #get all the service locations
        response = session.get('https://www.peapod.com/api/v4.0/serviceLocations',
            params={
                'customerType': 'C',
                'zip': ZIPCODE
            }
        )

        try:
            loc_id = list(
                filter(
                    lambda x: x.get('location', {}).get('city') == CITY, response.json()['response']['locations']
                )
            )[0]['location']['id']
        except IndexError:
            raise ValueError("Can't find City '{}' -> Zip {}".format(CITY, ZIPCODE))

        #login as guest
        response = session.post('https://www.peapod.com/api/v4.0/user/guest',
            json={
                'customerType': 'C',
                'cities': None,
                'email': None,
                'serviceLocationId': loc_id,
                'zip': ZIPCODE
            },
            params={
                'serviceLocationId': loc_id,
                'zip': ZIPCODE
            }
        )

这似乎会产生某种错误消息,说“我被阻止了”,我认为这是因为我无法弄清楚浏览器如何构造ccwfdfx7“POST”请求中的标头(我的怀疑是是一些负责构建这些标头的 JavaScript/Angular 代码,但我找不到它,希望有人能提供帮助......)

在同一台电脑上,Chrome浏览器可以正常登录

标签: javascriptpythonangularjsangularpython-requests

解决方案


推荐阅读