Python爬虫实战案例——第六例

news/2024/7/19 9:45:08 标签: python, 爬虫, 开发语言

文章中所有内容仅供学习交流使用,不用于其他任何目的!严禁将文中内容用于任何商业与非法用途,由此产生的一切后果与作者无关。若有侵权,请联系删除。

目标:去哪儿网指定城市人气值最高的15个景点评论数据采集

地址:aHR0cHM6Ly9waWFvLnF1bmFyLmNvbS90aWNrZXQvbGlzdC5odG0/a2V5d29yZD0lRTUlOEMlOTclRTQlQkElQUMmcGFnZT0xJnNvcnQ9cHA=

在这里插入图片描述

进入主页之后可以看到每一个景点是根据推荐来进行排序的,所以我们如果要获取人气值最高的景点的话需要获取人气排序时的url,点击根据人气排序即可。

在这里插入图片描述

其在url中的体现主要是查询参数sort的值的改变。

在这里插入图片描述

通过抓包预览不难发现在当前页面中各景点的详情页url是位于静态html中的,所以我们考虑使用xpath来解析详情页的url。

在这里插入图片描述

这部分代码如下

python">def index_request(url):
    """请求主页获取每一个景点的详情页面url"""
    response = requests.get(url, params=params, headers=headers)
    text_html = response.content.decode()
    tree = etree.HTML(text_html)
    div_list = tree.xpath('//*[@id="search-list"]/div')     # 各个景点所在的所有div标签,需要提取出各个景点的详情页面的url
    for div in div_list:
        detail_url = 'https://piao.qunar.com' + div.xpath('./div[1]/div[2]/h3/a/@href')[0]
        detail_request(detail_url)

注意:该站点对Cookie有最基础的检测,所以代码中需要携带上Cookie进行请求。

在获取到详情页的url之后,就需要对详情页进行分析,寻找一下用户评论是如何获取的。首先来观察静态页面,在其中我们是无法看到用户评论的,所以初步断定用户评论是异步加载的数据。

在这里插入图片描述

切到xhr中分析,包并不多,可以直接搜索关键字快速定位也可以一个个查看。

在这里插入图片描述

定位到之后分析一下这个包的请求接口在请求的时候可能传递的参数。

在这里插入图片描述

可以看到的是一共传递了5个参数,其中page表示的是页数,这个毫无疑问;pageSize表示每页多少条数据,这个参数是不用修改的。其他参数就需要我们去访问不同页面进行分析了,接下来我们翻到第二页看一下两次访问有什么不同。

在这里插入图片描述

可以看到两页不同的请求变化的参数为index和page,再多访问几页也是一样的结果,所以断定index随page变化而同步变化。最后剩下sightId这个参数,这个参数如果有经验的话其实可以断定其是某个景点在这个站点中的唯一ID。就算不知道的话我们也可以来直接搜索一下这个值,因为该值在多次访问的时候是没有发生变化的,所以直接全局搜索即可。

在这里插入图片描述

这样来看就非常明显了,这个值就是从静态页面中可以直接提取的,那么我们就需要先访问详情页面将sightId值解析出来作为评论接口的参数。最后请求评论接口以获取评论信息并保存即可。

完整代码请移步:https://gitee.com/shuailiuquan/spider-code/tree/master/


http://www.niftyadmin.cn/n/5056162.html

相关文章

计算机等级考试—信息安全三级真题七

目录 一、单选题 二、填空题 三、综合题 一、单选题

Android AMS——ATMS解析(四)

ActivityTaskManagerService 是 Android 系统中的核心服务之一,它负责管理应用程序的活动(Activity)和任务栈(Task Stack)。这里我们接上一篇内容继续分析 APP 启动流程, startActivity() 方法,调用了 ATMS,我们继续往下看。 一、ATMS源码分析 1、ActivityTaskManage…

C语言中的sizeof运算符的作用是什么?

在C语言中,sizeof运算符是一个非常重要的运算符,它用于计算数据类型或表达式的大小(以字节为单位)。这个运算符在C语言中的作用非常广泛,它可以帮助程序员确定内存的分配和数据类型的大小,从而更好地管理内…

如何删除gitlab上多余的文件夹

无意间在提交代码时,包含了多余的 .idea 或者 __pychche__ 缓存文件夹等等,如何一次性删除呢? 实际上没有更好的办法,如果还没有合并,close 掉 MR就行了,重新提交。 如果已经合并了,就会留下记…

YOLOv7改进新颖的Gather-and-Distribute机制,特征新颖融合,增强了多尺度特征融合能力,实现了延迟和准确性的理想平衡

💡本篇内容:YOLOv7改进新颖的Gather-and-Distribute机制,特征新颖融合,增强了多尺度特征融合能力,实现了延迟和准确性的理想平衡 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv7 按步骤操作运行改进后的代码即可 💡本文提出改进 原创 方式:二次创新,YOLOv7专…

Spark报错异常及解决

Spark报错异常及解决 org.apache.spark.shuffle.FetchFailedExceptionContainer killed by YARN for exceeding memory limits.Container on host: xxx was preempted org.apache.spark.shuffle.FetchFailedException org.apache.spark.shuffle.FetchFailedException: Connect…

Unity中使用自定义mesh和UImesh

自定义Mesh&#xff1a; public float width 1;public float height 1;public void CreateMesh(){MeshRenderer meshRenderer gameObject.GetComponent<MeshRenderer>();meshRenderer.sharedMaterial new Material(Shader.Find("Standard"));MeshFilter me…

1616. 分割两个字符串得到回文串;1717. 删除子字符串的最大得分;1605. 给定行和列的和求可行矩阵

1616. 分割两个字符串得到回文串 核心思想:思维题。如果直接枚举分割点明显超时了。那么有没有方法可以判断(a,b)两个字符串能否成功形成回文串呢&#xff0c;结果就是从a的前面枚举&#xff0c;b的后面枚举&#xff0c;直到不相同的时候&#xff0c;a,b剩余的公共部分为s[l:r…