转自 | 有三AI

作者 | 汤兴旺 言有三


所谓白身,就是什么都不会,还没有进入角色。

对于深度学习,一个好的数据集可以说非常重要的,但是通常情况下我们并没有大量的数据,因此我们有必要掌握一定的爬虫知识,从而更好的准备训练数据集。


01
前端网页基础


在介绍爬虫之前我们先说下网页基础,理解前端网页的一些基础知识对于学习爬虫是很有必要的,它是爬虫的基础之一。


1.1
网页构成


通常情况下我们看到的网页由三部分组成,分别是HTML、CSS和JavaScript,接下来我分别介绍它们。


1.1.1 HTML


HTML,全称Hyper Text Markup Language,也就是“超文本链接标示语言”。但它不是一种编程语言,而是一种标记语言。我们通常看到的网页就是HTML使用标记标签来描述的。在HTML中,通常不同类型的文字通过不同类型的标签来表示。如图片用img标签表示,视频用video标签表示,段落用p标签表示。


现在我们看下网易云音乐的源代码,如下图所示:



获取这个网页的源代码很简单,打开网页后,按下F12键就会出现这个源代码了。通过观察这个HTML我们会发现整个网页就是由各种标签嵌套组合而成的,从而形成了整个网页的架构。


1.1.2 CSS


从上面的介绍我们知道HTML定义了网页的架构,可以认为是一个框架,但若只有HTML,那么这样的网页就太简陋了,为了让我们的网页更加好看点,我们就需要用CSS。


CSS,全称Cascading Style Sheets,即层叠样式表。“层叠”是指当在HTML中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理。“样式”指网页中文字大小、颜色、元素间距、排列等格式。我们来看看网易云音乐的CSS,如下所示。



1.1.3 JavaScript


上面介绍的HTML和CSS只能展现一种静态信息,缺乏交互性。但我们在网页里通常会看到一些交互和动画效果,如提示框、轮播图等,这些动态信息通常就是通过JavaScript完成的。它的出现使得用户与信息之间不只是一种浏览与显示的关系,而是实现了一种实时、动态、交互的页面功能。


这就是网页构成的一些基本知识,你掌握了吗?


1.2
URL


爬虫最主要的处理对象是什么?那毫无疑问肯定是URL,爬虫的实质就是根据URL地址取得所需要的文件内容,然后对它进行进一步的处理。所以说准确理解URL也是理解网络爬虫的基础之一。



URL,全称是Uniform Resource Locator,通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。URL也有它特定的格式,其格式由三部分组成,如下:


1.第一部分是协议(或称为服务方式)。

2.第二部分是存有该资源的主机IP地址(有时也包括端口号)。

3.第三部分是主机资源的具体地址,如目录和文件名等。


通常第一部分和第二部分用“://”符号隔开,第二部分和第三部分用“/”符号隔开。另外第一部分和第二部分是不可缺少的,第三部分有时可以省略。 

我们通过一个URL的一个小例子来解释下上面的三部分,下面是NBA中国官方网站湖人队网页的URL:


http://china.nba.com/lakers/


http这个是协议,也就是HTTP超文本传输协议,它是URL的第一部分;china.nba.com这个是网站名,由服务器名和域名构成,它是URL的第二部分;lakers就是存放网页的根目录,是URL的第三部分。

这就是URL的一些基础知识,希望大家深刻理解。


通过上面的介绍,相信你对网页的基础知识也有了大致的了解,下面我们开始学习爬虫相关库的一些基础知识。


02
python爬虫库


了解了网页的一些基础知识后,我们继续来学习下python爬虫的一些库,我们都知道python有许多库,如NumPy,matplotlib等,针对爬虫它有个自带的库urllib。


2.1
urllib介绍


urllib是python自带的一个主要用来爬虫的标准库,无需安装可以直接用,它能完成如下任务:网页请求、响应获取、代理和cookie设置、异常处理和URL解析,可以说要想学会爬虫,必须要学会它。


2.2
urllib基础用法


我们已经知道urllib能完成网页请求、响应获取等许多任务,现在我来介绍下它的基本用法。


2.2.1 发起GET/POST请求


在用urllib实现GET和POST之前,我们先解释下什么是GET?什么是POST?它们的区别又是啥?


GET和POST实际上就是HTTP请求的两种基本方法,通常GET是从指定的资源请求数据,而POST是向指定的资源提交要被处理的数据。我们再看看它的区别是啥,请看下面表格:



哈哈,你现在看到这些肯定很闷逼。



我们从头(HTTP)来分析下,我们已经知道HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议。HTTP的底层是TCP/IP,所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP连接,GET和POST能做的事情是一样的。


那它们的区别体现在哪呢?对于GET方式的请求,浏览器会把http header和data一并发送出去;而对于POST,浏览器先发送header,服务器响应后,浏览器再发送data。


也就是说,在大万维网世界中,TCP就像汽车,我们用TCP来运输数据,HTTP给汽车运输设定了好几个运输方式,有GET, POST等。GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。


你现在明白它们的区别了吗?我们再看看urllib是如何使用这两个方法的。


