当前位置: 首页 > news >正文

python爬取穷游网景点评论

爬取穷游网的景点评论数据,使用selenium爬取edge浏览器的网页文本数据。

同程的评论数据还是比较好爬取,不像大众点评需要你登录验证杂七杂八的,只需要找准你想要爬取的网页链接就能拿到想要的文本数据。

这里就不得不提一下爬取过程中遇到的问题,就是关于无头模式和有头模式,首先介绍一下什么是无头模式和有头模式:

无头模式和有头模式是指网络爬虫在执行过程中是否显示浏览器的界面。

有头模式是指网络爬虫在执行过程中会显示浏览器的界面,可以看到爬取过程中的页面加载、点击等操作,可以进行人工干预和调试。有头模式一般用于开发和调试阶段,便于观察爬虫的执行情况。

无头模式是指网络爬虫在执行过程中不显示浏览器的界面,所有的操作都在后台进行,不会干扰用户的正常使用。无头模式一般用于实际的爬取任务,可以提高爬取效率,减少资源消耗。

总的来说,无头模式和有头模式的区别在于是否显示浏览器界面,有头模式适用于开发和调试阶段,无头模式适用于实际的爬取任务。

无头模式的问题:

1、无头模式下缺少浏览器信息,或默认填充的浏览器信息带有爬虫痕迹,会被识别为机器人而导致爬虫执行失败。

2、页面动态加载时,有时会根据页面size来布局控件,如果size太小会出现控件加载失败情况。

所以经常爬到二十多页的时候就突然报错“找不到元素无法点击”这种的错误。又或者是爬到三十多页又告诉我找不到元素,某某列表为空,就很烦。😠 😡 😤

为了解决这个问题我的尝试:

1:延长页面的存在的时间,让服务器充分响应,并且模拟手下拉的操作,让下面没显示出来的界面加载出来:

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_deal_question():driver.implicitly_wait(10)time.sleep(3)to_the_buttom()time.sleep(3)
def to_view():driver.implicitly_wait(10)to_the_buttom()time.sleep(3)button = driver.find_element(By.XPATH, '//*[@id="commentModule"]/div[6]/ul/li[7]/a')driver.execute_script("arguments[0].scrollIntoView();", button)

2:使用Selenium库中的webdriver来实例化一个Microsoft Edge浏览器的驱动程序,并设置了一些选项。

opt = Options()
opt.add_argument("--headless")
opt.add_argument("window-size=1920x1080")
opt.add_argument('--start-maximized')
driver = webdriver.Edge(options=opt)
url = 'https://you.ctrip.com/sight/daocheng342/11875.html'
driver.get(url)
# driver.maximize_window()

然后就可以愉快把评论全拿到手了,这里是穷游网木格措的评论。

最后我还用jieba库做了一下词条分析,想看看这个景点大家的关注点都是些什么。

全部代码:

爬取数据板块:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.keys import Keys
from requests import request
from selenium.webdriver.support import ui
from selenium.webdriver.support.wait import WebDriverWaitdriver = webdriver.Edge()
url = 'https://place.qyer.com/poi/V2UJZ1FgBzZTYVI2/'
driver.implicitly_wait(10)
driver.get(url)
driver.maximize_window()
def to_the_buttom():js="var q=document.documentElement.scrollTop=100000"driver.execute_script(js)with open("mu_ge_cuo_2.txt", "a", encoding='utf-8') as f:for x in range(1,6):driver.implicitly_wait(10)to_the_buttom()time.sleep(3)to_the_buttom()for i in range(1,11):text=driver.find_element(By.XPATH, "/html/body/div/div/div[2]/div/div[4]/div/div[2]/div[1]/div[2]/div[2]/ul/li[{}]/div/p".format(i)).textf.write(text)f.write("\n")print(x)button = driver.find_element(By.XPATH, '/html/body/div/div/div[2]/div/div[4]/div/div[2]/div[1]/div[2]/div[2]/div[1]/div/a[{}]'.format(x))button.click()
# with open("mu_ge_cuo_2.txt", "a", encoding='utf-8') as f:
#     for x in range(6,83):
#         driver.implicitly_wait(10)
#         to_the_buttom()
#         time.sleep(3)
#         to_the_buttom()
#         for i in range(1,11):
#             text=driver.find_element(By.XPATH, "/html/body/div/div/div[2]/div/div[4]/div/div[2]/div[1]/div[2]/div[2]/ul/li[{}]/div/p".format(i)).text
#             f.write(text)
#             f.write("\n")
#         print(x)
#         button = driver.find_element(By.XPATH, '/html/body/div/div/div[2]/div/div[4]/div/div[2]/div[1]/div[2]/div[2]/div[1]/div/a[6]')
#         button.click()time.sleep(100000)
driver.close()

