携程逆向爬虫 | 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等等多种反爬手段,提高爬虫稳定性和爬虫效率。

### 使用 Python 爬虫抓取携程旅游景点信息 对于获取携程网站上的旅游景点数据的任务,考虑到目标网页结构复杂度以及所需抓取的数据量大小,推荐采用 Scrapy 这一框架来进行开发工作[^1]。 #### 创建 Scrapy 项目并配置环境 为了提高国内网络环境下依赖包安装的速度,建议设置 pip 的镜像源为中国科学技术大学、阿里云或清华大学提供的 PyPI 镜像站点之一[^4]: ```bash pip config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple/ ``` 接着初始化一个新的 Scrapy 工程目录用于存放即将编写的爬虫逻辑代码: ```bash scrapy startproject ctrip_spider cd ctrip_spider ``` #### 编写 Spider 类定义文件 在 `ctrip_spider/spiders` 文件夹下创建名为 `attractions.py` 的蜘蛛类模块,在其中实现具体的页面请求发送与响应解析功能。这里展示了一个简化版的例子来说明基本流程[^2]: ```python import scrapy from ..items import CtripSpiderItem class AttractionsSpider(scrapy.Spider): name = "attractions" allowed_domains = ["ctrip.com"] start_urls = ['https://you.ctrip.com/sight/beijing1.html'] def parse(self, response): items = [] # 假设我们想要提取景区名称和简介作为样例 attractions = response.xpath('//div[@class="list_mod2"]') for attraction in attractions: item = CtripSpiderItem() title = attraction.xpath('.//dt/a/text()').get().strip() description = ''.join(attraction.xpath('.//dd/p/text()').extract()).strip() item['title'] = title item['description'] = description yield item next_page_url = response.css('a.next::attr(href)').get() if next_page_url is not None: yield scrapy.Request(response.urljoin(next_page_url)) ``` 此段代码展示了如何利用 XPath 表达式定位 HTML 文档中的特定节点,并从中抽取感兴趣的信息字段存入自定义 Item 对象中以便后续处理;同时也实现了分页加载机制以遍历多页结果集。 #### 执行爬虫程序 最后一步是在命令行界面执行该爬虫作业,可以将输出重定向至 JSON 文件保存下来供进一步分析使用: ```bash scrapy crawl attractions -o output.json ``` 上述操作会启动名为 “attractions” 的爬虫实例,并将其产生的 Items 序列化成 JSON 格式的字符串流输出到当前路径下的 `output.json` 文件内。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

旭旭老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值