爬虫—Scrapy 整合 ChromeDriver 实现动态网页拉取
在进行爬虫开发时,使用 Scrapy 配合 ChromeDriver 来模拟真实浏览器加载 JavaScript 渲染内容是一种常见且高效的方法。Scrapy 本身是一个非常强大的爬虫框架,然而它默认使用的是 requests 库来抓取静态网页内容。对于需要通过 JavaScript 渲染的动态网页,Scrapy 本身可能无法直接处理。
因此,使用 ChromeDriver 来模拟浏览器渲染 JavaScript 生成动态内容,然后再用 Scrapy 提取数据,成为了解决这一问题的一种好方式。本文将带你通过实际代码示例,教你如何结合 Scrapy 和 ChromeDriver 抓取动态网页内容。
1. 环境准备
1.1 安装 Scrapy
首先,需要确保你已经安装了 Scrapy。你可以使用以下命令来安装 Scrapy:
pip install scrapy
1.2 安装 Selenium 和 ChromeDriver
在 Scrapy 中使用 Chrome 浏览器来模拟请求,我们需要通过 Selenium 来控制 ChromeDriver。所以,首先需要安装 Selenium:
pip install selenium
然后,下载并安装 ChromeDriver。你可以根据你 Chrome 浏览器的版本去 ChromeDriver 官网 下载合适的版本。确保 ChromeDriver 路径已经加入到系统环境变量中,或者你可以在代码中指定路径。
1.3 安装 Scrapy-Selenium
为了让 Scrapy 与 Selenium 配合使用,官方提供了 scrapy-selenium 扩展。安装它:
pip install scrapy-selenium
2. 配置 Scrapy 项目
2.1 创建 Scrapy 项目
在命令行中创建一个新的 Scrapy 项目:
scrapy startproject scrapy_chromedriver
cd scrapy_chromedriver
2.2 配置 settings.py
打开项目目录中的 settings.py,添加以下配置来启用 scrapy-selenium 中间件。
# settings.py# 启用 scrapy-selenium 中间件
DOWNLOADER_MIDDLEWARES = {'scrapy_selenium.SeleniumMiddleware': 800,
}# 设置 ChromeDriver 的路径
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = '/path/to/chromedriver' # 替换成你下载的 ChromeDriver 路径
SELENIUM_DRIVER_ARGUMENTS = ['--headless', '--disable-gpu', '--no-sandbox'] # 使用无头模式(可选)# 默认设置 User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
2.3 配置 Spider
现在,你可以创建一个爬虫(Spider)来抓取动态网页。
scrapy genspider dynamic_spider example.com
编辑生成的 dynamic_spider.py 文件,配置爬虫来使用 Selenium 打开网页并提取数据。
# dynamic_spider.pyimport scrapy
from scrapy_selenium import SeleniumRequestclass DynamicSpider(scrapy.Spider):name = 'dynamic_spider'allowed_domains = ['example.com']start_urls = ['https://example.com/dynamic-page']def start_requests(self):# 使用 SeleniumRequest 代替 Scrapy 的 Requestfor url in self.start_urls:yield SeleniumRequest(url=url, callback=self.parse)def parse(self, response):# 使用 Selenium 请求加载后的 HTML 页面page_title = response.xpath('//title/text()').get()print("Page Title: ", page_title)# 提取页面中的其他数据,例如某些动态生成的内容dynamic_data = response.xpath('//div[@class="dynamic-content"]/text()').get()yield {'title': page_title,'dynamic_data': dynamic_data}
在这个例子中,我们用 SeleniumRequest 替代了 Request,并在回调函数中提取动态页面内容。SeleniumRequest 会启动一个浏览器实例来加载页面,并返回最终渲染的 HTML 内容。
3. 运行爬虫
完成配置后,你可以在命令行中运行爬虫:
scrapy crawl dynamic_spider
如果一切配置正确,Scrapy 会通过 Selenium 启动 Chrome 浏览器,加载动态内容并提取数据。
4. 调试与优化
4.1 启用浏览器可视化模式
为了调试,你可以去掉 --headless 参数,这样就可以看到实际的浏览器行为:
SELENIUM_DRIVER_ARGUMENTS = ['--disable-gpu', '--no-sandbox']
4.2 增加等待时间
有时动态内容加载较慢,你可能需要等待页面完全加载后再提取数据。可以通过 Selenium 提供的 WebDriverWait 来增加等待时间。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECdef parse(self, response):driver = response.request.meta['driver']# 等待某个元素加载完毕WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@class="dynamic-content"]')))# 继续提取数据dynamic_data = response.xpath('//div[@class="dynamic-content"]/text()').get()yield {'dynamic_data': dynamic_data}
4.3 调整延迟与请求频率
在进行大量数据抓取时,记得调整请求的频率,避免过度访问同一网站导致 IP 被封锁:
DOWNLOAD_DELAY = 2 # 每次请求之间延迟 2 秒
5. 总结
通过 Scrapy 和 Selenium 结合使用,能够轻松抓取需要 JavaScript 渲染的动态网页。scrapy-selenium 提供了一个方便的接口来使用浏览器驱动,模拟用户行为获取动态数据。
- 安装 Scrapy、Selenium 和 scrapy-selenium。
- 配置 settings.py,启用 Selenium 驱动。
- 在 Spider 中使用
SeleniumRequest替代传统的Request。 - 进行调试和优化,确保爬虫运行稳定。
通过这种方式,你能够有效地抓取动态生成的网页内容,而不必担心 JavaScript 渲染的问题。希望本教程能够帮助你更好地理解如何在 Scrapy 中集成 ChromeDriver,成功地进行动态网页抓取。
相关文章:
爬虫—Scrapy 整合 ChromeDriver 实现动态网页拉取
在进行爬虫开发时,使用 Scrapy 配合 ChromeDriver 来模拟真实浏览器加载 JavaScript 渲染内容是一种常见且高效的方法。Scrapy 本身是一个非常强大的爬虫框架,然而它默认使用的是 requests 库来抓取静态网页内容。对于需要通过 JavaScript 渲染的动态网页…...
Linux 进程管理详解
Linux 进程管理详解 引言 在现代操作系统中,进程是执行程序的基本单位。Linux作为一个强大的多任务操作系统,提供了丰富且灵活的机制来管理和控制进程。本文将详细介绍Linux进程管理的基本概念、核心机制以及常用的管理工具,帮助读者深入了…...
MySQL更新JSON字段key:value形式
MySQL更新JSON字段key:value形式 1. 介绍 MySQL的JSON数据类型是MySQL 5.7及以上版本中引入的一种数据类型,用于存储JSON格式的数据。使用JSON数据类型可以自动校验文档是否满足JSON格式的要求,优化存储格式,并允许快速访问文档中的特定…...
vue.js学习(day 18)
实例:面经基础版...
WINDOWS 单链表SLIST_ENTRY使用
1.初始化链表头 //初始化链表头qq1490900437 void InitialGloubleVar() {while (1){G_Handle.SaveProcessThreadHandle (PSLIST_HEADER)_aligned_malloc(sizeof(SLIST_HEADER), MEMORY_ALLOCATION_ALIGNMENT);if (G_Handle.SaveProcessThreadHandle ! NULL){break;}}Initiali…...
【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程
文章目录 【Linux 篇】Docker 容器星河与镜像灯塔:Linux 系统下解锁应用部署奇幻征程前言一 、docker上部署mysql1. 拉取mysql镜像2. 创建容器3. 远程登录mysql 二 、docker上部署nginx1. 拉取nginx镜像2. 在dockerTar目录下 上传nginx.tar rz命令3. 创建nginx容器4…...
不同云计算网络安全等级
导读云计算的本质是服务,如果不能将计算资源规模化/大范围的进行共享,如果不能真正以服务的形式提供,就根本算不上云计算。 等级保护定级流程 定级是开展网络安全等级保护工作的 “基本出发点”,虚拟化技术使得传统的网络边界变…...
手机实时提取SIM卡打电话的信令声音-蓝牙电话如何适配eSIM卡的手机
手机实时提取SIM卡打电话的信令声音 --蓝牙电话如何适配eSIM卡的手机 一、前言 蓝牙电话的海外战略中,由于海外智能手机市场中政策的差异性,对内置eSIM卡的手机进行支持是非常合理的需求。Android系列手机中,无论是更换通信运营商…...
视频流媒体服务解决方案之Liveweb视频汇聚平台
一,Liveweb视频汇聚平台简介: LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台,可提供多协议(RTSP/RTMP/GB28181/海康Ehome/大华,海康SDK等)的视频设备接入,支持GB/T28181上下级联…...
【在Linux世界中追寻伟大的One Piece】多线程(三)
目录 1 -> Linux线程同步 1.1 -> 条件变量 1.2 -> 同步概念与竞态条件 1.3 -> 条件变量函数 1.4 -> 为什么pthread_cond_wait需要互斥量 1.5 -> 条件变量使用规范 2 -> 生产者消费者模型 2.1 -> 为什么要使用生产者消费者模型 2.2 -> 生产…...
mvc命令
命令 mvc MVC(Model-View-Controller)是一种软件架构模式,用于组织和管理应用程序的代码mvc重要的三部分 (1)模型(Model):负责存储系统的中心数据,提供访问数据的函数,封装了应用程序的功能内核。 (2)视图&…...
17 go语言(golang) - 错误处理
错误处理 错误处理是编程中用于识别、响应和恢复程序运行时出现的错误和异常情况的过程。其目的是确保程序的鲁棒性(一个系统、模型或函数在面对错误输入、工作压力、意外情况或故意攻击时仍能保持稳定性和可靠性的能力),即使在出现错误的情…...
PG 库停库超时异常案例
文章目录 现象官方文档停库底层流程:恢复脚本优化思路总结 现象 停库超时 <2024-11-29 12:50:43.022 UTC 87472 192.167.60.1(54862) PostgreSQL JDBC Driver postgres stk>FATAL: terminating connection due to administrator command <2024-11-29 12:50:43.022 …...
redis下载、基础数据类型、操作讲解说明,持久化、springboot整合等
1 Redis是什么 官网:https://redis.io 开发者:Antirez Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器,是一个基于内存的键值型NoSQL数据库。 Redis是一个开源的、高性能的键值对存储系统,它支持多种数据结构&…...
[代码随想录06]哈希表的使用,有效字母异位词,两数组交集,快乐数,两数之和
前言 哈希表是什么?一句话带你理解,简单来说我们对于杂乱的数据,怎么快速找到数据,如何做呢?一般的做法就是遍历复杂度为o(N)去找寻一个数据,但是吧,我们这样思考的话,还是花了大量时…...
【CSS】一篇掌握CSS
不是因为有了希望才去坚持,而是坚持了才有了希望 目录 一.导入方式 1.行内样式 2.内部样式 3.外部样式(常用) 二.选择器 1.基本选择器(常用) 1.1标签选择器 1.2类选择器 1.3id选择器 2.层次选择器 2.1后代选择器 2.2子选择器 2.3相邻兄弟选择器 2.4通用兄弟选择器…...
分层图最短路
常见情形: 对于边有k次操作的题。。 整体思想: 分层图最短路可以视作是dijkstra的一个扩展,通常用于处理N小于10000,或者是k不大的情形。整体有点类似于拆点。将一个点拆成k个点处理。层与层之间互不影响。 好了我就说这么多&…...
vue3 基本使用
Vue 3 提供了多种方式来构建用户界面,包括选项式 API 和 Composition API。下面我将详细介绍 Vue 3 的基本使用和语法,主要集中在选项式 API 上,因为这对于初学者来说更容易上手。 1. 创建 Vue 项目 如果你还没有一个 Vue 项目,…...
【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程
IntelliJ IDEA(以下简称 IDEA)是一款功能强大的集成开发环境,广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven,并创建一个 Maven Java 工程,快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …...
种花问题算法
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
