Python爬虫实战 | 爬取携程网景区评论|美食推荐|景点列表数据

本文采用Selenium库爬取携程网的景区评论。

携程接口接入 

Selenium介绍

Selenium是一个Web的自动化测试工具,可以按指定的命令自动操作,如让浏览器加载页面、获取数据、页面截屏等。Selenium本身不自带浏览器,需要与第三方浏览器结合才能使用。Selenium的核心是Webdriver,这是一个编写指令集的接口,具有与浏览器自动化交互的特性,提供了相应的应用程序接口(Application Programming Interface)来操作浏览器。目前支持的主流浏览器内核有Firefox、Chrome、Edge等。

(一)安装Selenium

在命令窗口输入下述命令进行安装:

pip install selenium==4.3.0

(二)配置浏览器驱动

  1. 要安装对应版本驱动。

    针对不同的浏览器,需要根据自己电脑的操作程序安装不同驱动。这里选择使用的是Chrome浏览器,通过访问网址 chrome://version/ ,得到版本是 122.0.6261.69(64 位),于是安装对应版本驱动。

    图片

    注:关于selenium的具体配置可见往期推文:

  2. 禁止浏览器自动更新。

    由于Selenium自动化操作浏览器时需要安装浏览器驱动Webdriver,而Webdriver驱动需要与浏览器的对应版本一致。为避免Chrome浏览器更新后原本的程序或页面无法正常运行,可以手动关闭Chrome浏览器的自动更新。打开【cmd】->输入【services.msc】->点击两个【谷歌更新服务】->在弹出的属性页面中将【启动类型】设为【禁止】。注:可查看往期推文:

    图片

一、导入第三方库

在使用selenium.webdriver做自动化测试时,需要经常模拟鼠标和键盘的一些动作,ActionChains 类可以模拟鼠标操作,如移动、点击、悬停等。通过Webdriver模块中的By类可以为后面爬取景区时以指定方式定位标签元素。

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
import csv
from selenium.webdriver import ChromeOptions

二、实例化Chrome浏览器

使用Selenium库中的webdriver来实例化浏览器的驱动程序。可以使用option类来设置浏览器参数,如浏览器窗口大小、页面加载策略等。Headless模式是Chrome浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有Chrome浏览器支持的特性运行程序。

opt = ChromeOptions() #实例化配置对象
opt.add_argument("--headless") #配置对象添加开启无界面命令,在后台运行
opt.add_argument("window-size=1920x1080") #配置界面大小format(width,height)
opt.add_argument('--start-maximized') #最大化启动
driver = webdriver.Chrome(options=opt) #创建浏览器实例并使用配置对象opt
url = 'https://you.ctrip.com/sight/jingdezhen405/61145.html' #这里的url是所要爬取景点的网址
driver.get(url)

三、模拟下拉界面操作

在页面加载时,会根据页面大小来布局控件,因此设置延长页面的存在时间,并模拟手下拉的操作,让没有显示的界面加载出来。有时通过Selenium无法直接实现页面上的操作,如滚动条、时间控件等,此时需要借助JavaScript完成。JavaScript是一种脚本语言,在客户端,即浏览器运行。Webdriver提供了一种内置方式操作,可以调用js代码实现操作:driver.execute_script(js)

  1. JavaScript声明并对元素执行单击操作:argument[0].click()

  2. execute_script()使用的JavaScript语句作为字符串值调用方法:driver.execute_script("arguments[0].click();",button)

  3. 平时测试时可以用time.sleep()来强制等待,生产环境下可用implicity_wait()来固定时间等待页面元素全部加载完成。

def to_the_buttom():js = 'document.getElementsByClassName("search-body left_is_mini")[0].scrollTop=10000'driver.execute_script(js)
def to_the_top():js = "var q=document.documentElement.scrollTop=0"  # 滚动到最上面driver.execute_script(js)
def to_view():driver.implicitly_wait(10)#隐式等待10s,条件成立则立即结束等待to_the_buttom()time.sleep(3)button = driver.find_element(By.CSS_SELECTOR,'li.ant-pagination-next>span') #这里是通过CSS选择器定位翻页元素driver.execute_script("arguments[0].scrollIntoView();", button)

四、翻页获取用户评论

接下来就是编写主函数,主要是嵌套两个循环,古窑民俗博览区用户评论共300页,每页有10条评论。通过访问页面获取标签元素,一页获取完点击下一页,并用创建的csv文件进行存储。在本次爬取中,我们使用追加模式a打开了一个名为“古窑民俗博览区评论.csv”的文件,并用write()方法在文件中添加用户评论“text”。with open()是python用来打开文件的,会在使用完毕后自动关闭文件。

