看的书《Python3 网络爬虫开发实战教程》学习笔记

我光安装都快安装一下午了

python的安装我就不说了

请求库的安装

安装requests

之前介绍的 Requests 库是一个阻塞式 HTTP 请求库,当我们发出一个请求后,程序会一直等待服务器响应,直到得到响应后,程序才会进行下一步处理

Requests 项目的地址是:https://github.com/kennethreitz/requests

kali默认安装了

pip安装

1
pip3 install requests

image-20210115180101413

安装selenium

Selenium 是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击、下拉等操作。对于一些 JavaScript 渲染的页面来说,这种抓取方式非常有效

kali默认安装了

1
pip3 install selenium

​ 验证安装

image-20210115191928580

安装ChromeDriver

因为只有安装 ChromeDriver,才能驱动 Chrome 浏览器完成相应的操作

先查看谷歌浏览器的版本

image-20210115180958747

到这个网站去下载对应的版本

https://chromedriver.chromium.org/downloads

image-20210115181103587

我的系统是linux我就下载linux的

image-20210115181132566

下载好解压出来会有一个这个文件

image-20210115181247783

要移动文件到 /usr/bin 目录。首先,需要在命令行模式下进入其所在路径,然后将其移动到 /usr/bin

命令

1
mv chromedriver /usr/bin

image-20210115181413859

在终端运行chromedriver看看有没有安装成功

image-20210115181703269

应为我是root用户可能无法运行

安装GeckoDriver

那么对于 Firefox 来说,也可以使用同样的方式完成 Selenium 的对接,这时需要安装另一个驱动 GeckoDriver

在github上搜索GeckoDriverimage-20210115183547346

​ 解压出来放到/usr/bin里面

1
mv geckodriver /usr/bin

image-20210115183647787

在终端运行geckodriver看看有没有安装成功

image-20210115183819742

控制台输出

随后执行如下 Python 代码,在程序中测试一下:

1
2
from selenium import  webdriver
browser = webdriver.Firefox()

可以看见成功了

image-20210115184041421

安装PhantomJS

Selenium 支持 PhantomJS,这样在运行的时候就不会再弹出一个浏览器了。而且 PhantomJS 的运行效率也很高,还支持各种参数配置,使用非常方便

下载地址

https://phantomjs.org/download.html

image-20210115184531274

解压出来

1
tar -xvf 文件名

将程序移到一个合适的位置

我叫他移动到/opt/文件里面叫名字改成了phantomjs

1
mv phantomjs-2.1.1-linux-x86_64 /opt/phantomjs

image-20210115185755409

创建软链接到环境变量中。这样可以直接在shell中使用phantomjs命令:

1
ln -sf /opt/phantomjs/bin/phantomjs /usr/local/bin/phantomjs

查看有没有安装好我发现报错了

image-20210115190217821

解决方法

1
export OPENSSL_CONF=/etc/ssl/

在运行就没有报错了

image-20210115190251034

验证安装

1
2
3
4
from selenium import webdriver
browser = webdriver.PhantomJS()
browser.get('https://www.baidu.com')
print(browser.current_url)

运行之后,我们就不会发现有浏览器弹出了,但实际上 PhantomJS 已经运行起来了。这里我们访问了百度,然后将当前的 URL 打印出来

我这个kali有个问题就是必须在这个终端上先输入export OPENSSL_CONF=/etc/ssl/才能正常运行

image-20210115191247966

安装aiohttp

之前介绍的 Requests 库是一个阻塞式 HTTP 请求库,当我们发出一个请求后,程序会一直等待服务器响应,直到得到响应后,程序才会进行下一步处理。其实,这个过程比较耗费资源。如果程序可以在这个等待过程中做一些其他的事情,如进行请求的调度、响应的处理等,那么爬取效率一定会大大提高。

aiohttp 就是这样一个提供异步 Web 服务的库,从 Python 3.5 版本开始,Python 中加入了 async/await 关键字,使得回调的写法更加直观和人性化。aiohttp 的异步操作借助于 async/await 关键字的写法变得更加简洁,架构更加清晰。使用异步请求库进行数据抓取时,会大大提高效率

kali默认安装了

