Scrap爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足

当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解析元素,执行动作,可以处理动态网页,使用selenium处理1个大型网站,速度很慢,而且非常耗资源,是否可以将selenium集成到scrapy框架中,发挥二者的优点呢?

Scrapy集成selenium的关键是,将其放入DownloaderMiddleware. 如下面的scrapy原理图,可以在Downloader的中间件方法中,修改request与response对象,再返回给scrapy
在这里插入图片描述

可以自定义downloader middleware 中间件类来集成selenium,当然实现selenium的所有特性,工作量比较大。因此,我们推荐使用scrapy-selenium第3方为来集成。

2. 搭建 scrapy-selenium 开发环境

2.1 安装scrapy-selenium库

pip install scrapy-selenium
python 版本应大于3.6,

2.2 安装浏览器驱动

本机上应该安装有1个selenium支持的浏览器,如chrom, firefox, edge等
再安装对应浏览器、版本的webdrive
下载 downloaded chromedriver.exe 之后,放在项目根目录下,或者加入系统环境变量。

2.3 集成selenium到scrapy 项目

项目结构如下


├── scrapy.cfg
├── chromedriver.exe ## <-- Here
└── myproject├── __init__.py├── items.py├── middlewares.py├── pipelines.py├── settings.py└── spiders└── __init__.py

进入项目文件夹,更新settings.py

## settings.py# for Chrome driver 
from shutil import whichSELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
SELENIUM_DRIVER_ARGUMENTS=['--headless']  DOWNLOADER_MIDDLEWARES = {'scrapy_selenium.SeleniumMiddleware': 800}

3. 在spider中使用selenium来解析网页

在spider中,用SeleniumRequest 类来代替selenium内置的Request类。

## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItem
from scrapy_selenium import SeleniumRequestclass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse)def parse(self, response):quote_item = QuoteItem()for quote in response.css('div.quote'):quote_item['text'] = quote.css('span.text::text').get()quote_item['author'] = quote.css('small.author::text').get()quote_item['tags'] = quote.css('div.tags a.tag::text').getall()yield quote_item

scrapy 会自动调用selenium来解析response回传的页面元素,这里selenium 使用的是headless chrom浏览器。

4. 使用selenium 的特性来爬取数据

可以使用selenium的特性,如
• 网页元素等待
• 模拟点击等操作
• 屏幕截图
等。

(1)Waits 功能

动态网页定位不到元素,通常是由于组件加载顺序,ajax 异步请求更新等造成的,而selenium提供了 wait_until的功能来处理实现对动态网页元素的定位。
所有request 等待10秒

def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse, wait_time=10)

使用selenium wait_until条件等待功能

## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItemfrom scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse, wait_time=10,wait_until=EC.element_to_be_clickable((By.CLASS_NAME, 'quote')))def parse(self, response):quote_item = QuoteItem()for quote in response.selector.css('div.quote'):quote_item['text'] = quote.css('span.text::text').get()quote_item['author'] = quote.css('small.author::text').get()quote_item['tags'] = quote.css('div.tags a.tag::text').getall()yield quote_item

(2) 点击按钮

比如,可以配置selenium执行 a 标签的点击事件

lass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url,callback=self.parse,script="document.querySelector('.pager .next>a').click()",)

(3)页面截图

## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItem
from scrapy_selenium import SeleniumRequestclass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse, screenshot=True)def parse(self, response):with open('image.png', 'wb') as image_file:image_file.write(response.meta['screenshot'])

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

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

相关文章

spring boot MySQL操作

极简spring boot MySQL测试 默认: spring boot环境已经搭好,可以跑最基本的hello world 有MySQL环境有部分测试数据表,并且有MySQL语法基础 配置 application.yml 如下配置,根据自己的数据库信息与个人需求配置 server: tomcat: uri-encoding: UTF-8 threads: …

使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

