Scrapy+Selenium项目实战--携程旅游信息爬虫

在网络爬虫中,使用Scrapy和Selenium相结合是获取动态网页数据的有效方式。本文将介绍如何使用Scrapy和Selenium构建一个爬取携程旅游信息的爬虫,实现自动化获取数据的过程。
本文已对部分关键URL进行处理,本文内容仅供参考,请勿用以任何商业、违法行径

简介

携程(you.ctrip.com)是一个提供旅游信息的网站,但它的部分内容可能是动态加载的,难以直接通过Scrapy获取。这时就需要借助Selenium这样的工具,模拟浏览器行为进行数据的获取和处理。

工具准备

  • Scrapy: 一个用于爬取网站并提取结构化数据的强大框架。
  • Selenium: 一个自动化测试工具,可以模拟用户操作浏览器的行为。
  • ChromeDriver: 作为Selenium WebDriver的一部分,用于驱动Chrome浏览器进行自动化测试。
    具体下载地址和环境配置可参考:
    使用Selenium和bs4进行Web数据爬取和自动化(爬取掘金首页文章列表) - 掘金 (juejin.cn)

实现步骤

  1. 设置Scrapy项目: 创建Scrapy项目并配置爬虫。
  2. 编写爬虫: 使用Scrapy的Spider编写爬虫,设置起始URL和数据提取规则。
  3. 设置Selenium中间件: 创建Selenium中间件,用于处理需要动态加载的页面内容。
  4. 利用Selenium模拟浏览器行为: 在Selenium中间件中,使用ChromeDriver启动浏览器,模拟点击、等待页面加载等操作。
  5. 处理页面内容: 利用Selenium获取到的页面内容,提取需要的信息并返回给Spider。
  6. 数据存储或处理: Spider获取到数据后,可以选择存储到数据库或进行其他处理。

代码实现

爬虫部分

  1. 爬虫启动

    • 爬虫启动后,读取Excel文件中的景区名称作为搜索关键词。
    • 构建对应的携程搜索链接,并发起Request请求。

def start_requests(self):df = pd.read_excel("D:\code\Scrapy\scrapy_tour\A级景区(按省份).xlsx")scenic_namelist = df['景区名称']dflen = len(scenic_namelist)for i in range(10641, dflen):key = scenic_namelist[i]newurl = '' + keyyield Request(url=newurl, meta={'use_selenium': True, 'title': key, 'id': i, 'closeid': dflen - 1})
  1. Selenium配置
    • 通过Selenium进行浏览器模拟,创建Chrome实例,设置headless模式(无界面运行)。
    • 使用预设的Chrome浏览器驱动(chromedriver.exe),打开携程首页,读取并加载已保存的Cookie信息,实现自动登录。

def creat_browser(self):# ... ChromeOptions设置及浏览器实例化 ...browser = webdriver.Chrome(service=service, options=options)browser.get("")browser.delete_all_cookies()with open('scrapy_tour/cookies_xiecheng.json', 'r', encoding='utf-8') as f:listCookies = json.loads(f.read())for cookie in listCookies:browser.add_cookie(cookie)browser.refresh()return browser
  1. 评论信息采集
    • 在页面加载完毕后,使用Selenium定位和等待元素加载,获取评论相关内容(评分、评论内容、评论时间等)。
    • 实现翻页操作,模拟用户点击下一页,持续获取更多评论信息,直至达到设定的页数或无法继续翻页。

def parse(self, response):# ...while True:# 定位评论元素,等待加载elements = WebDriverWait(self.driver, 3).until(lambda x: x.find_elements(by=By.CSS_SELECTOR, value='.commentList .commentItem .contentInfo'))# 获取评论相关信息# 翻页操作# ...
  1. 数据存储
    • 将获取的评论信息存储到XiechengItem中,并利用Scrapy框架的Item Pipeline进行后续处理和存储。

if id is not None and title is not None and commentstr!='':xiecheng_item['Title'] = titlexiecheng_item['Commentlist'] = commentstrxiecheng_item['AverageScore'] = averagescorexiecheng_item['OpenTime'] = timexiecheng_item['Number'] = numberxiecheng_item['Id'] = idyield xiecheng_item

通过这样的爬取方式,可以获取携程上景区的评论信息,包括评分、评论内容、评论时间等,为进一步分析景区口碑提供了数据支持。

中间件