1
pip3 install aiohttp

测试安装

没有报错就成功了

image-20210115191527214

解析库的安装

安装lxml

lxml 是 Python 的一个解析库,支持 HTML 和 XML 的解析,支持 XPath 解析方式,而且解析效率非常高

kali默认安装了

1
pip3 install lxml

验证安装

image-20210115192425347

安装Beautiful Soup

Beautiful Soup 是 Python 的一个 HTML 或 XML 的解析库,我们可以用它来方便地从网页中提取数据。它拥有强大的 API 和多样的解析方式

Beautiful Soup 的 HTML 和 XML 解析器是依赖于 lxml 库的,所以在此之前请确保已经成功安装好了 lxml 库

kali默认安装了

1
pip3 install beautifulsoup4

验证安装

1
2
3
from bs4 import BeautifulSoup
soup = BeautifulSoup('<p>Hello</p>', 'lxml')
print(soup.p.string)

运行结果如下

image-20210115192821626

安装pyquery

pyquery 同样是一个强大的网页解析工具,它提供了和 jQuery 类似的语法来解析 HTML 文档,支持 CSS 选择器,使用非常方便

kali默认安装了

1
pip3 install pyquery

验证安装

image-20210115193051745

安装tesserocr

在爬虫过程中,难免会遇到各种各样的验证码,而大多数验证码还是图形验证码,这时候我们可以直接用 OCR 来识别

什么是OCR,即 Optical Character Recognition,光学字符识别,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。对于图形验证码来说,它们都是一些不规则的字符,这些字符确实是由字符稍加扭曲变换得到的内容。

安装Python的tesserocr的库

1
pip3 install tesserocr 

验证安装

1
2
3
4
import tesserocr
from PIL import Image
image = Image.open('image.png')
print(tesserocr.image_to_text(image))

image-20210115194401778

kali安装tesserocr命令

1
apt-get install -y tesseract-ocr libtesseract-dev libleptonica-dev

验证安装

在这个文件下载一个照片

https://raw.githubusercontent.com/Python3WebSpider/TestTess/master/image.png

然后运行这个命令

image.png是下载的照片文件名

1
tesseract image.png result -l eng && cat result.txt

image-20210115193938266

数据库的安装

可以存储我们爬下来的东西

mysql kali已经默认安装了

关闭和重启 MySQL 服务的命令如下

1
2
3
sudo service mysql start
sudo service mysql stop
sudo service mysql restart

数据库的安装

这个就是叫python调用数据库

我只用mysql就可以了

下载

1
pip3 install pymysql

image-20210115195006127

Web 库的安装

Flask 是一个轻量级的 Web 服务程序,它简单、易用、灵活,这里主要用来做一些 API 服务

安装flask

kail默认安装了

1
pip3 install flask

验证安装

1
2
3
4
5
6
7
8
9
10
from flask import Flask
app = Flask(__name__)

@app.route("/")

def hello():
return "Hello World!"

if __name__ == "__main__":
app.run()

可以发现,系统会在 5000 端口开启 Web 服务,控制台输出如下

image-20210115195542197

安装Tornado

Tornado 是一个支持异步的 Web 框架,通过使用非阻塞 I/O 流,它可以支撑成千上万的开放连接,效率非常高,本节就来介绍一下它的安装方式

kali默认安装了

1
pip3 install tornado

验证安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")

def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])

if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()

直接运行程序,可以发现系统在 8888 端口运行了 Web 服务,控制台没有输出内容,此时访问 http://127.0.0.1:8888/,可以观察到网页中呈现了 Hello,world,如图 1-42 所示,这就说明 Tornado 成功安装了

image-20210115195919280

App 爬取相关库的安装

简单来说就是抓包工具

除了 Web 网页,爬虫也可以抓取 App 的数据。App 中的页面要加载出来,首先需要获取数据,而这些数据一般是通过请求服务器的接口来获取的。由于 App 没有浏览器这种可以比较直观地看到后台请求的工具,所以主要用一些抓包技术来抓取数据。

