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.mzph.cn/news/873412.shtml

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

相关文章

基于springboot和mybatis的RealWorld后端项目实战二之实现tag接口

修改pom.xml 新增tag数据表 SET FOREIGN_KEY_CHECKS0;-- ---------------------------- -- Table structure for tags -- ---------------------------- DROP TABLE IF EXISTS tags; CREATE TABLE tags (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,PR…

一文认识21世纪商贸物流新格局

在21世纪的全球化浪潮中,商贸物流作为连接生产与消费的重要纽带,其地位日益凸显。随着信息技术的飞速发展,特别是大数据、云计算、物联网等技术的广泛应用,现代物流已远远超越了传统意义上的货物运输与仓储,向着智能化…

前端Canvas入门——用canvas写五子棋?

前言 五子棋的实现其实不难,因为本身就是一个很小的游戏。 至于画线什么的,其实很简单,都是lineTo(),moveTo()就行了。 难的在于——怎么让棋子落入到指定的格子上,怎么判断连子胜利。 当然啦,这部分是…

基于STC8H4K64TL单片机的触摸功能调试

基于STC8H4K64TL单片机的触摸功能调试 STC8H4K64TL单片机介绍STC8H4K64TL单片机管脚图(48个引脚)STC8H4K64TL单片机串口仿真与串口通信STC8H4K64TL单片机管脚图(32个引脚)STC8H4K64TL单片机管脚图(20个引脚)STC8H系列单片机管脚说明STC8H系列单片机I/O口STC8H系列单片机I…

关于Codigger之软件项目体检Software Project HealthCheck

为你的软件项目提供快速、可靠的体检 项目体检是Codigger推出的智能代码质量检查工具,可以系统地帮助您交付干净的代码。作为我们Codigger解决方案的重要元素 ,代码体检集成到您现有的工作流程中并检测代码中的问题,以帮助您对项目执行持续的…

django中日志模块logging的配置和使用

一、文件的配置 settings.py文件中添加LOGGING块的配置,配置如下 # 日志记录 LOGGING {"version": 1,"disable_existing_loggers": False, # 用于确定在应用新的日志配置时是否禁用之前配置的日志器# 格式器"formatters": {"v…

云监控(华为) | 实训学习day4(10)

SpringBoot增删改的细节研究 一、Spring boot增的安全性 1.开启数据库的事务 SpringBoot中Service层有事务(保证操作成功) 两个用户操作,同时增加同一条数据(用户名,密码一致) 验证内容,开启…

MySQL:基础操作(增删查改)

目录 一、库的操作 创建数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备份和恢复 二、表的操作 创建表 查看表结构 修改表 删除表 三、表的增删查改 新增数据 插入否则更新 插入查询的结果 查找数据 为查询结果指定别名 结果去重 where 条件 结…

【Jmeter】记录一次Jmeter实战测试

Jmeter实战 1、需求2、实现2.1、新建线程组2.2、导入参数2.3、新建HTTP请求2.4、添加监听器2.5、结果 1、需求 查询某个接口在高并发场景下的响应时间(loadtime),需求需要响应在50ms以内,接下来用Jmeter测试一下 Jmeter安装见文章《Jemeter安装教程&am…

多层全连接神经网络(四)---简单的前向网络

神经网络神经元概念部分有需要会单独再讲 激活函数 1. Sigmoid Sigmoid 非线性激活函数的数学表达式是 σ(z) ,其图形如图 3.14所示。目前我们知道 Sigmoid 激活函数是将一个实数输入转化到 0~1 之间的输出,具体来说也就是将越大的负数转化到越靠近 0…

C/C++蓝屏整人代码

文章目录 📒程序效果 📒具体步骤 1.隐藏任务栏 2.调整cmd窗口大小 3.调整cmd窗口屏幕颜色 4.完整代码 📒代码详解 🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主&a…

笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()

(57)接着介绍另一个读盘块的函数 bread(): (58)因为 函数 get_blk()大量调用了其它函数,一版面列举不完,故对其调用的函数先行注释:ge…

鲁大师2024半年报电动车智能排行:九号继续霸榜,极核本田乘胜追击

鲁大师2024年半年报正式发布,本次季报包含电动车智能排行,测试的车型为市面上主流品牌的主流车型,共计30款,全部按照评测维度更广、更专业的鲁大师电动车智慧评测2.0进行评分,测试的成绩均来自于鲁大师智慧硬件实验室。…

口袋奇兵游戏攻略:云手机辅助战锤入侵策略指南!

在《口袋奇兵》中,战锤入侵是一个重要的游戏环节,了解如何有效地参与战锤入侵能够帮助玩家获取更多的资源和提升自己的战力。本文将详细介绍战锤入侵的策略和技巧,帮助玩家在战锤入侵活动中取得更好的成绩。除了找到强力的游戏辅助&#xff0…

粉尘传感器助力面粉厂安全生产

在面粉加工行业中,粉尘问题一直是一个不容忽视的难题。从原料的破碎、研磨到成品的包装,整个生产流程中都会伴随着大量的粉尘产生。这些粉尘不仅影响生产环境,更对工作人员的健康、设备的安全运行以及环境保护构成严重威胁。因此,…

食堂采购系统开发:从需求分析到上线实施的完整指南

本篇文章,笔者将详细介绍食堂采购系统从需求分析到上线实施的完整过程,旨在为开发团队和管理者提供一个系统化的指南。 一、需求分析 1.用户需求 常见的需求包括: -采购计划管理 -供应商管理 -库存管理 -成本控制 -报表生成 2.系统功…

PyTorch使用细节

model.eval() :让BatchNorm、Dropout等失效; with torch.no_grad() : 不再缓存activation,节省显存; 这是矩阵乘法: y1 tensor tensor.T y2 tensor.matmul(tensor.T)y3 torch.rand_like(y1) torch.matm…

js reduce 的别样用法

let mergedItems list.reduce((accumulator, currentItem) > {let existingItem accumulator.find((item) > item.manObject_name currentItem.manObject_name);if (existingItem) {existingItem.laborCostHand currentItem.laborCostHand; //劳务费existingItem.wor…

有了这5个高效视频剪辑工具,你一定会爱上剪辑

如果你是个剪辑新手,不知道如何挑选剪辑视频的工具,又或者是自己目前使用的剪辑工具不理想,想寻找新的剪辑软件;那就请你看看这篇文章,这里介绍的5款剪辑软件都是专业,简单,又高效的剪辑工具。 …

顺序表<数据结构 C版>

目录 线性表 顺序表 动态顺序表类型 初始化 销毁 打印 检查空间是否充足(扩容) 尾部插入 头部插入 尾部删除 头部删除 指定位置插入 指定位置删除 查找数据 线性表 线性表是n个相同特性的数据元素组成的有限序列,其是一种广泛运…