class xiecheng_SeleniumMiddleware:def __init__(self):self.driver = creat_browser()self.winflag = 0# 释放资源def closemidd(self,request):if request.meta.get('closeid')==request.meta.get('id'):self.driver.quit()def process_request(self, request, spider):if request.meta.get('use_selenium'):self.driver.get(request.url)# 在这里使用Selenium进行页面交互,如点击按钮、填写表单等# 并等待页面加载完成# 获取页面内容# page_source = self.driver.page_source# 转换为字节格式,以避免一些编码错误# self.driver.implicitly_wait(5)  # 设置隐式等待时间为5秒try:# 显示等待确保能找到元素,显示等待3s# raise IgnoreRequest("强制取消")elements = WebDriverWait(self.driver, 3).until(lambda x: x.find_elements(by=By.CSS_SELECTOR, value='.guide-main-item-bottom .title'))Similarity_score = []for element in elements:title = element.textoldtitle = request.url.split('=')[1]# url 转码中文oldtitle = urllib.parse.unquote(oldtitle)Similarity_score.append(get_similarity(oldtitle, title))# if Similarity_score[-1][4] >=50:#     print(Similarity_score[-1])max_score = Nonemax_index = Noneif Similarity_score!=[]:for index, score in enumerate(Similarity_score):if max_score == None or max_score[-1] < score[-1]:max_score = scoremax_index = index# 找到最匹配的选项# print('max', max_score)# print(max_index)# 若成功找到最匹配项,且各种匹配方式得分都大于50.点击该景点获取urlif max_score != None and max_score[2] >= 50 and max_score[3] >= 50 and max_score[4] >= 50:print('max', max_score)elements[max_index].click()print("click yes")# self.winflag+=1# thiswim=self.winflagli = self.driver.window_handles  # 出现多个窗口,需要切换句柄,先获取句柄列表if len(li)>=2:self.driver.switch_to.window(li[-1])  # 切换句柄# 显示等待热度数据,等待详情页显示完毕hot = WebDriverWait(self.driver, 3).until(lambda x: x.find_elements(by=By.CSS_SELECTOR, value='.heatView .heatScoreView .heatScoreText'))# 将详情页信息发送到spiderbody = to_bytes(self.driver.page_source, encoding='utf-8')print('传入爬虫url')print(self.driver.current_url)# 修改中间件判断参数request.meta['use_selenium'] = Falseresponse = HtmlResponse(url=self.driver.current_url, body=body, encoding='utf-8',request=request)# 关闭窗口句柄减一self.driver.close()# 切换至搜索页面窗口if len(li) >= 1:self.driver.switch_to.window(li[0])# self.winflag-=1self.closemidd(request)return responseelse:self.closemidd(request)raise IgnoreRequest("未找到相似度合格的元素")except Exception as e:raise IgnoreRequest("中间件报错,或可能是显示等待的元素等待超时或是元素不存在。")spider.logger.error(f"Error: 中间件报错,{e}")# return Noneelse:print('未进入携程的中间件,被转移')# 不使用 Selenium,直接返回 None,让 Scrapy 使用默认的下载器处理这个请求# passreturn None

以上是一个用于Scrapy爬虫的中间件,主要功能是通过Selenium模拟浏览器操作,实现页面交互和内容获取。

  • 初始化

    • 在初始化方法中,创建了一个浏览器实例self.driver
    • 设定了一个标志位self.winflag用于跟踪窗口数量。
  • 请求处理

    • process_request方法处理请求,当请求中包含指定的参数use_selenium时,使用Selenium处理请求。
    • 使用WebDriverWait进行页面元素的显示等待,等待指定元素加载完成。
    • 根据元素内容的相似度进行匹配,点击最匹配的选项,获取相关详情信息。
    • 如果成功找到匹配项且相似度符合要求,切换到详情页,等待详情页数据加载完毕,获取页面信息并构造HtmlResponse对象。
    • 关闭详情页窗口,返回HtmlResponse对象,传递给爬虫处理。
    • 若未找到相似度合格的元素或发生异常,则忽略该请求,不进行处理。
  • 资源释放

    • closemidd方法用于释放资源,在请求处理完成后,根据条件判断是否关闭浏览器窗口句柄。

Pipeline管道

在Scrapy框架中,处理数据的管道(Pipeline)起着至关重要的作用。其中,MySQLPipeline是一种常见的数据处理管道,用于将爬取的数据存储到MySQL数据库中。


