目录
导语1. 获取所有城市_id2. 分析评论信息位置3. 获取当前市 景点页数4.获取当前景点的评论页数5. 总体爬虫效果6. 注意
导语
自携程更新后,这是全网首篇,关于新版携程的逆向爬虫
最近由于项目需要,编写了携程逆向爬虫脚本,遇到过一些难点,然而在携程更新网页端之后,也没有大牛写过新的关于携程爬虫的文章。 由于还没有创建github(有点懒),代码需要的可以私信,这里只提供思路和过程 在此,给网友提供思路和全站爬虫效果,有需要的可以私信我
主要难点(坑)如下:
很多加密参数需要自行测试payload在爬虫post请求中的使用请求到的json数据繁琐,难以分析使用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. 分析评论信息位置
通过抓包可以发现,评论信息是存放在以下位置的: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5a1200a9c7794a49af84eda868bcb019.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
点击旅游景点的第二页和第三页,分析发送的POST请求,以及url链接,这里我们可以发现,每次请求时,post请求对应url链接是不断变化的,我们要通过JS逆向来分析url产生过程,通过execjs来执行逆向后的js。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ada7cec1271149918206345696d27367.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
逆向过程(略)这里实在是比较复杂,语言不好描述,视频可能方便些。 效果如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5b2ef372ddd747dd89efe240e0e9f67d.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
3. 获取当前市 景点页数
比如第一个城市安吉,它的旅游景点的页数是304页,一些景点少的,才个位数,所以我们这里不能爬取固定页数,程序很容易报错。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dc3fa886f4c24b83bd060003c45412d1.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
通过分析发现,这个post请求中存在总旅游景点数,我们用它除以每页的景点数量,可以得到景点页数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bcd0c33fd9d24af08fd8f197fe262840.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
r = requests.post(url, data=payloaddata, headers=headers)
page_num = r.json()['total']//20
print("{}市共有{}条景点信息,共{}页".format(i[0],r.json()['total'],page_num))
效果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/78bfdace35004b19abcbe3d621f1e926.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
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))
效果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/976e7e347eec4800bbdabda8c1263937.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
5. 总体爬虫效果
![在这里插入图片描述](https://img-blog.csdnimg.cn/add2b6d44a694d2799de73787ddc84fd.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2xpamlhbWluZ2NjYw==,size_16,color_FFFFFF,t_70)
6. 注意
全国景点评论爬虫数据量非常庞大,建议使用分布式爬虫,代理IP,随机UA等等多种反爬手段,提高爬虫稳定性和爬虫效率。
|