图片

  1. with open(file='要打开的路径名称(或保存内容的地址)',mode='r/w/a',encoding='utf-8') as f:如果没有指定的路径,会自动新建文件,无需提前新建。mode有三种常用模式,默认是r,即只读模式;w即只写模式,会清除之前写的内容;这里用的是a,即追加模式,会在已经写的内容基础上追加新的内容。

  2. utf-8编码方式写入csv文件时,会出现除英文外全是乱码的情况,因此这里指定编码方式为utf-8-sig,即带有签名的utf-8(UTF-8 with BOM),可以有效解决Excel在读取csv文件时的乱码问题。

  3. 通过driver.find_element(By.xxx,value)定位元素。selenium有八种主要的元素定位方式,如:class name、xpath、css selector、id、name、tag name等,这里所使用的是前三种定位方式。

  4. 其中,find_element_by_xpath()有多种方法,查找具体的元素时必须在前面以//开头,表示从当前节点寻找所有的后代元素。//*[@style]表示查找包含style的所有元素

with open("古窑民俗博览区评论.csv", "a", encoding='utf-8-sig',newline='') as f:csvwriter = csv.writer(f)csvwriter.writerow(('景点','日期','用户评论'))for y in range(1,301):time.sleep(3)for x in range(10):try:text = driver.find_elements(By.CLASS_NAME, "commentDetail")[x].texttext = text.strip()text = text.replace('\n','')date = driver.find_elements(By.CLASS_NAME,"commentTime")[x].textdate = date.strip()date = date.replace('\n','')csvwriter.writerow(('古窑民俗博览区',date,text))f.flush()print(text)except:passel = driver.find_element(By.XPATH, '//*[@id="commentModule"]/div[6]/ul/li[7]/a')  ActionChains(driver).move_to_element(el).click().perform()print(y)

全套代码

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
import csv
from selenium.webdriver import ChromeOptionsopt = ChromeOptions()
opt.add_argument("--headless")
opt.add_argument("window-size=1920x1080")
opt.add_argument('--start-maximized')
driver = webdriver.Chrome(options=opt)
url = 'https://you.ctrip.com/sight/jingdezhen405/61145.html'
driver.get(url)def to_the_buttom():js = 'document.getElementsByClassName("search-body left_is_mini")[0].scrollTop=10000'driver.execute_script(js)
def to_the_top():js = "var q=document.documentElement.scrollTop=0"  # 滚动到最上面driver.execute_script(js)
def to_view():driver.implicitly_wait(10)#隐式等待10s,条件成立则立即结束等待to_the_buttom()time.sleep(3)button = driver.find_element(By.CSS_SELECTOR,'li.ant-pagination-next>span')driver.execute_script("arguments[0].scrollIntoView();", button)    with open("古窑民俗博览区评论.csv", "a", encoding='utf-8-sig',newline='') as f:csvwriter = csv.writer(f)csvwriter.writerow(('景点','日期','用户评论'))for y in range(1,301):time.sleep(3)for x in range(10):try:text = driver.find_elements(By.CLASS_NAME, "commentDetail")[x].texttext = text.strip()text = text.replace('\n','')date = driver.find_elements(By.CLASS_NAME,"commentTime")[x].textdate = date.strip()date = date.replace('\n','')csvwriter.writerow(('古窑民俗博览区',date,text))f.flush()print(text)except:passel = driver.find_element(By.XPATH, '//*[@id="commentModule"]/div[6]/ul/li[7]/a')  ActionChains(driver).move_to_element(el).click().perform()print(y)time.sleep(10)
driver.close()         

运行结果

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381891.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官问:Django、Flask、FastAPI,你选哪个?为什么?

如果你是python Web方向的开发工程师,那么在面试中,会经常遇到面试官问这个问题: “在Python的三个流行Web框架:Django、Flask和FastAPI,说说它们的异同,以及你是怎么选择合适的框架?” 异同对…

基于SSM的高考志愿选择辅助系统

基于SSM的高考志愿选择辅助系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台 前台首页 院校展示 后台 后台首页 学校管理 摘要 随着高考制度的不断完…

python-爬虫实例(4):获取b站的章若楠的视频

目录 前言 道路千万条,安全第一条 爬虫不谨慎,亲人两行泪 获取b站的章若楠的视频 一、话不多说,先上代码 二、爬虫四步走 1.UA伪装 2.获取url 3.发送请求 4.获取响应数据进行解析并保存 总结 前言 道路千万条,安全第一条 爬…