class MySQLPipeline:def __init__(self, mysql_host, mysql_port, mysql_database, mysql_user, mysql_password):# 初始化连接参数和数据库连接实例# ...@classmethoddef from_crawler(cls, crawler):# 从爬虫配置中获取数据库连接参数# ...def open_connection(self):# 手动开启数据库连接# ...def open_spider(self, spider):# 在爬虫启动时打开数据库连接# ...def close_spider(self, spider):# 在爬虫关闭时关闭数据库连接并提交数据# ...def process_item(self, item, spider):# 处理爬取到的数据,并根据数据类型执行相应的数据库插入操作# ...def write_data(self, sql):# 执行批量数据写入操作# ...
  • 初始化:MySQLPipeline类在初始化时接收MySQL数据库连接所需的参数,并创建了数据库连接的实例以及一个用于暂存数据的列表。
  • 从配置中获取参数:通过from_crawler方法从Scrapy的配置中获取MySQL数据库连接的参数。
  • 数据库连接管理open_connection方法用于手动开启数据库连接;open_spider方法在爬虫启动时调用,也用于开启数据库连接;close_spider方法在爬虫关闭时调用,用于关闭数据库连接并提交数据到数据库。
  • 数据处理process_item方法根据不同的数据类型,执行相应的数据库插入操作,将数据存储到对应的数据表中。
  • 批量写入数据write_data方法用于执行批量数据写入操作,将暂存的数据列表批量写入数据库表中,并在操作完成后清空数据列表。

这样我们就成功的构建了一个旅游信息采集爬虫。

注意事项

  • 页面结构变化: 网站的页面结构可能会不定期更改,导致原有的提取规则失效,需要定期检查和更新提取规则。
  • 反爬措施: 网站可能有反爬措施,需要注意不要频繁请求或暴露爬虫行为。

总结

通过Scrapy和Selenium的结合,我们可以构建一个能够有效获取旅游信息的爬虫。但是需要注意,爬虫在实际应用中需要遵守网站的规则,避免对网站造成过大压力或触发反爬机制。

以上就是利用Scrapy和Selenium构建旅游信息爬虫的基本流程和实现方法。

(注意:以上代码和步骤仅为示例,实际爬虫需根据网站的页面结构和变化进行相应调整和处理。)

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

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

相关文章

11.1 Linux 设备树

一、什么是设备树&#xff1f; 设备树(Device Tree)&#xff0c;描述设备树的文件叫做 DTS(DeviceTree Source)&#xff0c;这个 DTS 文件采用树形结构描述板级设备&#xff0c;也就是开发板上的设备信息&#xff1a; 树的主干就是系统总线&#xff0c; IIC 控制器、 GPIO 控制…

Mysql数据库学习笔记

数据库分为关系型数据库和非关系型数据库&#xff0c;我们要学的MySQL数据库是关系型数据库。 Mysql的介绍这里不做赘述&#xff0c;网上一大片&#xff0c;这里直接步入正题&#xff01;&#xff01;&#xff01; 一、SQL语言 SQL语言是一种结构化查询语言&#xff08;Stru…

飞天使-jumpserver-docker跳板机安装

文章目录 jumpserverdocker 更新到最新下载安装包mysql启动mysql 命令 验证字符集,创建数据库使用jumpserver 进行连接测试 redis部署jumpserver 写入变量建jumpserver 容器正确输出登录验证 jumpserver 基础要求 硬件配置: 2 个 CPU 核心, 4G 内存, 50G 硬盘&#xff08;最低…

MacOS - 如何在 Mac 苹果电脑中打开 gif 图片

我们在使用Mac电脑的时候&#xff0c;想要双击打开的GIF图片&#xff0c;发现不会自动播放&#xff0c;而是很多张图片帧&#xff0c;今天就跟大家介绍一下如何在mac苹果电脑中打开gif图片的具体操作步骤 方法一 首先打开电脑&#xff0c;找到图片&#xff0c;右键&#xff0c…

爬虫持久化保存

## open方法- 方法名称及参数markdown **open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue)****file** 文件的路径&#xff0c;需要带上文件名包括文件后缀&#xff08;c:\\1.txt&#xff09;**mode** 打开的方式&#xff08;r,w,a,x,b,t…

ESP32+BlinkerWiFi+智能台灯

