1.post请求,携带的参数必须是json字符串形式的 上代码

res = requests.post(self.url, headers=self.headers, data=json.dumps(data),proxies=ip)

必须要将参数转化成json字符串形式发送请求,这是一个大坑

2.以下图片为请求负载,请求负载里的参数都要带上,而且格式也必须严格按照参数的格式

携程网技术架构 携程网站结构分析_网络协议

看代码:这是我的参数

data = {    'extension': [        {            'name': "osVersion",            'value': "6.0",        },        {            'name': "deviceType",            'value': "android",        },    ],    'filter': {        'filterItems': []    },    'head': {        'auth': "",        'cid': "09031137218199825303",        'ctok': "",        'cver': "1.0",        'extension': [],        'lang': "01",        'sid': "8888",        'syscode': "09",        'xsid': "",    },    'count': 20,    'crnVersion': "2020-09-01 22:00:45",    'districtId': f"{aaaa}",  # 城市id变化    'index': num,    'isInitialState': True,    'isShowAggregation': True,    'pageId': "214062",    'scene': "DISTRICT",    'sortType': 1,    'token': "JjAmMjAmMCYmNzY4OTYsMTA1NTg5MzUsMjQzMDExNDUsOTA3MDYsMTA3NTgzNTEsNzY4ODQsMTA1NTk3MDYsNTgyNTU0NjEsNzY4ODUsMTA3NTg3MDgsODc4MTksNjE0Mjc1MDYsMTA1MjM0NzIsOTE4NDksMTA1NTg5OTYsODM3NzEsNzY4OTQsMTA2ODkzNDQzLDEwNzU5MDAyLDU3MjM5MjA4LA==",    'traceId': "7e92b543-a074-a68b-6ee1-166c3a697061",    '_fxpcqlniredt': '09031137218199825303'}

3.headers 请求头里的参数:

Host: m.ctrip.com  表示域名

content-type: application/json 表示发送请求的类型,必须是json类型的字符串,而我们所书写的参数是个字典,所以必须要

                        json.dumps(data) 这样进行转化

其余的参数我还带了有


'origin','referer','referer','accept-language','cookie'


只要发送请求成功返回数据,接下来解析因该是不会有什么大问题的

但万万没想到,我解析的数据代码写的稀烂   看代码


def jieXi(self,data):    pls = data['attractionList']    for pl in pls: # 地址 景点名 价格 评分 距市中心 详情页链接        dizhi = pl['card']['districtName']        jingDianMing = pl['card']['poiName']        # price = pl['card']['price']  这个位置定位不对 返回的数据有变化        # price = jsonpath.jsonpath(data,'$..price')        try:            price = jsonpath.jsonpath(data,'$..marketPrice')[0]        except:            price = jsonpath.jsonpath(data,'$..marketPrice')        if price=='false':            price = '免费'        pingFen = pl['card']['commentScore']        juShiZhongXin = pl['card']['distanceStr']        xiangQingYeLianJie = pl['card']['detailUrl']        print(dizhi,jingDianMing,price,pingFen,juShiZhongXin,'\n',xiangQingYeLianJie)        print('===='*30)        self.dict_user['地址']=dizhi        self.dict_user['景点名']=jingDianMing        self.dict_user['价格']=price        self.dict_user['评分']=pingFen        self.dict_user['距市中心']=juShiZhongXin        self.dict_user['详情页链接']=xiangQingYeLianJie        self.save(self.dict_user)

简单来说就是:浏览器抓包得到的与实际responce响应到的不一样   95%相似性

就比如价格这个属性  原来的在字典里一层一层的找已经不适用了  要用jsonpath直接定位到,

这样做的坏处也有,返回的是一个列表

看看我保存的json数据


下面的截图是我保存的json数据

 返回这样的数据让我很懵,我也不知道数据的真实性,但这就是我代码运行出来的结果

携程网技术架构 携程网站结构分析_携程网技术架构_02

 我唯一想到的办法就是异常处理