教授花3K购入三个Python爬虫教材, 知乎大佬看完后大喜,
image
一、前言
本文的实战内容有:
-
网络小说下载(静态网站)
-
优美壁纸下载(动态网站)
-
爱奇艺VIP视频下载
二、网络爬虫简介
网络爬虫,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网站链接。
在讲解爬虫内容之前,我们需要先学习一项写爬虫的必备技能:审查元素
1. 审查元素
image
image
image
我们可以看到,右侧出现了一大推代码,这些代码就叫做HTML。什么是HTML?举个容易理解的例子:我们的基因决定了我们的原始容貌,服务器返回的HTML决定了网站的原始容貌。
image
image
image
image
再举个小例子:我们都知道,使用浏览器"记住密码"的功能,密码会变成一堆小黑点,是不可见的。可以让密码显示出来吗?可以,只需给页面"动个小手术"!以淘宝为例,在输入密码框处右键,点击检查。
image
image
就这样,浏览器"记住的密码"显现出来了:
image
image
2. 简单实例
网络爬虫的第一步就是根据URL,获取网页的HTML信息。在Python3中,可以使用urllib.request和requests进行网页爬取。
-
urllib库是python内置的,无需我们额外安装,只要安装了Python就可以使用这个库。
-
requests库是第三方库,需要我们自己安装。
image
image
image
image
image
requests.get()方法必须设置的一个参数就是url,因为我们得告诉GET请求,我们的目标是谁,我们要获取谁的信息。我们将GET请求获得的响应内容存放到req变量中,然后使用req.text就可以获得HTML信息了。运行结果如下:
image
image
三、爬虫实战
实战内容由简单到复杂,难度逐渐增加,但均属于入门级难度。下面开始我们的第一个实战内容:网络小说下载。
1. 小说下载
(1)实战背景
image
image
image
用已经学到的知识获取HTML信息试一试,编写代码如下:
image
运行Python爬虫代码,可以看到如下结果:
image
image
(3)Beautiful Soup
image
Beautiful Soup的安装方法和requests一样,使用如下指令安装(也是二选一):
-
pip install beautifulsoup4
-
easy_install beautifulsoup4
image
现在,我们使用已经掌握的审查元素方法,查看一下我们的目标页面,你会看到如下内容:
image
image
image
image
知道这个信息,我们就可以使用Beautiful Soup提取我们想要的内容了,编写代码如下:
image
image
image
image
我们可以看到,我们已经顺利匹配到我们关心的正文内容,但是还有一些我们不想要的东西。比如div标签名,br标签,以及各种空格。怎么去除这些东西呢?我们继续编写代码:
image
image
image
程序运行结果如下:
image
image
image
image
image
image
image
image
我们将之前获得的第一章节的URL和<a> 标签对比看一下:
image
image
image
还是使用find_all方法,运行结果如下:
image
image
方法很简单,对Beautiful Soup返回的匹配结果a,使用a.get('href')方法就能获取href的属性值,使用a.string就能获取章节名,编写代码如下:
image
image
image
image
(3)整合代码
每个章节的链接、章节名、章节内容都有了。接下来就是整合代码,将获得内容写入文本文件存储就好了。编写代码如下:
image
很简单的程序,单进程跑,没有开进程池。下载速度略慢,喝杯茶休息休息吧。代码运行效果如下图所示:
image
GIF
2. 优美壁纸下载
(1)实战背景
image
image
image
(2)实战进阶
image
image
image
那么,让我们先捋一捋这个过程:
-
使用requeusts获取整个网页的HTML信息;
-
使用Beautiful Soup解析HTML信息,找到所有<img>标签,提取src属性,获取图片存放地址;
-
根据图片存放地址,下载图片。
我们信心满满地按照这个思路爬取Unsplash试一试,编写代码如下:
image
image
image
答案就是,这个网站的所有图片都是动态加载的!网站有静态网站和动态网站之分,上一个实战爬取的网站是静态网站,而这个网站是动态网站,动态加载有一部分的目的就是为了反爬虫。
image
动态网站使用动态加载常用的手段就是通过调用JavaScript来实现的。怎么实现JavaScript动态加载,我们不必深究,我们只要知道,动态加载的JavaScript脚本,就像化妆术需要用的化妆品,五花八门。有粉底、口红、睫毛膏等等,它们都有各自的用途。动态加载的JavaScript脚本也一样,一个动态加载的网站可能使用很多JavaScript脚本,我们只要找到负责动态加载图片的JavaScript脚本,不就找到我们需要的链接了吗?
image
image
image
image
image
image
image
image
image
image
image
通过Fiddler抓包,我们发现,点击不同图片的下载按钮,GET请求的地址都是不同的。但是它们很有规律,就是中间有一段代码是不一样的,其他地方都一样。中间那段代码是不是很熟悉?没错,它就是我们之前抓包分析得到json数据中的照片的id。我们只要解析出每个照片的id,就可以获得图片下载的请求地址,然后根据这个请求地址,我们就可以下载图片了。那么,现在的首要任务就是解析json数据了。
image
编写代码,尝试获取json数据:
image
image
image
有想法就要尝试,编写代码如下:
image
认证问题解决了,又有新问题了:
image
可以看到,我们GET请求又失败了,这是为什么?这个网站反爬虫的手段除了动态加载,还有一个反爬虫手段,那就是验证Request Headers。接下来,让我们分析下这个Requests Headers:
image
image
image
image
image
image
image
headers参数值是通过字典传入的。记得将上述代码中your Client-ID换成诸位自己抓包获得的信息。代码运行结果如下:
image
image
image
解析json数据很简单,跟字典操作一样,就是字典套字典。json.load()里面的参数是原始的json格式的数据。程序运行结果如下:
image
image
image
下载速度还行,有的图片下载慢是因为图片太大。可以看到右侧也打印了一些警报信息,这是因为我们没有进行SSL验证。
image
学会了爬取图片,简单的动态加载的网站也难不倒你了。赶快试试国内的一些图片网站吧!
3. 爱奇艺VIP视频下载
(1)实战背景
image
image
image
image
这样,我们就可以在线观看这些VIP视频了:
image
但是这个网站只提供了在线解析视频的功能,没有提供下载接口,如果想把视频下载下来,我们就可以利用网络爬虫进行抓包,将视频下载下来。
(2)实战升级
分析方法相同,我们使用Fiddler进行抓包:
image
我们可以看到,有用的请求并不多,我们逐条分析。我们先看第一个请求返回的信息。
image
image
image
image
image
image
image
这个信息有转义了,但是没有关系,我们手动提取一下,变成如下形式:
image
我们已经知道了这个解析视频的服务器的域名,再把域名加上:
image
image
image
image
image
再打开这个视频地址:
image
image
接下来,我们的任务就是编程实现我们所分析的步骤,根据不同的视频播放地址获得视频存放的地址。
现在梳理一下编程思路:
image
(3)编写代码
image
image
image
思路已经给出,希望喜欢爬虫的人可以在运行下代码之后,自己重头编写程序,因为只有经过自己分析和测试之后,才能真正明白这些代码的意义。上述代码运行结果如下:
image
image
image
image
image
image
image
image
GIF