首页 > Python资料 博客日记
Python爬携程指定景点评论的用户、评论内容及时间(景点黄龙溪为例)
2024-03-14 22:00:05Python资料围观409次
整个分享分为下面几个部分:
目录
问题1:有时候Poild会被隐藏,所以可能需要多试几次。(或者新开一个浏览器窗口复制打开)
7.发送POST请求到指定的postUrl,并加载响应的JSON数据。
9.将评论数据转换为DataFrame格式,再保存为Excel文件
问题2:有955条评论的,但是只能爬到700多条,现下只能解决到这种程度了,求教希望知道怎么做的小伙伴)
1.导入所需的库
requests处理HTTP请求,json库处理JSON数据。导入数据分析工具Pandas,用于创建和操作DataFrame。导入tqdm用于创建进度条,提供可视化的进度显示。
import requests
import json
import pandas as pd
from tqdm import tqdm
2.设定三个变量存储从爬取的评论数据中提取的信息
userNames:存储评论中的用户名信息。
commentDetails:存储评论的具体内容。
commentTimes:存储评论的时间信息。
在代码执行的过程中,针对每一条评论,程序会从评论数据中提取相应的用户名、评论内容和评论时间,然后将这些信息分别添加到对应的列表中。循环结束后,列表中将包含所有评论页面中提取的用户名、评论内容和评论时间的信息。
userNames = []
commentDetails = []
commentTimes = []
3.爬取指定页面数(total_pages)的评论数据。
total_pages=14:设置了要爬取的总页数为14页,即爬取14次评论页面。
total_pages = 14
forpagenintqdm(range(0,total_pages),desc='爬取进度',unit='页')使用for循环迭代爬取评论页面,range(0,total_pages)生成了一个包含0到total_pages-1的整数序列,每次迭代爬取一页评论。
payload:请求的参数,包含爬取评论所需的各种信息,如评论所属频道类型、是否折叠、评论标签等。参数会在每次循环中被传递给请求,以获取对应页面的评论数据。
postUrl:设置评论数据的请求链接。
这样,通过循环遍历,每次发送一个带有不同页码的请求,从而获取每页的评论数据。整个过程中,进度条显示当前爬取的进度。
for pagen in tqdm(range(0, total_pages), desc='爬取进度', unit='页'):
payload = {
"arg": {
"channelType": 2,
"collapseTpte": 0,
"commentTagId": 0,
"pageSize": 50,#需要自己更改的地方:自己设定每页爬多少条
"poiId": 81011,#需要自己更改的地方:为景点的信息,其他都可以直接复制
"sourseType": 1,
"sortType": 3,
"pageIndex": pagen,
"starType": 0
},
"head": {
"cid": "09031062417234242897",
"ctok": "",
"cver": "1.0",
"lang": "01",
"sid": "888",
"syscode": "09",
"auth": "",
"xsid": "",
"extension": []
}
}
4.设定postURL
postUrl是设定的评论数据请求链接,它是个URL。包含一些查询参数,用于定制请求的行为。
https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList指定请求路径和资源路径,告诉服务器我们想要获取评论的折叠列表,以JSON格式返回。
这里提供其他用途的url(某处截图到的,忘记来源了,侵删)
综合起来,postUrl指定了请求的服务端资源路径,并携带了一些参数,以获取携程网站上指定景点评论的折叠列表。
这里在(开Fn 按F12打开开发者工具)
网络——>找到第二个这个包 ——>负载内有一些我们需要的信息
6.找到景点的poild并填写在代码中
关键来了!!!!!!!!!!!我们要找到景点的poild,这是我们找到那个景点的关键!!(poild需要填写的地方在上面那段代码里,已标注)
那么我们如何找到Poild呢?
如果直接打开携程网站,找到景点黄龙溪,其页面会是这样的:
点开点评,发现点评的页面的网址是不改变的(翻页了也无法看到变化,那么就麻烦了,这个页面我无法实现爬取,所以另辟蹊径了哈)
回归到我们说找Poild的问题,请打开下面这个网址:
携程旅行-酒店预订,机票预订查询,旅游度假,商旅管理-携程无线官网
打开是这样的页面:
请在搜索框输入黄龙溪,点开这个链接(黄龙溪 热门景点)
页面是这样的,这里就出现了该景点的poild为81011。
点开点评链接。
点开之后呈现的页面如图,然后你往下翻之后发现是动态页面,向下滑动评论才会一条条蹦出来。
第二个可以获得poild的地方(有时要多试几次)(上面的看了,这里可以不看)
看到上面那行网址了吧,poild值在那段里面,你复制一下它:
【携程攻略】携程旅游攻略,自助游,自驾游,出游,自由行攻略指南 (ctrip.com)
它有点乱糟糟的,我们打开站长来解下码:
解码网址:UrlEncode编码/UrlDecode解码 - 站长工具
成功的情况:
恭喜你完成主线任务!
问题1:有时候Poild会被隐藏,所以可能需要多试几次。(或者新开一个浏览器窗口复制打开)
这种是被隐藏的情况,url中没有出现poild:
主要讲解部分结束了,后面基本不需要做改动了。
7.发送POST请求到指定的postUrl,并加载响应的JSON数据。
requests.post(postUrl,data=json.dumps(payload)):使用requests库发送POST请求到指定的postUrl。
data=json.dumps(payload)将Python字典payload转换成JSON格式的字符串,并将其作为请求的数据发送给服务器。
.text:获取服务器响应的内容,这里是评论数据的JSON字符串。
html_1=json.loads(html):将获取的JSON字符串转换为Python对象。json.loads()函数用于解析JSON字符串,将其转换为相应的Python数据结构,存储在变量html_1中。
综合起来,向指定的携程网站评论数据接口发送请求,并将得到的JSON数据加载为Python对象。
html = requests.post(postUrl, data=json.dumps(payload)).text
html_1 = json.loads(html)
8.爬取评论接口数据,提取评论信息。
检查携程网站评论数据接口返回的JSON数据中是否包含名为'items'的键。如果存在,说明有评论数据可供提取。接着,通过遍历commentItems列表,将每一条评论的相关信息提取并添加到对应的列表中(userNames、commentDetails和commentTimes)。
代码解析:
if'items'inhtml_1["result"]检查JSON数据中是否包含"items"键。如果存在,说明有评论数据可供提取,进入下一步处理。
commentItems=html_1["result"]["items"]:将评论数据提取出来,存储在commentItems变量中。这是一个列表,每个元素代表一条评论。
foriinrange(0,len(commentItems))遍历评论数据列表,处理每一条评论。
ifcommentItems[i]isnotNoneand'userInfo'incommentItems[i]and'userNick'incommentItems[i]['userInfo']::在访问元素之前检查当前评论项是否不为None,并且该评论项包含'userInfo'键和'userNick'键。这是为了确保评论数据中包含用户信息,并且该用户信息中包含用户名。将提取的用户名、评论内容和评论时间分别添加到userNames、commentDetails和commentTimes列表中。
# 检查响应中是否存在'items'
if 'items' in html_1["result"]:
commentItems = html_1["result"]["items"]
for i in range(0, len(commentItems)):
# 在访问元素之前检查当前项是否不为None
if commentItems[i] is not None and 'userInfo' in commentItems[i] and 'userNick' in commentItems[i]['userInfo']:
userName = commentItems[i]['userInfo']['userNick']
commentDetail = commentItems[i]['content']
commentTime = commentItems[i]['publishTypeTag']
userNames.append(userName)
commentDetails.append(commentDetail)
commentTimes.append(commentTime)
9.将评论数据转换为DataFrame格式,再保存为Excel文件
# 创建 DataFrame
df = pd.DataFrame({
'用户评论内容': commentDetails,
'用户名': userNames,
'用户评论时间': commentTimes
})
# 保存到 Excel 文件
df.to_excel('只爬黄龙溪评论1223url.xlsx', index=False, encoding='utf-8')
获得的信息有700条,保存为excel文件。
问题2:有955条评论的,但是只能爬到700多条,现下只能解决到这种程度了,求教希望知道怎么做的小伙伴)
下面为全部代码,如果你着急运行请直接点到这里。
import requests
import json
import pandas as pd
from tqdm import tqdm
userNames = []
commentDetails = []
commentTimes = []
total_pages = 14
for pagen in tqdm(range(0, total_pages), desc='爬取进度', unit='页'):
payload = {
"arg": {
"channelType": 2,
"collapseTpte": 0,
"commentTagId": 0,
"pageSize": 50,
"poiId": 81011,#需要自己更改的地方 为景点的信息 其他都可以直接复制
"sourseType": 1,
"sortType": 3,
"pageIndex": pagen,
"starType": 0
},
"head": {
"cid": "09031062417234242897",
"ctok": "",
"cver": "1.0",
"lang": "01",
"sid": "888",
"syscode": "09",
"auth": "",
"xsid": "",
"extension": []
}
}
postUrl = "https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList"
html = requests.post(postUrl, data=json.dumps(payload)).text
html_1 = json.loads(html)
# 检查响应中是否存在'items'
if 'items' in html_1["result"]:
commentItems = html_1["result"]["items"]
for i in range(0, len(commentItems)):
# 在访问元素之前检查当前项是否不为None
if commentItems[i] is not None and 'userInfo' in commentItems[i] and 'userNick' in commentItems[i]['userInfo']:
userName = commentItems[i]['userInfo']['userNick']
commentDetail = commentItems[i]['content']
commentTime = commentItems[i]['publishTypeTag']
userNames.append(userName)
commentDetails.append(commentDetail)
commentTimes.append(commentTime)
# 创建 DataFrame
df = pd.DataFrame({
'用户评论内容': commentDetails,
'用户名': userNames,
'用户评论时间': commentTimes
})
# 保存到 Excel 文件
df.to_excel('只爬黄龙溪评论1223url.xlsx', index=False, encoding='utf-8')
小白写文,有问题请多多指教。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj