分享

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

 昵称4zn67 2018-03-16

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

二 网络爬虫简介

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

.

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

可以看到,浏览器为我们自动定位到了相应的HTML位置。将下图中的password属性值改为text属性值(直接在右侧代码处修改):

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们让浏览器记住的密码就这样显现出来了:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

说这么多,什么意思呢?浏览器就是作为客户端从服务器端获取信息,然后将信息解析,并展示给我们的。我们可以在本地修改HTML信息,为网页”整容”,但是我们修改的信息不会回传到服务器,服务器存储的HTML信息不会改变。刷新一下界面,页面还会回到原本的样子。这就跟人整容一样,我们能改变一些表面的东西,但是不能改变我们的基因。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

(1) requests安装

在cmd中,使用如下指令安装requests:

pip install requests11

或者:

easy_install requests

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

requests库的开发者为我们提供了详细的中文教程,查询起来很方便。本文不会对其所有内容进行讲解,摘取其部分使用到的内容,进行实战说明。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

requests.get()方法必须设置的一个参数就是url,因为我们得告诉GET请求,我们的目标是谁,我们要获取谁的信息。运行程序看下结果:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

左侧是我们程序获得的结果,右侧是我们在www.gitbook.cn网站审查元素获得的信息。我们可以看到,我们已经顺利获得了该网页的HTML信息。这就是一个最简单的爬虫实例,可能你会问,我只是爬取了这个网页的HTML信息,有什么用呢?客官稍安勿躁,接下来进入我们的实战正文。

三 爬虫实战

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们先用已经学到的知识获取HTML信息试一试,编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

运行代码,可以看到如下结果:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

可以看到,我们很轻松地获取了HTML信息。但是,很显然,很多信息是我们不想看到的,我们只想获得如右侧所示的正文内容,我们不关心div、br这些html标签。如何把正文内容从这些众多的html标签中提取出来呢?这就是本次实战的主要内容。

(3)Beautiful Soup

爬虫的第一步,获取整个网页的HTML信息,我们已经完成。接下来就是爬虫的第二步,解析HTML信息,提取我们感兴趣的内容。对于本小节的实战,我们感兴趣的内容就是文章的正文。提取的方法有很多,例如使用正则表达式、Xpath、Beautiful Soup等。对于初学者而言,最容易理解,并且使用简单的方法就是使用Beautiful Soup提取感兴趣内容。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

<div id="content", class="showtxt">11

细心的朋友可能已经发现,除了div字样外,还有id和class。id和class就是div标签的属性,content和showtxt是属性值,一个属性对应一个属性值。这东西有什么用?它是用来区分不同的div标签的,因为div标签可以有很多,我们怎么加以区分不同的div标签呢?就是通过不同的属性值。

仔细观察目标网站一番,我们会发现这样一个事实:class属性为showtxt的div标签,独一份!这个标签里面存放的内容,是我们关心的正文部分。

知道这个信息,我们就可以使用Beautiful Soup提取我们想要的内容了,编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

find_all匹配的返回的结果是一个列表。提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除空格,替换为回车进行分段。 在html中是用来表示空格的。replace(‘\xa0’*8,’ ’)就是去掉下图的八个空格符号,并用回车代替:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

程序运行结果如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

可以看到,我们很自然的匹配到了所有正文内容,并进行了分段。我们已经顺利获得了一个章节的内容,要想下载正本小说,我们就要获取每个章节的链接。我们先分析下小说目录:

URL:http://www./1_1094/

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

通过审查元素,我们发现可以发现,这些章节都存放在了class属性为listmain的div标签下,选取部分html代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们将之前获得的第一章节的URL和<a> 标签对比看一下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

还是使用find_all方法,运行结果如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

方法很简单,对Beautiful Soup返回的匹配结果a,使用a.get(‘href’)方法就能获取href的属性值,使用a.string就能获取章节名,编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

最上面匹配的一千多章的内容是最新更新的12章节的链接。这12章内容会和下面的重复,所以我们要滤除,除此之外,还有那3个外传,我们也不想要。这些都简单地剔除就好。

(3)整合代码

每个章节的链接、章节名、章节内容都有了。接下来就是整合代码,将获得内容写入文本文件存储就好了。编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

很简单的程序,单进程跑,没有开进程池。下载速度略慢,喝杯茶休息休息吧。代码运行效果如下图所示:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

(2)实战进阶

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

