三个步骤搞定一个爬虫(3)

上两篇文章讲了怎么把整页的文章下载下来,这一次讲一下怎么把整个专栏的文章都下载下来。讲到这里,一个基础的爬虫基本上都完成了,所以技术方面这些东西并不是有什么神秘的,只是很多东西没有学到,没有思路就会觉得不可思议而已。

在我们开始之前我们先把上次遗留下来的问题解决一下。大家想一下,我们在之前是直接就去循环文章的链接了,尽管我们是根据html文档来进行分析判断的,但是似乎还是不够严谨,因为万一我们的判断失误了呢,那么程序就会没有响应并且一直卡在那里,因此我们应该加一个判断。

gbkHf.png

因为我们知道find函数在没有找到目标字符的时候返回-1,所以我们应该判断在不返回-1的情况下才对链接进行循环遍历。

开始工作

分析源码

好了,这次我们是要下载整个推理讨论板块的所有文章,我们还是对网站进行分析先。

gbEE8.png

这是第一页的网址,我们再来看看第二页

gbVUS.png

再来看看第三页

gbZ4g.png

很好,直觉告诉我们,最后的那个数字应该就是页数的意思了,我们试试改成1看看能不能回到第一页。

gbmCQ.png

成功的回到了第一页,那么我们来看看需要循环几次

gbugs.png

一共有38页,372篇文章,我们先来写一个循环看看能不能正确循环出页数

gbKvn.png

因为字符串是不能和整型相加的,并且urllib.openg也只能接受字符参数,所以我们这里用str()把页数的数字转换为字符型,并且连接在网址上。测试一下

gblD0.png

篇幅原因我就不全部截图了,但是我们可以看到,这个循环应该是可以把所有的页数都正确的表示出来的,那么我们现在就要把这个循环语句加到程序中去了。大家想想,我们应该是先到一个具体的页数,然后再爬取该页的链接和文章吧,所以我这个地方的循环应该是加在最外面的一个循环。

gb1bV.png

这样我们的爬虫基本就完工了,下面我们来做一些其他的事情。
首先是对于网站的压力应对,我们现在写的是一个小爬虫,对网站不能造成什么压力,而且是单线爬虫,如果以后写多线程和爬取的内容多的时候,难免造成对网站的请求过于平凡,很多时候爬虫就会被服务器封杀掉,这时我们就要限制爬虫的速度了。
我们先来导入一个模块

gbGUU.png

然后在每次下载完成的时候让程序暂停一下,我这里设置的是1秒钟

gbJ5F.png

然后我们再来看看我们的爬虫,大家不知道有没有发现,我们下载的文章的保存名字似乎是一个递增的数字,那么我猜想可能是这个网站累计文章的篇数,为了证实这个猜想,我们到最后几页去看看。我们先来看看37页的html代码.

gbU29.png

这是我们发现我们用来命名文件的数字由4位数变成了3位数,又变成了2位数,我们这个时候在来看看我们的下载保存路径。

gbavR.png

这时我们要注意到,如果文章命名的数字变成2位数的时候,命名的切片操作会把文章链接中的/符号也加进去,这时就会构成一个新的下载路径了,由于我们并没有这样的路径,所有程序就会报错。具体错误是没有一个这样的文件指向。这个是怎么样的情形大家可以自己去实验一下。下面我们就要解决这个问题,想办法把/替换掉或者去掉。我们当然可以用find找出最后的/的下标,再从下标加1的地方去执行命名,但是这样无疑会多写出几行代码来,而且每次都要去判断,之后命名的代码也要重写,这样似乎工作量就上去了。我们可以换一个想法来解决这个问题,比如说在原有的命名代码中,只要发现有/字符存在的,一律替换为空或者其他。下面我们来看一个函数。

gbwK1.png

字符串的replace函数可以将字符串中的目标字符替换成其他的字符,这时我们来这样写。

gbBb6.png

就这样,我们就可以轻松的把我们切片中的/给去掉了我们运行一下看看是否可以下载。先看看目录下面有什么。

gby5D.png

这些都是上一次我们下载的东西,我们删除掉。

gbcPe.png

现在目录已经是空的了,我们现在开始下载试试。

gbsUO.png

一堆end之后我们的文件下载好了,我们去看看.

gbg8H.png

一大堆的文件,我们看看数量

gbrVK.png

372个,刚好对应了372篇文章。就这样,我们就完成了一个定制的爬虫。

本文地址:http://damiantuan.xyz/2017/11/19/三个步骤搞定一个爬虫(3)/
转载请注明出处,谢谢!

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------