本书介绍的抓包工具有 Charles、mitmproxy 和 mitmdump。一些简单的接口可以通过 Charles 或 mitmproxy 分析,找出规律,然后直接用程序模拟来抓取了。但是如果遇到更复杂的接口,就需要利用 mitmdump 对接 Python 来对抓取到的请求和响应进行实时处理和保存。另外,既然要做规模采集,就需要自动化 App 的操作而不是人工去采集,所以这里还需要一个工具叫作 Appium,它可以像 Selenium 一样对 App 进行自动化控制,如自动化模拟 App 的点击、下拉等操作。

本节中,我们就来介绍一下 Charles、mitmproxy、mitmdump、Appium 的安装方法

安装的Charles

image-20210115200232611

这个我就不安装了

安装mitmproxy

kali默认安装了

安装 Appium

Appium 是移动端的自动化测试工具,类似于前面所说的 Selenium,利用它可以驱动 Android、iOS 等设备完成自动化测试,比如模拟点击、滑动、输入等操作,其官方网站为:http://appium.io/。本节中,我们就来了解一下 Appium 的安装方式

爬虫框架的安装

简单来说就是可以提升效率

我们直接用 Requests、Selenium 等库写爬虫,如果爬取量不是太大,速度要求不高,是完全可以满足需求的。但是写多了会发现其内部许多代码和组件是可以复用的,如果我们把这些组件抽离出来,将各个功能模块化,就慢慢会形成一个框架雏形,久而久之,爬虫框架就诞生了。

利用框架,我们可以不用再去关心某些功能的具体实现,只需要关心爬取逻辑即可。有了它们,可以大大简化代码量,而且架构也会变得清晰,爬取效率也会高许多。所以,如果有一定的基础,上手框架是一种好的选择。

本书主要介绍的爬虫框架有 pyspider 和 Scrapy。本节中,我们来介绍一下 pyspider、Scrapy 及其扩展库的安装方式

安装pyspider

1
pip3 install pyspider

这个问题太多了

安装Scrapy

Scrapy 是一个十分强大的爬虫框架,依赖的库比较多,至少需要依赖的库有 Twisted 14.0、lxml 3.4 和 pyOpenSSL 0.14。在不同的平台环境下,它所依赖的库也各不相同,所以在安装之前,最好确保把一些基本库安装好。本节就来介绍 Scrapy 在不同平台的安装方法

安装依赖的库

1
apt-get install build-essential python3-dev libssl-dev libffi-dev libxml2 libxml2-dev libxslt1-dev zlib1g-dev

安装

1
pip3 install Scrapy 

image-20210115204850986

验证安装

在命令行下输入 scrapy

image-20210115205014221

安装Scrapy-Redis

Scrapy-Redis 是 Scrapy 的分布式扩展模块,有了它,我们就可以方便地实现 Scrapy 分布式爬虫的搭建

1
pip3 install scrapy-redis

测试安装

1
import scrapy_redis

image-20210115205654455

部署相关库的安装

简单来说就是分布式扫描

如果想要大规模抓取数据,那么一定会用到分布式爬虫。对于分布式爬虫来说,我们需要多台主机,每台主机多个爬虫任务,但是源代码其实只有一份。此时我们需要做的就是将一份代码同时部署到多台主机上来协同运行,那么怎么去部署就是另一个值得思考的问题。

对于 Scrapy 来说,它有一个扩展组件,叫作 Scrapyd,我们只需要安装该扩展组件,即可远程管理 Scrapy 任务,包括部署源码、启动任务、监听任务等。另外,还有 Scrapyd-Client 和 Scrapyd API 来帮助我们更方便地完成部署和监听操作。

另外,还有一种部署方式,那就是 Docker 集群部署。我们只需要将爬虫制作为 Docker 镜像,只要主机安装了 Docker,就可以直接运行爬虫,而无需再去担心环境配置、版本问题。

安装Docker

1
apt install docker 

安装Scrapyd

Scrapyd 是一个用于部署和运行 Scrapy 项目的工具,有了它,你可以将写好的 Scrapy 项目上传到云主机并通过 API 来控制它的运行。

既然是 Scrapy 项目部署,基本上都使用 Linux 主机,所以本节的安装是针对于 Linux 主机的

安装

1
pip3 install scrapyd

后面的我就不安装了可能用不到