么,让我们先捋一捋这个过程:

  • 使用requeusts获取整个网页的HTML信息;

  • 使用Beautiful Soup解析HTML信息,找到所有<img>标签,提取src属性,获取图片存放地址;

  • 根据图片存放地址,下载图片。

我们信心满满地按照这个思路爬取Unsplash试一试,编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

答案就是,这个网站的所有图片都是动态加载的!网站有静态网站和动态网站之分,上一个实战爬取的网站是静态网站,而这个网站是动态网站,动态加载有一部分的目的就是为了反爬虫。

对于什么是动态加载,你可以这样理解:我们知道化妆术学的好,贼厉害,可以改变一个人的容貌。相应的,动态加载用的好,也贼厉害,可以改变一个网站的容貌。

动态网站使用动态加载常用的手段就是通过调用JavaScript来实现的。怎么实现JavaScript动态加载,我们不必深究,我们只要知道,动态加载的JavaScript脚本,就像化妆术需要用的化妆品,五花八门。有粉底、口红、睫毛膏等等,它们都有各自的用途。动态加载的JavaScript脚本也一样,一个动态加载的网站可能使用很多JavaScript脚本,我们只要找到负责动态加载图片的JavaScript脚本,不就找到我们需要的链接了吗?

对于初学者,我们不必看懂JavaScript执行的内容是什么,做了哪些事情,因为我们有强大的抓包工具,它自然会帮我们分析。这个强大的抓包工具就是Fiddler:

URL:http://www./fiddler

PS:也可以使用浏览器自带的Networks,但是我更推荐这个软件,因为它操作起来更高效。

安装方法很简单,傻瓜式安装,一直下一步即可,对于经常使用电脑的人来说,应该没有任何难度。

这个软件的使用方法也很简单,打开软件,然后用浏览器打开我们的目标网站,以Unsplash为例,抓包结果如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们可以看到,上图左侧红框处是我们的GET请求的地址,就是网站的URL,右下角是服务器返回的信息,我们可以看到,这些信息也是我们上一个程序获得的信息。这个不是我们需要的链接,我们继续往下看。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们发现上图所示的就是一个JavaScript请求,看右下侧服务器返回的信息是一个json格式的数据。这里面,就有我们需要的内容。我们局部放大看一下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

在这个网站,我们可以按这个按钮进行图片下载。我们抓包分下下这个动作,看看发送了哪些请求。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

通过Fiddler抓包,我们发现,点击不同图片的下载按钮,GET请求的地址都是不同的。但是它们很有规律,就是中间有一段代码是不一样的,其他地方都一样。中间那段代码是不是很熟悉?没错,它就是我们之前抓包分析得到json数据中的照片的id。我们只要解析出每个照片的id,就可以获得图片下载的请求地址,然后根据这个请求地址,我们就可以下载图片了。那么,现在的首要任务就是解析json数据了。

json格式的数据也是分层的。可以看到next_page里存放的是下一页的请求地址,很显然Unsplash下一页的内容,也是动态加载的。在photos下面的id里,存放着图片的id,这个就是我们需要获得的图片id号。

怎么编程提取这些json数据呢?我们也是分步完成:

  • 获取整个json数据

  • 解析json数据

编写代码,尝试获取json数据:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

很遗憾,程序报错了,问题出在哪里?通过错误信息,我们可以看到SSL认证错误,SSL认证是指客户端到服务器端的认证。一个非常简单的解决这个认证错误的方法就是设置requests.get()方法的verify参数。这个参数默认设置为True,也就是执行认证。我们将其设置为False,绕过认证不就可以了?

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

有想法就要尝试,编写代码如下:

认证问题解决了,又有新问题了:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

可以看到,我们GET请求又失败了,这是为什么?这个网站反爬虫的手段除了动态加载,还有一个反爬虫手段,那就是验证Request Headers。接下来,让我们分析下这个Requests Headers:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

专业的解释能说的太多,我挑重点:

  • User-Agent:这里面存放浏览器的信息。可以看到上图的参数值,它表示我是通过Windows的Chrome浏览器,访问的这个服务器。如果我们不设置这个参数,用Python程序直接发送GET请求,服务器接受到的User-Agent信息就会是一个包含python字样的User-Agent。如果后台设计者验证这个User-Agent参数是否合法,不让带Python字样的User-Agent访问,这样就起到了反爬虫的作用。这是一个最简单的,最常用的反爬虫手段。

  • Referer:这个参数也可以用于反爬虫,它表示这个请求是从哪发出的。可以看到我们通过浏览器访问网站,这个请求是从https:///,这个地址发出的。如果后台设计者,验证这个参数,对于不是从这个地址跳转过来的请求一律禁止访问,这样就也起到了反爬虫的作用。

  • authorization:这个参数是基于AAA模型中的身份验证信息允许访问一种资源的行为。在我们用浏览器访问的时候,服务器会为访问者分配这个用户ID。如果后台设计者,验证这个参数,对于没有用户ID的请求一律禁止访问,这样就又起到了反爬虫的作用。

