【无标题】关于携程旅行手机端网站分析:

关于携程旅行手机端网站分析:第一次写博客。。

作者是一名初阶爬虫人员 遇到过很多大坑,因此发表出来,让小伙伴们避避雷

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数据

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

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

价格那个列表取索引为0,如果报错就异常处理,打印‘免费’

以上就是我个人遇到的大坑,如果有遇到过且成功决解的同学,我们可以一起交流下,救救我

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值