使用 Scrapy + Selenium 爬取动态渲染的页面
霍格沃兹测试开发
2022年05月24日 11:18

背景

在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值。但是通过观察我们会发现,通过浏览器进行url请求发送则会加载出对应的动态加载出的数据。那么如果我们想要在scrapy也获取动态加载出的数据,则必须使用selenium创建浏览器对象,然后通过该浏览器对象进行请求发送,获取动态加载的数据值. 本文分享scrapy的介绍和如何配合selenium实现动态网页的爬取。

Scrapy

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

Scrapy 安装并运行

安装 通过pip install Scrapy 安装即可, Ubuntu安装需要安装依赖sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zliblg-dev libffi-dev libssl-dev;

创建项目: scrapy startproject project_name;

创建爬虫: 进入项目根目录 scrapy genspider spider_name sprder_domian;

目录介绍;

01

Scrapy执行流程

Scrapy中的数据流由执行引擎控制,其过程如下:

  1. (从第二步)重复直到调度器中没有更多的请求(Requests)。

02

Scrapy架构图

03

中间件架构

900×604 89.8 KB

Selenium

Selenium有很多东西,但从本质上讲,它是一个 Web 浏览器自动化工具集,它使用可用的最佳技术远程控制浏览器实例并模拟用户与浏览器的交互。它允许用户模拟最终用户执行的常见活动;在字段中输入文本,选择下拉值和复选框,并单击文档中的链接。它还提供了许多其他控件,例如鼠标移动、任意 JavaScript 执行等等。

01

selenium 安装

安装 pip install selenium

02

驱动安装

使用selenium驱动chrome浏览器需要下载chromedriver,而且chromedriver版本需要与chrome的版本对应,版本错误的话则会运行报错。

03

chrome

下载chromedriver可以通过淘宝镜像地址: http://npm.taobao.org/mirrors/chromedriver/ 最新的镜像与Chrome同名,尽量选择版本相近的避免兼容问题,镜像下notes.txt可查看当前驱动支持的版本。

04

其他浏览器驱动

使用requests爬取动态渲染的页面

可以看到 返回的页面源码中 只有一个天气表格的框架, 没有我们需要的天气信息. 而且出现了被检测的信息. 出现这种情况 是因为:

● 目标网页是动态渲染的页面, 所以我们只能看到天气表格的框架,看不到具体的信息

● 目标网页检测到selenium 禁止调试

Scrapy + Selenium

  1. 运行一个Scrapy的项目

899×252 86 KB

900×316 105 KB

总结

在撰写爬虫程序时, 遇到动态渲染的页面我们可以使用Scrapy+Selenium对页面规避反爬策略和爬取页面信息. 虽然webdriver影响到了Scrapy 的运行速度, 我们还可以使用scrapy-redis让我们的爬虫变成分布式以提高效率。