Python项目实战:抓取美女写真图片

最近看到一个福利网站,但是查看图片需要一页页的点击,觉得比较烦,所以我决定用刚学的Python把网站上的图片抓下来并保存到本地,想怎么看就怎么看。不过还是少看点,怕男同胞们身体吃不消,女同胞们可以使用类似的方法去抓你们想要的图片(如果有女程序员让我看到你)。

1. 预备知识

我们这次使用到两个库,分别是 requests 、BeautifulSoup。

这次使用的库是 requests ,不是Python3自带的urllib.request 库,而是一个基于urllib3的强大的第三方库。

本次主要使用到的是requests.get() 方法,用于获取某个网页。关于该库的其他方法,可点击这个网址进行查看:

http://docs.python-requests.org/zh_CN/latest/user/quickstart.html 。

BeautifulSoup 是一个可以从HTML或XML文件中提取数据的Python库,关于该库的详细用法可点击这个网址进行查看:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html 。

2. 项目目标

抓取MM131美女写真图片,并将这些图片下载到本地指定文件夹。

URL:http://www.mm131.com/qingchun/

先来看看这个网站长什么样:

MM131

这个网站共有6种类型的美女图片:性感美女、清纯美眉、美女校花、性感车模、旗袍美女、明星写真,我们这次的目标就是把这6种类型的图片全部抓取。

抓取后的效果图如下,每个图集是一个独立的文件夹:

文件夹

打开某个文件夹:

美女图片

3. 实现步骤

声明一下,这个是我自己的思路,一定不是最好的,大家可以有更好的思路,欢迎交流。

步骤1:写一个函数,用于获取某一个图片类型每一页的页面链接,如 清纯美眉,共31页,需要将每一页的页面链接拿到。

步骤2:写一个函数,用于获取某一个页面的全部图集链接,如 清纯美眉第一页,拿到这个页面的所有的图集链接,注意看每一个图集的链接,有什么统一的规则。

步骤3:写一个函数,用于将某一图集的所有图片保存下来,如 清纯美眉第一个第一个图集,把这个图集的所有图片都保存下来。

步骤4:开始执行以上的函数,验证是否得到想要的结果。

以上每一个步骤环环相扣,大家可以先思考下自己该怎么做。仔细研究一下不同图片类型的页面链接、图集链接之间的相同点和不同点,然后构思写代码。不要一次性全部下载,在写每一个函数时,传入一个具体的链接进行测试,保证每个函数都满足要求后,再批量下载。

下面进入详细说明。

3.1 requests 和 BeaufitulSoup库安装

在终端中输入命令:

pip3 install requests

pip3 install BeautifulSoup

注意,尤其是MAC的小朋友,安装命令使用 pip3,pip 默认安装到系统自带的Python2中。

3.2 获取某个图片类型所有页面的页面链接

我们分别选择清纯美眉、性感美女这两个图片类型,要想获得该类型的所有页面链接,需要知道翻页。通过右键点击并选择检查,不难发现每一个页面链接都是有一个固定规则:

我们对比一下,清纯美眉的页面链接:

第1页:

http://www.mm131.com/qingchun/

第2页:

http://www.mm131.com/qingchun/list_1_2.html

第3页:

http://www.mm131.com/qingchun/list_1_3.html

第n页:

http://www.mm131.com/qingchun/list_1_n.html

性感美女的页面链接:

第1页:

http://www.mm131.com/xinggan/

第2页:

http://www.mm131.com/xinggan/list_6_2.html

第3页:

http://www.mm131.com/xinggan/list_6_3.html

第n页:

http://www.mm131.com/xinggan/list_7_n.html

发现了什么规则没?只有两个变量,即 图片类型 和 图片类型的序号,也就是网址可以写成:

http://www.mm131.com/图片类型/list_图片类型序号_页码.html 。

知道这个规则就好办了,那么,我们现在如何知道有多少页呢?这个时候就需要使用BeautifulSoup这个库了。下面看具体的代码:

我们在文件开头,首先定义了一个字典,用于存储图片类型和其对应的序列。

文件末尾对写的代码进行了测试,同样可以输入其他图片类型进行测试,结果显示是正确的。

由此,我们得到了不同图片类型的所有页面链接。

3.3 获取某一个页面的全部图集链接

我们选择清纯美眉这个图片类型,查看其所有的图集链接之间有什么特定的规则。

通过右键并选择检查,我们看到所有的图集都在一个类名叫 “list-left public-box” 中,且每个图集链接都在标签<dd></dd>中。我们如何获取到这些图集链接呢?

这里还要注意一下,页面的链接也在这个标签中,利用什么方法将其过滤呢?

我使用的方法不一定是最好的,欢迎思考,下面继续看代码:

测试输出结果OK,说明我们获取的图集链接也OK了。下面就剩下最后一步了,就是把每个图集的图片都下载下来。

3.4 将某一图集的所有图片保存下来

我们随便选择一个图集,通过开发者工具我们看到每一张图片的链接:

每一张图片的链接都是由该图集的链接加上图片的顺序组成的。因此,你只需要知道这个图集有多少张图片,然后通过一个循环就可以获取到该图集所有的图片链接了。下面看具体的代码:

对程序进行测试,结果OK。因为是测试程序,因此最后使用了切片的形式,只下载部分图集。

至此,抓取美女写真图片的任务就完成了,累计不到120行代码,激不激动,惊不惊喜!

完整代码,请点击我的Github查看:

https://github.com/cunxi1992/grab_beautiful_girls_pictures,

期待大家点击小星星给点鼓励:

4. 总结思考

从上述代码的构思流程,可以看到整体的设计一环扣一环,且将同一类的任务使用了函数进行封装,而不是使用if之类的语句。也许你有更好的方式,欢迎交流。

这个任务只完成了两点:

1. 成功抓取到图片,并将图片进行重命名后保存到指定的文件夹,文件夹使用图集的名称

2. 开始下载后,要有下载进度的提示,当前已下载图集数、剩余图集数、正在下载第几张图片

其实,还有其他的地方没做处理,如:请求多长时间获取不到结果时,该怎么办。这个可以思考下,想想怎么做。

最重要的一点,遇到不明白的知识点需要查看文档进行学习。我也是第一次爬虫,中间遇到了好多问题,先后查看了requests 和 BeautifulSoup 文档后才开始写,中间还总是遇到错误。

不明白的没关系,我们可以学,大家加油!有问题欢迎咨询我!

为了方便系统性的学习知识和参与项目实战,希望大家关注文章下方的广告区推广的号,是我自己运营的,头条上面很多想做的事情受到了极大的限制,知识内容无法形成结构性,也不方便交流,很多的互动和活动都在那个号上,欢迎加入,感谢支持~~

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部