Unsplash是根据哪个参数反爬虫的呢?根据我的测试,是authorization。我们只要通过程序手动添加这个参数,然后再发送GET请求,就可以顺利访问了。怎么什么设置呢?还是requests.get()方法,我们只需要添加headers参数即可。编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

headers参数值是通过字典传入的。记得将上述代码中your Client-ID换成诸位自己抓包获得的信息。代码运行结果如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

皇天不负有心人,可以看到我们已经顺利获得json数据了,里面有next_page和照片的id。接下来就是解析json数据。根据我们之前分析可知,next_page放在了json数据的最外侧,照片的id放在了photos->id里。我们使用json.load()方法解析数据,编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

解析json数据很简单,跟字典操作一样,就是字典套字典。json.load()里面的参数是原始的json格式的数据。程序运行结果如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

图片的ID已经获得了,再通过字符串处理一下,就生成了我们需要的图片下载请求地址。根据这个地址,我们就可以下载图片了。下载方式,使用直接写入文件的方法。

(3)整合代码

每次获取链接加一个1s延时,因为人在浏览页面的时候,翻页的动作不可能太快。我们要让我们的爬虫尽量友好一些。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

下载速度还行,有的图片下载慢是因为图片太大。可以看到右侧也打印了一些警报信息,这是因为我们没有进行SSL验证。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们可以看到,有用的请求并不多,我们逐条分析。我们先看第一个请求返回的信息。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

可以看到第一个请求是GET请求,没有什么有用的信息,继续看下一条。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

很显然,这个就是我们要找的POST请求,我们可以看到POST请求的参数以及返回的json格式的数据。其中url存放的参数如下:

xfsub_api/url.php?key=02896e4af69fb18f70129b6046d7c718&time=1505724557&url=http%3A%2F%2Fwww.iqiyi.com%2Fv_19rr7qhfg0.html&type=&xml=111

这个信息有转义了,但是没有关系,我们手动提取一下,变成如下形式:

xfsub_api/url.php?key=02896e4af69fb18f70129b6046d7c718&time=1505724557&url=http://www.iqiyi.com/v_19rr7qhfg0.html&type=&xml=111

我们已经知道了这个解析视频的服务器的域名,再把域名加上:

http://api./xfsub_api\url.php?key=02896e4af69fb18f70129b6046d7c718&time=1505724557&url=http://www.iqiyi.com/v_19rr7qhfg0.html&type=&xml=111

这里面存放的是什么东西?不会视频解析后的地址吧?我们有浏览器打开这个地址看一下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们再打开这个视频地址:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

(3)编写代码

编写代码的时候注意一个问题,就是我们需要使用requests.session()保持我们的会话请求。简单理解就是,在初次访问服务器的时候,服务器会给你分配一个身份证明。我们需要拿着这个身份证去继续访问,如果没有这个身份证明,服务器就不会再让你访问。这也就是这个服务器的反爬虫手段,会验证用户的身份。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

思路已经给出,希望喜欢爬虫的人可以在运行下代码之后,自己重头编写程序,因为只有经过自己分析和测试之后,才能真正明白这些代码的意义。上述代码运行结果如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

我们已经顺利获得了mp4这个视频文件地址。根据视频地址,使用urllib.request.urlretrieve()即可将视频下载下来。编写代码如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

urlretrieve()有三个参数,第一个url参数是视频存放的地址,第二个参数filename是保存的文件名,最后一个是回调函数,它方便我们查看下载进度。代码量不大,很简单,主要在于分析过程。代码运行结果如下:

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

下载速度挺快的,几分钟视频下载好了。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

对于这个程序,感兴趣的朋友可以进行扩展一下,设计出一个小软件,根据用户提供的url,提供PC在线观看、手机在线观看、视频下载等功能。

项目经理花了半个月整理的爬虫教程!会这三个案例找工作轻轻松!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多