分析数据提取词条板块:

import jieba
stopwords = [line.strip() for line in open('hit_stopwords.txt',encoding='utf-8').readlines()]
stopwords.append("\n")
# print(stopwords)
f1=open('mu_ge_cuo_2.txt','r',encoding='utf-8')
code=[]
for i in f1.read().strip().split(' '):words = jieba.lcut(i)code+=words
d={}
for word in code:if word not in stopwords:d[word]=d.get(word,0)+1
ls=list(d.items())
ls.sort(key=lambda s:s[-1],reverse=True)
print(ls)
f1.close()
with open("mu_ge_cuo_2_results.txt", "a", encoding='utf-8') as f:for i in range(20):f.write(str(ls[i]))f.write("\n")

里面的stopwords是为了去除标点符号、特殊字符和语气助词,在主页的其他文章里有提供。

如果这篇文章能对您有所帮助的话,还望点个赞赞呀~😘

相关文章:

python爬取穷游网景点评论

爬取穷游网的景点评论数据,使用selenium爬取edge浏览器的网页文本数据。 同程的评论数据还是比较好爬取,不像大众点评需要你登录验证杂七杂八的,只需要找准你想要爬取的网页链接就能拿到想要的文本数据。 这里就不得不提一下爬取过程中遇到的…...

Phar 文件上传以及反序列化

1.phar反序列化 触发条件: 1、能将phar文件上传 2、可利用函数 stat、fileatime、filectime、file_exists、file_get_contents、file_put_contents、file、filegroup、fopen、fileinode、filemtime、fileowner、fileperms、is_dir、is_executable、is_file、is_link…...

面试其他注意事项

面试其他注意事项 一、面试反问 这个岗位的日常工作和主要职责是什么?咱们这边主要负责什么业务,用到了哪些技术呢?对于我们校招生有没有培养体系呢?脱产培训,还是边工作边熟悉?会有导师带嘛?…...

sklearn 笔记 BallTree/KD Tree

由NearestNeighbors类包装 1 主要使用方法 sklearn.neighbors.BallTree(X, leaf_size40, metricminkowski, **kwargs) X数据集中的点数leaf_size改变 leaf_size 不会影响查询的结果,但可以显著影响查询的速度和构建树所需的内存metric用于距离计算的度量。默认为…...

ConstraintLayout使用详解

作为一名程序员,可能会经历以下难受的事情: 解决难以调试的代码错误处理复杂的代码库和维护遗留代码修改已经存在很长时间的代码,需要考虑兼容性和稳定性长时间工作,缺乏身体运动和社交互动,导致压力和孤独感遇到不能…...

Java8Stream快速使用