一、硬件 ESP32 白色LED 超声波传感器 USB转串口(只用到VCC,GND) 面包板 二、软件 Arduino IDE版ESP32开发板 Blinker,apk 三、电路连接 USB转串口(LED) VCC(VCC) GND(GND)(ESP32的GND ESP32:LED:超声波传感器 VCC: :VCC GND:GND:GND 2…

【改进YOLOv8】桑叶病害检测系统:减少通道的空间对象注意力RCS-OSA改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着农业科技的不断发展&#xff0c;农作物病害的快速检测和准确诊断成为了农业生产中的重要问题。其中&#xff0c;桑叶病害对于桑树的生长和产量具…

电脑监测微信聊天记录丨用黑科技能查到别人聊天记录吗

最近有企业网管来咨询我们&#xff0c;用什么黑科技可以查看到别人的聊天记录吗&#xff1f; 先说答案吧&#xff1a;是可以的 下面是一位访客咨询我们的记录↓ 2023年都要结束了&#xff0c;电脑监测微信聊天记录也已经不再是什么稀奇的事情了。在市面上这样的软件也很普遍了…

字符串左旋N个字符

题目 写一个函数&#xff0c;判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如&#xff1a;给定s1 AABCD和s2 BCDAA&#xff0c;返回1. 给定s1 abcd和s2 ACBD&#xff0c;返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到…

python中字典是什么

在Python中&#xff0c;字典是一种无序的数据结构&#xff0c;用于存储键-值对。它是通过键来访问值的&#xff0c;而不是通过索引。字典使用大括号{}来定义&#xff0c;每个键-值对之间使用冒号:来分隔。 例如&#xff0c;创建一个字典来表示一个人的信息&#xff0c;可以使用…

pytorch——豆瓣读书评价分析

任务目标 基于给定数据集&#xff0c;采用三层bp神经网络方法&#xff0c;编写程序并构建分类模型&#xff0c;通过给定特征实现预测的书籍评分的模型。 选取数据 在各项指标中&#xff0c;我认为书籍的评分和出版社、评论数量还有作者相关&#xff0c;和其他属性的关系并大。…

K8S学习指南(27)-k8s存储对象Persistent Volume Claim

文章目录 前言什么是Persistent Volume Claim&#xff1f;Persistent Volume Claim的基本结构1. Access Modes&#xff08;访问模式&#xff09;2. Storage Class&#xff08;存储类&#xff09;3. Resources&#xff08;资源需求&#xff09;4. Status&#xff08;状态&#x…

电脑里的ip地址在哪里查找

​互联网的普及使得电脑成为我们日常生活中不可或缺的工具。然而&#xff0c;对于很多人来说&#xff0c;电脑中的IP地址是一个相对陌生的概念。那么&#xff0c;电脑里的IP地址到底在哪里查找呢&#xff1f;本文将详细介绍如何快速查找和设置电脑IP地址&#xff0c;帮助您更好…

MongoDB的数据库引用

本文主要介绍MongoDB的数据库引用。 目录 MongoDB的数据库引用 MongoDB的数据库引用 MongoDB是一种面向文档的NoSQL数据库&#xff0c;它使用BSON&#xff08;Binary JSON&#xff09;格式存储和查询数据。在MongoDB中&#xff0c;数据库引用是一种特殊的数据类型&#xff0c;…

利用gradio快速搭建AI应用

引言 Gradio 是一个用于快速创建交互式界面的Python库&#xff0c;这些界面可以用于演示和测试机器学习模型。使用Gradio&#xff0c;开发者可以非常轻松地为他们的模型构建一个前端界面&#xff0c;而不需要任何Web开发经验。 与类似产品的对比 TensorBoard&#xff1a;主…

【Python从入门到进阶】44、Scrapy的基本介绍和安装

接上篇《43.验证码识别工具结合requests的使用》 上一篇我们学习了如何使用验证码识别工具进行登录验证的自动识别。本篇我们开启一个新的章节&#xff0c;来学习一下快速、高层次的屏幕抓取和web抓取框架Scrapy。 一、Scrapy框架的背景和特点 Scrapy框架是一个为了爬取网站数…

聊一聊后端语言的差异和特性差异

假如有一个需求要实现一个统计的需求&#xff0c;可能不同的人会有不同的实现方式&#xff0c;最为掌握一门编程语言和掌握多门编程语言&#xff0c;以及一年工作经验的编程人员和多年的编程人员的实现思路肯定是不一样的。 例子一&#xff1a;要实现A表中某个条件下&#xff…

JS参数归一化之对日期时间的格式化

/** 辅助函数&#xff1a;参数类型不确定时&#xff0c;找到它们的共同点作处理 */ function _formatNormalize(formatter){if(typeof formatter function){return formatter;}if(typeof formatter ! string){throw new TypeError(formatter must be string or function);}if(…

C++内存布局

温故而知新&#xff0c;本文浅聊和回顾下C内存布局的知识。 一、c内存布局 C的内存布局主要包括以下几个部分&#xff1a; 代码段&#xff1a;存储程序的机器代码。.数据段&#xff1a;存储全局变量和静态变量。数据段又分为初始化数据段&#xff08;存储初始化的全局变量和…

python与机器学习2,激活函数

目录 1 什么是激活函数&#xff1f; activation function 1.1 阈值 1.2 激活函数a(x) &#xff0c;包含偏置值θ 1.3 激活函数a(x) &#xff0c;包含偏置值b 2 激活函数1: 单位阶跃函数 2.1 函数形式 2.2 函数图形 2.3 函数特点 2.4 代码实现这个 单位阶跃函数 3 激活…