最近看到一个福利网站,但是查看图片需要一页页的点击,觉得比较烦,所以我决定用刚学的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 文档后才开始写,中间还总是遇到错误。
不明白的没关系,我们可以学,大家加油!有问题欢迎咨询我!
为了方便系统性的学习知识和参与项目实战,希望大家关注文章下方的广告区推广的号,是我自己运营的,头条上面很多想做的事情受到了极大的限制,知识内容无法形成结构性,也不方便交流,很多的互动和活动都在那个号上,欢迎加入,感谢支持~~