成为CMake砖家(4): VSCode中的CMake语法高亮

大家好,我是白鱼。 在成为CMake砖家的路上,我的主力 IDE/编辑器是 VSCode。 VSCode 免费、插件丰富、文档完善, 相比于 CLion 的年费几百上千元的license真的很香。 不过, 工欲善其事必先利其器, VSCode 需要安装合适…

FastDFS分布式存储

一:FastDFS原理 FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。 1:FastD…

物联网在电力行业的应用

作者主页: 知孤云出岫 这里写目录标题 作者主页:物联网在电力行业的应用简介主要应用领域代码案例分析1. 智能电表数据采集和分析2. 设备监控和预测性维护3. 能耗管理和优化4. 电力负载预测5. 分布式能源管理6. 电动汽车充电管理7. 电网安全与故障检测 物联网在电力行业的应用…

CH03_布局

第3章:布局 本章目标 理解布局的原则理解布局的过程理解布局的容器掌握各类布局容器的运用 理解 WPF 中的布局 WPF 布局原则 ​ WPF 窗口只能包含单个元素。为在WPF 窗口中放置多个元素并创建更贴近实用的用户男面,需要在窗口上放置一个容器&#x…

海康威视综合安防管理平台 detection 前台RCE漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上) 大家好 我是寸铁👊 【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(上)✨ 喜欢的小伙伴可以点点关注 💝 前言 本次文章分为上下两部分&…

算法题目整合4

文章目录 122. 大数减法123. 滑动窗口最大值117. 软件构建124. 小红的数组构造125. 精华帖子126. 连续子数组最大和 122. 大数减法 题目描述 以字符串的形式读入两个数字,编写一个函数计算它们的差,以字符串形式返回。输入描述 输入两个数字&#xff…

UE TSharedPtr

文章目录 概述TSharedPtrTSharedPtr包含2部分 构造,析构,拷贝构造,移动构造构造拷贝构造移动构造 小结 概述 之前写过一篇c的智能指针的,这篇写下ue的。本质上来说是差不多的,可以简单看看。 TSharedPtr 如下图&…

分析性能提升40%,阿里云Hologres流量场景最佳实践

在互联网和移动分析时代,流量数据成为了企业洞察用户行为、优化产品决策和提升运营效率的关键资源。流量数据主要来源于用户在使用APP、小程序或访问网站等媒介平台时产生的各种操作行为,如点击、浏览、注册、下单等。这些行为数据通过数据埋点技术被采集…

人工智能与机器学习原理精解【3】

文章目录 泰勒级数逼近基础一阶导数和二阶导数的几何意义一阶导数的几何意义二阶导数的几何意义应用示例 导数与微分的区别1. 定义与本质2. 几何意义3. 表达式与关系4. 应用场景 可微函数定义几何意义性质例子 导数导数的定义导数的计算导数的几何意义导数函数的图像一、常见导…

使用Redis的SETNX命令实现分布式锁

什么是分布式锁 分布式锁是一种用于在分布式系统中控制多个节点对共享资源进行访问的机制。在分布式系统中,由于多个节点可能同时访问和修改同一个资源,因此需要一种方法来确保在任意时刻只有一个节点能够对资源进行操作,以避免数据不一致或…

SpringMVC源码深度解析(中)

接上一遍博客《SpringMVC源码深度解析(上)》继续聊。最后聊到了SpringMVC的九大组建的初始化,以 HandlerMapping为例,SpringMVC提供了三个实现了,分别是:BeanNameUrlHandlerMapping、RequestMappingHandlerMapping、RouterFunctio…

mysql面试(一)

前言 从今天开始,更新一些mysql的基础知识,面试会遇到的知识点之类的内容。比如四个隔离级别,mvcc机制,三大日志,索引,B树的形成等等,从数据库的底层来剖析索引和树是怎么形成的,以…

【常见开源库的二次开发】基于openssl的加密与解密——MD5算法源码解析(五)

一、MD5算法分析 : 1.1 关于MD5 “消息摘要”是指MD5(Message Digest Algorithm 5)算法。MD5是一种广泛使用的密码散列函数,它可以生成一个128位(16字节)的散列值。 RFC 1321: MD5由Ronald Rivest在1992…

算法017:二分查找

二分查找. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/ 二分查找,其实是双指针的一种特殊情况,但是时间复杂度极低&#…

Web前端:HTML篇(一)

HTML简介: 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。 您可以使用 HTML 来建立自己的 WEB 站点,HTML 运行在浏览器上,由浏览器…

MongoDB教程(十三):MongoDB覆盖索引

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言什么是覆盖…