携程逆向爬虫 | PC网页端 | 旅游景点评论爬虫

导语

自携程更新后,这是全网首篇,关于新版携程的逆向爬虫

最近由于项目需要,编写了携程逆向爬虫脚本,遇到过一些难点,然而在携程更新网页端之后,也没有大牛写过新的关于携程爬虫的文章。
由于还没有创建github(有点懒),代码需要的可以私信,这里只提供思路和过程
在此,给网友提供思路和全站爬虫效果,有需要的可以私信我

主要难点(坑)如下:

  1. 很多加密参数需要自行测试
  2. payload在爬虫post请求中的使用
  3. 请求到的json数据繁琐,难以分析
  4. 使用postman分析post请求

1. 获取所有城市_id

在这里插入图片描述
利用正则表达式和json解析

def get_city_id_item():
    url = "https://piao.ctrip.com/ticket"
    res_str = requests.get(url=url,headers=headers).content.decode()
    json_str = re.findall('window.__INITIAL_STATE__ = (.*?),"userAgent"',res_str)[0] + '}'
    json_dict = json.loads(json_str)
    city_item = {}
    for city in json_dict['citiesData']['domesticcity']['cities']:
        for i in city['cities']:
            city_item[i['name']] = i['id']
    # print(city_item)
    return city_item

2. 分析评论信息位置

通过抓包可以发现,评论信息是存放在以下位置的:
在这里插入图片描述

点击旅游景点的第二页和第三页,分析发送的POST请求,以及url链接,这里我们可以发现,每次请求时,post请求对应url链接是不断变化的,我们要通过JS逆向来分析url产生过程,通过execjs来执行逆向后的js。
在这里插入图片描述

逆向过程(略)这里实在是比较复杂,语言不好描述,视频可能方便些。
效果如下:
在这里插入图片描述

3. 获取当前市 景点页数

比如第一个城市安吉,它的旅游景点的页数是304页,一些景点少的,才个位数,所以我们这里不能爬取固定页数,程序很容易报错。
在这里插入图片描述

通过分析发现,这个post请求中存在总旅游景点数,我们用它除以每页的景点数量,可以得到景点页数
在这里插入图片描述

       	r = requests.post(url, data=payloaddata, headers=headers)
        page_num = r.json()['total']//20
        print("{}市共有{}条景点信息,共{}页".format(i[0],r.json()['total'],page_num))

效果:
在这里插入图片描述

4.获取当前景点的评论页数

比如 安吉市第一条,云上草原
在这里插入图片描述
第二条 杭州Hello Kitty乐园
不知道为啥携程把 杭州Hello Kitty乐园 算成安吉的。。。这不是关键
在这里插入图片描述
代码:

detail_item['风景区名称'] = product['basicInfo']['name']
encode_url = get_encode_url()
comment_page_num = product['statistics']['commentInfo']['count'] // 10
print("{}共有{}条评论,页数为:{}".format(detail_item['风景区名称'],product['statistics']['commentInfo']['count'],comment_page_num))

效果:
在这里插入图片描述

5. 总体爬虫效果

在这里插入图片描述
在这里插入图片描述

6. 注意

全国景点评论爬虫数据量非常庞大,建议使用分布式爬虫,代理IP,随机UA等等多种反爬手段,提高爬虫稳定性和爬虫效率。

  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码魔法师!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值