使用scrapy +selenium爬取动态渲染的页面
背景
在通过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
- 目录介绍
project_folder -- 项目文件夹名称||──project_name -- 该项目的python模块,一般和项目文件夹名称相同| || |──spider -- 放置spider代码的包,以后所有的爬虫,都存放在这个里面| || |──items.py -- 用来存放爬虫怕写来的数据的模型| || |──middlewares.py -- 用来存放各种中间件的文件| || |──pipelines.py -- 用来对items里面提取的数据做进一步处理,如保存到本地磁盘等| || |──settings.py -- 本爬虫的一些配置信息(如请求头、多久发送一次请求、ip代理池等)||──scrapy.cfg -- 项目的配置文件
Scrapy 框架模块
Scrapy Engine
: Scrapy框架的核心,负责在Spider和Item Pipeline、Downloader、Scheduler中间通信、传输数据等。Spider
: 发送需要爬取的链接给引擎,最后引擎把其他模块请求回来的数据再发给爬虫,爬虫就去解析想要的数据。这部分是我们开发者自己写的,因为要爬取哪些链接,页面中的哪些数据是我们需要的,都是由程序员自己决定。Scheduler
: 复制接收引擎发送过来的请求,并按照一定的方式进行排列和整理,负责调度请求的顺序等。Downloader
: 负责接收引擎传过来的下载请求,然后去网络上下载对应的数据在交还给引擎。tem Pipeline
: 负责将Spider(爬虫)传递过来的数据进行保存,具体保存在哪里,因该看开发者自己的需求。dwnloader Middlewares
: 可以扩展下载器和引擎之间通信功能的中间件。spider Middlewares
: 可以扩展引擎和爬虫之间通信功能的中间件。
Scrapy执行流程
Scrapy中的数据流由执行引擎控制,其过程如下:
- 引擎从Spiders中获取到最初的要爬取的请求(Requests);
- 引擎安排请求(Requests)到调度器中,并向调度器请求下一个要爬取的请求(Requests);
- 调度器返回下一个要爬取的请求(Requests)给引擎;
- 引擎将上步中得到的请求(Requests)通过下载器中间件(Downloader Middlewares)发送给下载器(Downloader ),这个过程中下载器中间件(Downloader Middlewares)中的process_request()函数会被调用到;
- 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(Downloader Middlewares)发送给引擎,这个过程中下载器中间件(Downloader Middlewares)中的process_response()函数会被调用到;
- 引擎从下载器中得到上步中的Response并通过Spider中间件(Spider Middlewares)发送给Spider处理,这个过程中Spider中间件(Spider Middlewares)中的process_spider_input()函数会被调用到;
- Spider处理Response并通过Spider中间件(Spider Middlewares)返回爬取到的Item及(跟进的)新的Request给引擎,这个过程中Spider中间件(Spider Middlewares)的process_spider_output()函数会被调用到;
- 引擎将上步中Spider处理的其爬取到的Item给Item 管道(Pipeline),将Spider处理的Request发送给调度器,并向调度器请求可能存在的下一个要爬取的请求(Requests);
- (从第二步)重复直到调度器中没有更多的请求(Requests)。
Scrapy架构图
中间件架构
selenium
Selenium有很多东西,但从本质上讲,它是一个 Web 浏览器自动化工具集,它使用可用的最佳技术远程控制浏览器实例并模拟用户与浏览器的交互。它允许用户模拟最终用户执行的常见活动;在字段中输入文本,选择下拉值和复选框,并单击文档中的链接。它还提供了许多其他控件,例如鼠标移动、任意 JavaScript 执行等等。
selenium
- 安装
pip install selenium
- 安装必要驱动
驱动安装
使用selenium驱动chrome浏览器需要下载chromedriver,而且chromedriver版本需要与chrome的版本对应,版本错误的话则会运行报错。
chrome
下载chromedriver可以通过淘宝镜像地址:http://npm.taobao.org/mirrors/chromedriver/
。最新的镜像与Chrome同名,尽量选择版本相近的避免兼容问题,镜像下notes.txt可查看当前驱动支持的版本。
其他浏览器驱动
Opera:http://npm.taobao.org/mirrors/operadriver/
IE:http://selenium-release.storage.googleapis.com/index.html
(版本号要与selenium的版本一致,查看安装的selenium版本,可通过pip show selenium)如果没有vpn可能会打不开,可点击下载3.14.0版本的。
Scrapy + selenium 爬取动态渲染的页面
使用requests爬取动态渲染的页面
使用 requests 库爬取页面
可以看到 返回的页面源码中 只有一个天气表格的框架, 没有我们需要的天气信息. 而且出现了被检测的信息. 出现这种情况 是因为
- 目标网页是动态渲染的页面, 所以我们只能看到天气表格的框架 看不到具体的信息
- 目标网页检测到selenium 禁止调试
使用scrapy + selenium爬取动态渲染的页面
开始一个项目
在scrapy 项目中的 middlewares.py 添加我们自己的下载器组件
设置pipelines. 这里存储爬取的数据, 演示示例我们只保存页面被选然后的源码
在setting中添加我们自己的中间件
开启运行scrapy 后, 爬取的页面会被保存至my.txt中
表格中天气的具体信息已经被渲染
总结
在攥写爬虫程序时, 遇到动态渲染的页面我们可以使用Scrapy+Selenium对页面规避反爬策略和爬取页面信息. 虽然webdriver影响到了Scrapy 的运行速度, 我们还可以使用scrapy-redis让我们的爬虫变成分布式以提高效率.
使用scrapy +selenium爬取动态渲染的页面相关推荐
- 使用 Scrapy + Selenium 爬取动态渲染的页面
点击上方蓝字关注我们! 背景 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值 ...
- python爬虫动态加载页面_Python+Selenium爬取动态加载页面(2)
注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...
- Scrapy+Selenium爬取动态网页:no ‘moz:firefoxOptions.binary‘ capability provided
报错信息:selenium.common.exceptions.SessionNotCreatedException: Message: Expected browser binary locatio ...
- scrapy+selenium爬取五个外国新闻网站关于“中国“的新闻,并分析
1.题目 爬取一下5家的加拿大新闻网站包含"China" / "Chinese"的数据,时间范围为2020年1月日至今,分析每家媒体文章的词云图.情感趋势图等. ...
- scrapy+selenium爬取B站生活区热门视频信息!
在爬取动态网页时,一般尽量先找相应网页的API接口.但当接口不好找(或者接口的URL中含有加密参数)时,这时候就需要selenium来帮忙了.但由于selenium爬取速度比较慢,此时结合scrapy ...
- Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)
文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...
- 【爬虫】Selenium爬取动态网页的base64图片
文章简介 Selenium爬取动态网页的base64图片,并解决页面完整加载缓慢,base64字符串的获取和格式转码,一些页面不存在,部分照片无法加载等问题.后附源码. 目录 1,需求 2,环境和使用 ...
- Python爬虫基础(三) —— 爬取动态渲染页面
文章目录 使用Selenium库 例子引入 声明游览器对象 访问页面 查找节点 单个节点 多个节点 节点交互 动作链 模拟执行javascript 获取节点信息 获取属性 获取文本值 获取id,位置, ...
- python3+scrapy+selenium爬取英雄联盟英雄资料
继前一篇文章用nodejs+puppeteer+chromium爬取了这个英雄资料后,在本篇同样爬这个页面,思路都差不多,只是用不同语言来实现,可作为参考,个人觉得爬虫还是nodejs比较好用,可能是 ...
最新文章
- Python使用matplotlib可视化两个时间序列的交叉相关性图、交叉相关图显示了两个时间序列之间的滞后性(Cross Correlation plot)
- 禁止微信下拉 露出黑色背景
- Mysql修复损坏表并写脚本自动修复
- python【数据结构与算法】 python3 deque模块(双端队列)
- css自动限制图片大小
- 做好过程质量保证QA工作的几个关键方面
- python函数编程训练题_Python文件与函数练习题
- Emit学习-进阶篇-定义事件
- jQuery获取iframe的document对象的方法
- One order time zone
- SpringBoot2.0 基础案例(09):集成JPA持久层框架,简化数据库操作
- vue.js 表单 v-text
- 品牌就是复购,运营就是零售
- centos 6 编译emacs-24.5
- 在手动安装 Kubernetes 的基础上搭建微服务
- 微型计算机常见的输入与输出设备,微型计算机的输入输出设备.doc
- jmeter +ant实现接口的自动生成测试报告
- ​NLP产业应用实战,评论观点抽取与分析和文本语义检索深度详解
- arm64的ioremap_ARMv8 内存管理架构.学习笔记
- caused by: java.lang.outofmemory_hadoop运行java.lang.OutOfMemoryError:java heap space错误。
热门文章
- 线下增加设备接口开发(SDK)
- 多序列比对要多久时间_ClustalW----多序列比对分析(一)
- 被黑指数MAX?浅聊汽车钥匙安全
- Git-error: dst refspec branch matches more than one
- 洛谷 P1477 [NOI2008]假面舞会
- IntelliJ IDEA Ultimate 安装激活
- vanish(squid) + HAProxy + nginx + memcached(redis)
- pr图形模板预设怎么使用_Pr 2017版本Premiere使用标题预设动态图形,提示要安装AE...
- 详解笔记本电脑开机黑屏如何解决
- leetcode-167-两数之和 II