将List集合存入流中 List<String> list new ArrayList<>();list.add("张一");list.add("张二");list.add("张三");list.add("李四");list.add("赵五");list.add("张六");list.add("王八"…...

work环境配置

1.计算机右键找到属性 2.配置环境变量 3.新加环境变量 4.修改环境变量path .bat文件内容 php ApplicationsChatstart_register.php ApplicationsChatstart_gateway.php ApplicationsChatstart_businessworker.php pause...

Flutter应用-使用sqflite升级数据库

文章目录 问题描述具体做法代码示例更多条件限制升级 数据库迁移和备份简介数据库迁移数据库备份 问题描述 使用fluttter开发的应用程序发布后&#xff0c;发现数据库有些设计不合理。如何来更新数据库呢&#xff1f; 使用sqflite来处理数据库&#xff0c;但是第一版软件发布后…...

集群搭建(redis7)

一、主从复制(replica)&#xff08;不推荐&#xff09; 介绍 主从复制 mmaster以写为主&#xff0c;slave以读为主当master数据变化时&#xff0c;自动将新的数据异步同步到其他slave数据库 读写分离down机恢复数据备份水平扩容支撑高并发 基本操作 配从不配主 权限细节 maste…...

高能分享:软件测试十大必问面试题(附带答案)

1 介绍之前负责的项目 参考答案&#xff1a;先大概描述一下这个项目是做什么的&#xff08;主要功能&#xff09;&#xff0c;包括哪些模块&#xff0c;是什么架构的&#xff08;B/S、C/S、移动端&#xff1f;&#xff09;&#xff0c;你在其中负责哪些模块的测试。期间经历了几…...

Java 反射设置List属性

使用 Java 反射可以动态地设置对象的属性值&#xff0c;包括 List 类型的属性。以下是一个示例代码&#xff0c;演示如何通过反射设置 List 类型的属性&#xff1a; 假设有一个类 Person&#xff0c;包含一个 List 类型的属性 names&#xff1a; java public class Person { …...

wpf devexpress Property Grid创建属性定义

WPF Property Grid控件使用属性定义定义如何做和显示 本教程示范如何绑定WP Property Grid控件到数据和创建属性定义。 执行如下步骤 第一步-创建属性定义 添加PropertyGridControl组件到项目。 打开工具箱在vs&#xff0c;定位到DX.23.1: Data 面板&#xff0c;选择Prope…...

78.子集--77.组合

78&#xff0c;子集 递归 class Solution(object):def subsets(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""# 结果ans[]# 临时结果dp_[]def dfs(nums,index):if indexlen(nums):# 保存结果co_dpdp_[:]ans.append(co_dp)r…...

【C++】模版-初阶

目录 泛型编程--模版 函数模版 类模版 泛型编程--模版 函数模版 如何实现一个通用的交换函数呢?void Swap(int& left, int& right){int temp left;left right;right temp;}void Swap(double& left, double& right){double temp left;left right;righ…...

【JavaEE初阶】 TCP服务器与客户端的搭建

文章目录 &#x1f332;前言&#x1f334;ServerSocket API&#x1f384;Socket API&#x1f340;TCP中的长短连接&#x1f38d;建立TCP回显客户端与服务器&#x1f6a9;TCP搭建服务器&#x1f6a9;TCP搭建客户端&#x1f6a9;通信过程展示&#xff1a; &#x1f333;多个客户端…...

23111710[含文档+PPT+源码等]计算机毕业设计基于SpringBoot的体育馆场地预约赛事管理系统的设计

文章目录 **软件开发环境及开发工具&#xff1a;****功能介绍&#xff1a;****论文截图&#xff1a;****数据库&#xff1a;****实现&#xff1a;****代码片段&#xff1a;** 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 软件开发环境及…...

【论文解读】GPT Understands, Too

一.论文 1.1 P-tuning 区别于之前的工作&#xff0c;这篇工作认为promote可以在句子中的任意位置起到作用&#xff0c;可以将它们插入上下文或目标中 上图中&#xff0c;左图是不使用任何操作&#xff0c;右图是选择在居首和目标前插入promote的embedding&#xff0c;插入pro…...

组合式API_生命周期

选项式API_生命周期 <template><h3>选项式API</h3><p>{{ message }}</p> </template> <script> export default {data(){return{message:""}},mounted(){this.message "选项式API生命周期函数"} } </scr…...

WPF如何实现应用程序托盘

在WPF中实现应用程序托盘图标和菜单功能通常需要使用System.Windows.Forms.NotifyIcon类&#xff0c;因为WPF本身并没有直接提供这样的控件。为了使用NotifyIcon&#xff0c;你需要添加对System.Windows.Forms的引用。以下是如何实现的步骤&#xff1a; 1. 添加对 System.Wind…...

ERROR: column “xxxx.id“ must appear in the GROUP BY

org.postgresql.util.PSQLException: ERROR: column “xxx.id” must appear in the GROUP BY clause or be used in an aggregate function 错误**&#xff1a;列“XXXX.id”必须出现在GROUP BY子句中或在聚合函数中使用** 出现这种错误的sql如下&#xff1a; select name,…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...