赞
踩
自携程更新后,这是全网首篇,关于新版携程的逆向爬虫
最近由于项目需要,编写了携程逆向爬虫脚本,遇到过一些难点,然而在携程更新网页端之后,也没有大牛写过新的关于携程爬虫的文章。
由于还没有创建github(有点懒),代码需要的可以私信,这里只提供思路和过程
在此,给网友提供思路和全站爬虫效果,有需要的可以私信我
主要难点(坑)如下:
利用正则表达式和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
通过抓包可以发现,评论信息是存放在以下位置的:
点击旅游景点的第二页和第三页,分析发送的POST请求,以及url链接,这里我们可以发现,每次请求时,post请求对应url链接是不断变化的,我们要通过JS逆向来分析url产生过程,通过execjs来执行逆向后的js。
逆向过程(略)这里实在是比较复杂,语言不好描述,视频可能方便些。
效果如下:
比如第一个城市安吉,它的旅游景点的页数是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))
效果:
比如 安吉市第一条,云上草原
第二条 杭州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))
效果:
全国景点评论爬虫数据量非常庞大,建议使用分布式爬虫,代理IP,随机UA等等多种反爬手段,提高爬虫稳定性和爬虫效率。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。