1 python
既然要用 Python 3 开发爬虫,那么第一步一定是安装 Python 3
2 请求库
爬虫可以简单分为几步:抓取页面、分析页面和存储数据。
在抓取页面的过程中 ,我们需要模拟浏览器向服务器发出请求,所以需要用到一些 Python 库来实
现 HTTP 请求操作 。 在本书中,我们用到的第三方库有 requests 、 Selenium 和 aioh即 等。
2.1requests
由于 requests 属于第三方库 ,也就是 Python 默认不会自带这个库
2.2Selenium 的安装
Selenium 是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击、下拉等
操作 。 对于一些 JavaScript 谊染的页面来说,这种抓取方式非常有效。
2.3ChromeDriver
前面我们成功安装好了 Selenium,但是它是一个自动化测试工具,需要浏览器来配合使用,本节中我们就介绍一下 Chrome 浏览器及 ChromeDriver 驱动的配置。
首先,下载 Chrome 浏览器,方法有很多,在此不再赘述。随后安装 ChromeDriver。 因为只有安装 ChromeDriver,才能驱动 Chrome 浏览器完成相应的操作
下面我们来介绍下怎样安装 ChromeDriver。
2.4 PhantomJS
PhantomJS 是一个无界面的 、可脚本编程的 WebKit 浏览器引擎,它原生支持多种 Web 标准 : DOM
操作、 css 选择器、 JSON 、 Canvas 以及 SVG 。
Selenium 支持 PhantomJS ,这样在运行的时候就不会再弹出 一个浏览器了 。 而且 PhantomJS 的运
行效率也很高,还支持各种参数配置,使用非常方便。
2.5 aiohttp
之前介绍的 requests 库是一个阻塞式 HTTP 请求库,当我们发出一个请求后,程序会一直等待服务
器响应,直到得到响应后,程序才会进行下一步处理。 其实,这个过程比较耗费时间 。 如果程序可以在
这个等待过程中做一些其他的事情,如进行请求的调度 、 响应的处理等,那么爬取效率一定会大大提高 。
aiohttp 就是这样一个提供异步 We b 服务的库,从 Python 3 . 5 版本开始 ,python中加入了async/await关键字,使得回调的写法更加直观和人性化。 aioh即的异步操作借助于 async/await 关键字的写法变得更加简洁,架构更加清晰 。 使用异步请求库进行数据抓取时, 会大大提高效率
3解析库
抓取网页代码之后,下一步就是从网页中提取信息 。 提取信息的方式有多种多样,可以使用正则来提取 ,但是写起来相对比较烦琐 。 这里还有许多强大的解析库 ,如 lxml 、 Beautiful Soup 、 pyquery等 。 此外,还提供了非常强大的解析方法,如 XPath 解析和 css 选择器解析等,利用它们,我们可以高效便捷地从网页中提取有效信息
3.1 lxml
lxml 是 Python 的一个解析库 , 支持 HTML 和 XML 的解析,支持 XPath 解析方式,而且解析效率非常高 。
3.2Beautiful Soup
Beautiful Soup 是 Python 的一个 HTML 或 XML 的解析库,我们可以用它来方便地从网页中提取
数据。 它拥有强大的 API 和多样的解析方式。
3.3pyquery
pyquery 同样是一个强大的网页解析工具,它提供了和 jQuery 类似的语法来解析 HTML 文梢, 支持 css 选择器,使用非常方便。
3.4tesserocr
在爬虫过程中,难免会遇到各种各样的验证码,而大多数验证码还是罔形验证码,这时候我们可以直接用 OCR 来识别 。
4 数据库
作为数据存储的重要部分,数据库同样是必不可少的,数据库可以分为关系型数据库和非关系型
数据库。关系型数据库如 SQLite 、 MySQL 、 Oracle 、 SQL Server 、 DB2 等,其数据库是以表的形式存储;非关系型数据库如 MongoDB 、 Redis,它们的存储形式是键值对,存储形式更加灵活 。
本书用到的数据库主要有关系型数据库 MySQL 及非关系型数据库 MongoDB 、 Redis
4.1 MySQL
MySQL 是一个轻量级的关系型数据库
4.2 MongoDB
MongoDB 是由 C++语言编写的非关系型数据库, 是一个基于分布式文件存储的开源数据库系统 ,
其内容存储形式类似 JSON 对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活
4.3 Redis
Redis 是一个基于内存的高效的非关系型数据库
5 存储库
1.4 节中,我们介绍了几个数据库 的安装方式,但这仅仅是用来存储数据的数据库 , 它们提供了存储服务 , 但如果想要和 Python 交互的话,还需要安装一些 Python 存储库 ,如 MySQL 需要安装PyMySQL , MongoDB 需要安装 PyMongo 等
5.1 PyMySQL
在 Python 3 中, 如果想要将数据存储到 MySQL 中 , 就需要借助 PyMySQL 来操作。
5.2 PyMongo
在 Python 中, 如果想要和 MongoDB 进行交互 ,就需要借助于 PyMongo 库
5.3 redis-py
对于 Redis 来说,我们要使用 redis-py 库来与其交互
5.4 RedisDump
RedisDump 是一个用于 Redis 数据导人/导出的工具,是基于 Ruby 实现的,所以要安装 RedisDump ,需要先安装 Ruby
6 web库
对于 Web ,我们应该都不陌生 , 现在 日 常访问的网站都是 Web 服务程序搭建而成的 。 Python 同样不例外,也有一些这样的 Web 服务程序 ,比如 Flask 、 Django 等 , 我们可以拿它来开发 网站和接口等。在本书中,我们主要使用这些 Web 服务程序来搭建一些 API 接口,供我们的爬虫使用 。 例如,维护一个代理池,代理保存在 Redis 数据库中,我们要将代理池作为一个公共的组件使用,那么如何构建一个方便的平台来供我们获取这些代理呢?最合适不过的就是通过 Web 服务提供一个 API 接口,我们只需要请求接口 即可获取新的代理,这样做简单、高效、实用 !
书中用到的一些 Web 服务程序主要有 Flask 和 Tornado。
6.1 Flask
Flask 是一个轻量级的 Web 服务程序,它简单、易用、灵活,这里主要用来做一些 API 服务
6.2 Tornado
Tornado是一个支持异步的Web框架,通过使用非阻塞I/O流,它可以支撑成千上万的开放连接,效率非常高。
Tornado+Redis来搭建一个ADSL拨号代理池
RedisDump 是一个用于 Redis 数据导人/导出的工具,是基于 Ruby 实现的,所以要安装 RedisDump ,需要先安装 Ruby。
7 App爬取相关库
除了 Web 网页,爬虫也可以抓取 App 的数据 。 App 中的页面要加载出来,首先需要获取数据,而这些数据一般是通过请求服务器的接口来获取的 。 由于 App 没有浏览器这种可以比较直观地看到后台请求的工具,所以主要用一些抓包技术来抓取数据。
本书介绍的抓包工具有 Charles 、 mitmproxy 和 mitmdump。一些简单的接口可以通过 Charles 或mitmproxy 分析,找出规律,然后直接用程序模拟来抓取了 。 但是如果遇到更复杂的接口,就需要利用 mitmdump 对接 Python 来对抓取到的请求和响应进行实时处理和保存。 另外 ,既然要做规模采集,就需要自动化 App 的操作而不是人工去采集,所以这里还需要一个工具叫作 Appium ,它可以像Selenium 一样对 App 进行自动化控制,如自动化模拟 App 的点击 、 下拉等操作 。
7.1 Charles
Charles是什么?有什么作用?
Charles 是一个网络抓包工具 ,相比 Fiddler ,其功能更为强大 , 而且跨平台支持得更好 ,所以这里选用它来作为主要的移动端抓包工具。现在很多页面都在向 HTTPS 方向发展, HTTPS 通信协议应用得越来越广泛 。 如果一个 App 通信应用了 HTTPS 协议,那么它通信的数据都会是被加密的,常规的截包方法是无法识别请求内部的数
据的 。安装完成后,如果我们想要做 HTTPS 抓包的话,那么还需要配置一下相关 SSL 证书。
7.2 mitproxy
mitproxy是什么?有什么作用?
mitproxy是一个支持HTTP和HTTPS的抓包,类似Fiddler、Charles的功能,只不过它通过控制台的形式操作。此外, mitmproxy 还有两个关联组件, 一个是 mitmdump ,它是 mitmproxy 的命令行接口,利用它
可以对接 Python 脚本,实现监听后的处理;另一个是 mitmweb ,它是一个 Web 程序,通过它以清楚地观察到 mitmproxy 捕获的请求。
对于mitmproxy来说,如果想要截获HTTPS请求,就需要设置证书。mitmproxy在安装会提供一套CA证书, 只要客户端信任了mitmproxy 提供的证书,就可以通过 mitmproxy 获取 HTTPS 请求的具体内容,否则 mitmproxy 是无法解析 HTTPS 请求的。
7.3 Appium
Appium是什么?有什么作用?
Appium 是移动端的自动化测试工具,类似于前面所说的 Selenium ,利用它可以驱动 Android 、 iOS等设备完成自动化测试,比如模拟点击 、 滑动 、 输入等操作。
Node.js是什么?有什么作用?
Node.js 就是运行在服务端的 JavaScript
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
8 爬虫框架
我们直接用 requests 、 Selenium 等库写爬虫,如果爬取量不是太大,速度要求不高,是完全可以满足需求的 。 但是写多了会发现其内部许多代码和组件是可以复用的,如果我们把这些组件抽离出来,将各个功能模块化,就慢慢会形成一个框架雏形,久而久之,爬虫框架就诞生了 。利用框架,我们可以不用再去关心某些功能的具体实现,只需要关心爬取逻辑即可。有了它们,可以大大简化代码盘,而且架构也会变得清晰,爬取效率也会高许多 。 所以,如果有一定的基础,上手框架是一种好的选择 。本书主要介绍的爬虫框架有 p)叩ider 和 Scrapy。 本节中,我们来介绍一下 pyspider 、 Scrapy 及其扩展库的安装方式。
8.1 pyspider
pyspider 是国人 binux 编写的强大的网络爬虫框架,它带有强大的 WebUI 、脚本编辑器、任务监控器、项目管理器以及结果处理器,同时支持多种数据库后端、多种消息队列,另外还支持 JavaScript渲染页面的爬取,使用起来非常方便
8.2 Scrapy
Scrapy 是一个十分强大的爬虫框架
8.3 Scrapy-Splash
Scrapy-Splash 是一个 Scrapy 中支持 JavaScript 渲染的工具 。Scrapy-Splash 的安装分为两部分。一个是 Splash 服务的安装,具体是通过 Docker ,安装之后,会启动一个 Splash 服务,我们可以通过它的接口来实现 JavaScript 页面的加载。另外一个是 Scrapy-Splash的 Python 库的安装,安装之后即可在 Scrapy 中使用 Splash 服务
8.4 Scrapy-Redis
Scrapy-Redis 是 Scrapy 的分布式扩展模块,有了它,我们就可以方便地实现 Scrapy 分布式爬虫的搭建
9 部署相关库
如果想要大规模抓取数据,那么一定会用到分布式爬虫。 对于分布式爬虫来说,我们需要多台主机,每台主机有多个爬虫任务,但是源代码其实只有一份 。 此时我们需要做的就是将一份代码同时部署到多台主机上来协同运行,那么怎么去部署就是另一个值得思考的问题。对于 Scrapy 来说,它有一个扩展组件,叫作 Scrapyd ,我们只需要安装该扩展组件,即可远程管理 Scrapy 任务,包括部署源码 、 启动任务、监听任务等 。 另外,还有 Scrapyd-Client 和 Scrapyd API来帮助我们更方便地完成部署和监听操作 。另外,还有一种部署方式,那就是 Docker 集群部署 。 我们只需要将爬虫制作为 Docker 镜像,只要主机安装了 Docker,就可以直接运行爬虫,而无需再去担心环境配置、版本问题。本节中,我们就来介绍相关环境的配置过程。
9.1 Docker
Docker 是一种容器技术,可以将应用和环境等进行打包,形成一个独立的、类似于 iOS 的 App
形式的“应用” 。 这个应用可以直接被分发到任意一个支持 Docker 的环境中, 通过简单的命令即可启动运行。 Docker 是一种最流行的容器化实现方案,和虚拟化技术类似,它极大地方便了应用服务的部署 ;又与虚拟化技术不同,它以一种更轻量的方式实现了应用服务的打包 。 使用 Docker ,可以让每个应用彼此相互隔离,在同一台机器上同时运行多个应用,不过它们彼此之间共享同一个操作系统 。Docker 的优势在于,它可以在更细的粒度上进行资源管理,也比虚拟化技术更加节约资源 。对于爬虫来说,如果我们需要大规模部署爬虫系统的话,用 Docker 会大大提高效率。 工欲善其事 ,必先利其器。
Win10家庭版装Docker
win10下使用docker所遇到的问题汇总
9.2 Scrapyrt
Scrapyrt 为 Scrapy 提供了一个调度的 HTTP 接口,有了它,我们就不需要再执行 Scrapy 命令而是通过请求一个 HTTP 接口来调度 Scrapy 任务了 。 Scrapyrt 比 Scrapyd 更轻量,如果不需要分布式多任务的话 ,可以简单使用 Scrapyrt 实现远程 Scrapy 任务的调度
9.3 Gerapy
爬虫框架
Scrapy-Splash 是一个 Scrapy 中支持 JavaScript 渲染的工具
Gerapy 是一个 Scrapy 分布式管理模块
10 参考资料
python3网络爬虫开发实战,崔庆才著。
来源:CSDN
作者:kimotao
链接:https://blog.csdn.net/zimojiang/article/details/103883325