一、Feign介绍 Feign是一个声明式的HTTP客户端框架&#xff0c;用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分&#xff0c;旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。 Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下&am…

数据结构中队列的操作方式,一目了然

队列的概念 首先我们联想一下链表&#xff0c;在单链表中&#xff0c;我们只能对他的链表表尾进行插入&#xff0c;对链表的表头进行结点的删除&#xff0c;这样强限制性的链表&#xff0c;就是我们所说的队列。 也就是说&#xff0c;队列&#xff08;queue&#xff09;是限定…

代码随想录算法训练营第十二天 | 二叉树系列3

二叉树系列3 二叉树 看到二叉树就想到递归404 左叶子之和重点代码随想录的代码我的代码(当日晚上自己理解后写) 513 找树左下角的值重点代码随想录的代码我的代码(当日晚上自己理解后写)我去&#xff0c;我怎么能写出这样的代码&#xff0c;没有return的递归&#xff0c;大错特…

在Visual Studio Code里导出8266固件

1.编辑 .vscode目录下 arduion.json 添加 一个配置项output即输出目录.当然你不设置其它软固件一样会生成,只是就不知道你能不能找到了.我的配置如下 当然这个路径你想写什么 就是什么 . 2. 切换到 arduion的项目文件 xxxx.ino.点击vsc右上的验证 即可在上面设置的目录下找到…

Java面试题大全(2023牛客网最新版)大厂面试题附答案详解

很多 Java 工程师的技术不错&#xff0c;但是一面试就头疼&#xff0c;10 次面试 9 次都是被刷&#xff0c;过的那次还是去了家不知名的小公司。 问题就在于&#xff1a;面试有技巧&#xff0c;而你不会把自己的能力表达给面试官。 应届生&#xff1a;你该如何准备简历&#…

IntegrityError: FOREIGN KEY constraint failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

阿里云AliYun物联网平台使用-申请免费试用及完成初始配置

一、项目简介 本专栏文章将围绕阿里云物联网平台&#xff0c;实现其设备向云平台的数据上传&#xff0c;客户端获取云平台数据。设备通过NBIOT技术实现无线采集&#xff0c;定时上传。 二、阿里云平台申请 阿里云物联网平台试用申请地址 进入上述超链接网址&#xff1a; 由于是…

This application failed to start?

大家好&#xff0c;最近在搞一个定制的图像分割项目&#xff0c;其中需要自己构建数据集。 这里我用到了基于paddle开发高效智能的交互式分割标注软件 EISeg(Efficient Interactive Segmentation)。 它涵盖了通用、人像、遥感、医疗、视频等不同方向的高质量交互式分割模型。另…

Linux安装配置Oracle+plsql安装配置(详细)

如果觉得本文不够详细&#xff0c;没有效果图&#xff0c;可移步详细版&#xff1a; Linux安装配置Oracleplsql安装配置&#xff08;超详细&#xff09;_超爱慢的博客-CSDN博客 目录 1.安装虚拟机系统 1.安装虚拟机 2.配置虚拟机 1.设置机器名 2.修改域名映射 3.固定IP…

JavaEE——常见的锁策略、CAS、synchronized 原理(八股)

文章目录 一、常见的锁策略1.乐观锁 & 悲观锁2.轻量级锁 & 重量级锁3.自旋锁 & 挂起等待锁4.互斥锁 & 读写锁5. 公平锁 & 非公平锁 二、CAS1、什么是 CAS2. CAS 的应用场景2.实现自旋锁3. CAS 中的 ABA 问题 三、 Synchronized 原理 一、常见的锁策略 当前…

MySQL数据库基础

目录 为什么使用数据库&#xff1f; 主流数据库 数据库基本使用 连接服务器 服务器管理 理解服务器、数据库、表的关系 使用示例 MySQL架构 MySQL架构分层 MySQL架构的主要组件&#xff1a; SQL分类 存储引擎 为什么使用数据库&#xff1f; 我们平时存储数据常用各…