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

news2024/11/15 6:44:13

本文采用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].text
                text = text.strip()
                text = text.replace('\n','')
                date = driver.find_elements(By.CLASS_NAME,"commentTime")[x].text
                date = date.strip()
                date = date.replace('\n','')
                csvwriter.writerow(('古窑民俗博览区',date,text))
                f.flush()
                print(text)
            except:
                pass
        
        el = 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 ChromeOptions

opt = 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].text
                text = text.strip()
                text = text.replace('\n','')
                date = driver.find_elements(By.CLASS_NAME,"commentTime")[x].text
                date = date.strip()
                date = date.replace('\n','')
                csvwriter.writerow(('古窑民俗博览区',date,text))
                f.flush()
                print(text)
            except:
                pass
        el = 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.coloradmin.cn/o/1941002.html

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

相关文章

Mysql高价语句

一.高级语法的查询语句 1.排序语法(默认的排序方式就是升序)。 升序ASC:select * from test01 order by name; 降序DESC:select * from test01 order by name desc; 多个列排序:以多个列作为排序,只有第一…

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:命名服务,状态同步,配置中心,集群管理等。 在分布式环境下,经常需要对应用/服…

【Python】爬虫实战02:电影市场票房情况分析与可视化

1. 前言 在信息爆炸的时代,数据分析已成为各行各业的重要工具。特别是在电影行业,票房数据不仅反映了电影的市场表现,也是电影产业健康发展的关键指标。为了更好地理解和分析中国大陆电影市场的票房情况,本代码提供了一个自动化数…

【Linux/Windows】Wireshark抓包工具下载、安装、使用、数据分析、常用知识点

文章目录 Linux版下载Windows版下载Wireshark使用Wireshark测试Tcp三次握手Wireshark常见过滤条件本篇小结 更多相关内容可查看 在一个阳光明媚的周五清晨,一起快乐的玩耍一下Wireshark Linux版下载 1.使用yum安装wireshark yum -y install wireshark2.使用yum安…

全网最简单的Mysql 8.3 安装及环境配置教程

Windows系统计算机环境配置 第一篇关于环境配置的文档之MySQL 8.3(msi版本和zip版本略有不同,本文档介绍msi版本,若zip版本有需求,请在评论区留言,我后续会出相关文档。) 前言 网上的MySQL配置教程非常多…

杰发科技AC7840——SENT数据解析及软件Sent发送的实现

0. 测试环境 AC7840官方Demo板; 图莫斯0503 DSlogic U2Basic 使用引脚 输出脚:PB1 时钟:PB2,其他引脚可以不初始化,不接线 1. 数据解析 以下是SENT数据的格式(1tick以3us为例)&#…

智能优化算法之灰狼优化算法(GWO)

智能优化算法是一类基于自然界中生物、物理或社会现象的优化技术。这些算法通过模拟自然界中的一些智能行为,如遗传学、蚁群觅食、粒子群体运动等,来解决复杂的优化问题。智能优化算法广泛应用于各种工程和科学领域,因其具有全局搜索能力、鲁…

Android Display Graphics #User APP的绘制与WMS

如果图片链接失败,请扫码查看文章详情。 Android Display Graphics系列文章-汇总 系列文章请扫关注公众号! 1、User APP的绘制 用户APP在调用ViewRootImpl#setView()方法时,首次请求VSync信号。之后进入loop循环,等待显示事件。…

【数据结构】:链表实现洗牌功能

此操作包含的基本功能有: 组牌:组建 52 张扑克牌 四种花色:“♥️”,“♠️”,“⬛️”,“♣️”每种花色 13 张牌:1~13 洗牌:将 52 张扑克牌打乱顺序发牌:给三个人每人发…

关于光伏电站监控数据

电站监控后台显示的发电量数据不能真实的反应不同逆变器方案的发电量差异。组串式逆变器由于交流线缆长,损耗的电量比集中式方案高1-2%左右。在通过监控后台显示的发电量衡量不同逆变器的差异时,需要减掉这部分差值。 光伏电站监控后台统计的发电量是从光…

桌面小宠物发布一周,第一次以独立开发者的身份赚到了100块

收入数据(AppStore一周收入统计) AppStore付费工具榜第七 应用简介 桌面新宠(NewPet),是我耗时半年开发的一款桌面宠物。我是被 QQ 宠物影响的那批人,上学时天天给 QQ 宠物喂食,很可惜它现在不在了。所以,我开发的初衷是想要在电…

图像分类算法概述:深度学习方法

图像分类算法概述:深度学习方法 图像分类是计算机视觉中的一个基本任务,近年来随着深度学习的发展,图像分类算法取得了巨大的进步。本文将概述主要的深度学习图像分类算法。 #mermaid-svg-fkTtkPLl9ahuVT6w {font-family:"trebuchet ms…

Linux(CentOS7)部署PHP-7.2.17源码包

PHP-7.2.17源码包部署 安装php1. 解压并进入php-7.2.17文件夹2. 编写php.sh脚本3. 执行php.sh 配置Apache与PHP1. 编写httpd.conf配置文件2. 编写php测试脚本 部署HTTPD-2.4.37源码包点击跳转 部署MySQL-5.6.31源码点击跳转 下载源码包和依赖的源码包,资源见文章顶…

TiDB实践—索引加速+分布式执行框架创建索引提升70+倍

作者: 数据源的TiDB学习之路 原文来源: https://tidb.net/blog/92d348c2 背景介绍 TiDB 采用在线异步变更的方式执行 DDL 语句,从而实现 DDL 语句的执行不会阻塞其他会话中的 DML 语句。按照是否需要操作 DDL 目标对象所包括的数据来划分…

linux学习week4+5

linux学习 十四.shell编程 9.单分支多分支 基本语法: if [ 条件 ] then代码 elif [ 条件 ] then代码 fi10.case语句 基本语法: case $变量名 in "值1") 程序1(如果变量的值等于值1,则执行程序1) ;; &q…

LeetCode刷题记录(第三天)55. 跳跃游戏

题目: 55. 跳跃游戏 标签:贪心 数组 动态规划 题目信息: 思路一:动态规划 确定dp数组含义: dp[i] 第[i]个位置能否达到确定递推公式: dp[i] 能不能达到,取决于前面d[i-j],d[i-j…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP ( Trivial File Transfer Protocol )即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

【博主推荐】HTML5实现简洁的实用的个人网站、个人主页七个页面源码

文章目录 1.设计来源1.1 个人主页界面1.2 关于我界面1.3 我的技能界面1.4 我的经验界面1.5 我的教育界面1.6 我的项目界面1.7 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:…

【MQTT(2)】开发一个客户端,ubuntu版本

基本流程如下,先生成Mosquitto的库,然后qt调用库进行开发界面。 文章目录 0 生成库1 有界面的QT版本2 无界面版本 0 生成库 下载源码:https://github.com/eclipse/mosquitto.git 编译ubuntu 版本很简单,安装官方说明直接make&am…

1分钟带你了解等保测评流程

常言道:“安全无小事,防患于未然。” 在信息化高速发展的今天,网络安全已成为国家安全的重要组成部分,等级保护(简称“等保”)测评作为网络安全防护的重要手段,对于确保信息系统安全、稳定运行…