第一部分账号和密码成功,是运行的apipost接口,请求成功,下面的是ajax返回的值,为空
有人知道是为什么吗,怎么解决这个问题
Ajax实际上是通过XMLHttpRequest来向服务器发送异步请求的,从服务器获取数据,然后使用JS来更新页面,这也就是常说的局部刷新实现方式,所以Ajax请求之后,服务器返回的都是纯文本流,客户端的浏览器在获取Ajax异步结果时,不是直接显示在页面上,而是要通过JS来进行处理,JS处理完以后才能显示在页面上。此处对应的JS处理就是在Ajax回调函数中执行window.location.href=path
。
在请求头信息中有这么一条:X-Requested-With: XMLHttpRequest
,这就表明这是一个AJAX请求,我们可以通过这一信息来辨别请求是来自一般的HTTP请求还是Ajax请求。
答案: 根据参考资料中提供的步骤和代码,通过浏览器控制台查看网络请求获取评论数据。具体操作流程如下: 1. 在携程景点评论页面按‘F12’进入元素检测,点击‘Network’查看网络资源。 2. 清空所有数据,再点击第二页,加载数据,等数据不再变化时,停止监听,此时可以看到请求评论第二页的所有数据。 3. 在Network中筛选出类型为XHR的请求,找到评论请求数据。请求地址为Request URL。 4. 查看Request Payload,确定每个参数的含义并通过对比法,找出不同景点的区别,即POI ID。 5. 在代码中,根据分析得到的"totalCount"路径,算出总评论数的值并计算出总页数(每页10条数据),并保证页数不超过200。 6. 在代码中,使用Ajax进行连接的操作,请求每一页的评论数据,通过Python从请求结果中获取具体信息,处理并存储数据。 7. 可以在浏览器控制台中查看Ajax返回的具体信息(在Network选项卡中)。
具体代码如下(其中的请求地址和参数需根据具体情况进行修改):
import requests
import json
# 请求评论数据的url
url = 'https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList'
# 请求头
header = {
'Host': 'm.ctrip.com',
'Accept': 'application/json, text/plain, */*',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
'Content-Type': 'application/json;charset=UTF-8',
'Referer': 'https://m.ctrip.com/webapp/you/gspoi/sight/97470.html?isHideHeader=true&isHideNavBar=YES&jumpToComment=YES',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive',
'Origin': 'https://m.ctrip.com',
'Content-Length': '269',
'Cookie': '***********'
}
# 请求数据
payload = {
"arg": {
"channelType": 2,
"collapseType": 0,
"commentTagId": 0,
"pageIndex": 1,
"pageSize": 10,
"poiId": 97470, # 需要根据具体情况进行修改
"sourceType": 1,
"sortType": 3,
"starType": 0
},
"head": {
"cid": "09031027214030973865",
"ctok": "",
"cver": "1.0",
"lang": "01",
"sid": "8888",
"syscode": "09",
"auth": "",
"xsid": "",
"extension": []
}
}
# 获取评论数据的函数
def fetch_comments(page_num):
payload['arg']['pageIndex'] = page_num
try:
response = requests.post(url, headers=header, json=payload)
if response.status_code == 200:
return json.loads(response.text)
else:
return None
except requests.exceptions.RequestException as e:
print('Error:', e)
return None
# 根据分析得到的"totalCount"路径,计算出总评论数的值并计算出总页数(每页10条数据),并保证页数不超过200。
html = fetch_comments(1)
total_page = int(html['result']['totalCount']) / 10
if total_page > 200:
total_page = 200
# 遍历查询评论
print("总页数:", total_page, "开始爬取")
comments = []
for i in range(1, int(total_page) + 1):
print("正在爬取第", i, "页")
result = fetch_comments(i)
if result is not None and 'data' in result:
comments.extend(result['data'])
# 处理数据并存储
for comment in comments:
print(comment['content'])