在urllib中有个request这个模块,它主要是来负责构造和发起网络请求。它有个urlopen()访问方法,默认的访问方法是GET,我们在urlopen()方法中传入字符串格式的url地址后,此方法会访问目标网址,然后返回访问的结果。请看下面的实例:


from urllib import request

url = "https://zhuanlan.zhihu.com/p/20751612"

html = request.urlopen(url).read().decode("utf-8")

print(html)



urlopen()方法请求返回的对象类型为HTTPResponse对象。


from urllib import request

url = "https://zhuanlan.zhihu.com/p/20751612"

html = request.urlopen(url)

print(type(html))



返回的状态为200,即返回数据。


print(html.status)



返回的数据会是bytes的二进制格式,所以需要decode()一下,转换成字符串格式。


print(html.read().decode("utf-8")



这就是GET方式的一个最基本的运用,对于POST方法的实现其实和GET差不多,只不过多了一个data参数。即若添加data参数,就是以POST请求方式进行,如果没有data参数就是GET请求方式,请看下面一个POST案例。



这里通过使用http://httpbin.org/post网站演示(该网站可以作为练习如何使用urllib的一个站点使用,能够模拟各种请求操作)完成了一次POST请求。


通过上面的介绍我相信你对urllib的基础知识有了一个比较深刻的了解,但这远远不够,需要我们在实践中不断丰富我们的知识库,另外,urllib只是爬虫一个最基础的库,务必掌握,其他一些高端的库根据需要可以自行学会。


到目前为止我们还没有进行爬一些张图片或者视频的实验。下面我们看看如何来爬一些图片。


03
爬虫小实验


在本节我将介绍如何对知乎上某个专栏的一些图片进行爬虫。

话不多说,直接上这个小实验的代码(写在pachong.py文件中)如下:


from urllib import request

from bs4 import BeautifulSoup

import re

import time

url = "https://zhuanlan.zhihu.com/p/20751612"

html = request.urlopen(url).read().decode("utf-8")

soup = BeautifulSoup(html,"html.parser")

links = soup.find_all("img","origin_image zh-lightbox-thumb",src = re.compile(r'.jpg$'))

path = r"/home/tangxingwang/paichong_picture"

for link in links:

    print(link.attrs['src'])

    request.urlretrieve(link.attrs["src"],path+'\%s.jpg' % time.time())  



在本实例中,我们用Beautiful Soup结合正则表达式的方式来提取符合要求的链接,链接要求是在img标签中,class=origin_image zh-lightbox-thumb,而且链接是.jpg结尾。



soup = BeautifulSoup(html,"html.parser")

links = soup.find_all("img","origin_image zh-lightbox-thumb",src = re.compile(r'.jpg$'))


提取出所有链接后,使用request.urlretrieve来将所有链接保存到本地

在终端执行上面程序代码即可爬取图片


python3  pachong.py



04
github爬虫工程


接下来我们看看github上一些优秀的爬虫工程。


4.1
github图片爬虫工程


在github上有许多优秀的图片爬虫项目,我们选择一个对百度图片爬虫的工程详细解释下。下面是这个工程项目的github链接:


https://github.com/kong36088/BaiduImageSpider


我们将其clone下来后,有下图所示的一些文件:



接下来我们打开index.py这个文件,按照自己的需求修改自己的下面这一行代码



我把索引改成了科比,总数为1页,然后运行下面代码


python3 index.py


执行python3 index.py后你会发现有大量的图片在下载,如下图所示:



我们再看下文件的变化,你会现在的文件比我们之前clone下来的多了个科比文件夹,如下图所示:



打开科比这个文件夹,你会发现有许多科比的照片。



关于对百度图片爬虫就讲解到这,github上还有大量这样的项目,如下:


1.该github工程是关于对知乎里面某个问题下所有的图片进行爬虫。下面是链接:


https://github.com/ladingwu/python_zhihu


2.该github工程是关于对微博某个用户相册里面所有的图片进行爬虫。下面是链接:


https://github.com/lincanbin/Sina-Weibo-Album-Downloader


3.该github工程是关于对花瓣里面旅游模块图片进行爬虫,下面是链接


https://github.com/darrenfantasy/image_crawler/tree/master/Huaban


4.该github工程是关于对google image进行爬虫。下面是链接:


https://github.com/Ehco1996/Python-crawler/tree/master/Google-Image


这就是github上一些关于图片爬虫的工程,当然github上关于图片爬虫的工程还有很多,有需要可以自己search再学习学习。


4.2
github视频爬虫工程


说完图片的一些工程,我们再看看github上一些比较好的视频工程。下面这个链接是关于对抖音视频进行爬虫的一个项目。链接如下:


https://github.com/loadchange/amemv-crawler


clone下来有如下文件



现在打开文件`share-url.txt`,把你想要下载的抖音号分享链接编辑进去,以逗号/空格/tab/表格鍵/回车符分隔都行,可以多行。


样式如下:



然后在终端执行 下面代码即可下载


python3 amemv-video-ripper.py



下载后的视频保存在download文件件里面,里面有各个抖音号的小视频



在github中关于视频爬虫的工程实际上还有很多,大家可以去上面看看!


最后附上一个github上关于学习爬虫比较好的干货。链接如下。


https://github.com/Ehco1996/Python-crawler