用Python爬取图片网站——基于BS4+多线程的处理

我有一个朋友,喜欢在一个图站看图(xie)片(zhen),光看就算了,他还有收集癖,想把网站的所有图片都下载下来,于是找我帮忙。
本业余玩家经过【好久的】研究,终于实现,写成本教程。本人经济学专业,编程纯属玩票,不足之处请指出,勿喷,谢谢。
本文分两部分:第一部分是基础方法,也就是单线程下爬图片的流程;第二部分是使用了多线程的功能,大大提高了爬取的效率。

前言

本次爬取基于的是BeautifulSoup+urllib/urllib2模块,Python另一个高效的爬虫模块叫Scrapy,但是我至今没研究懂,因此暂时不用。

基础流程

说明

此次爬取,在输入端仅需要一个初始网址(为避免彼网站找我麻烦,就以URL代替),以及文件保存路径(为保护我隐私,以PATH代替),大家在阅读代码时敬请注意。
从该网站下载图片以及文件处理有如下几步:【我要是会画流程图就好了】
1.打开网站首页,获得总页数,获得每个专辑的链接;
2.点进某专辑,获得专辑的标题作为保存的文件夹名,并获得该专辑的页数;
3.获取每个图片的链接
4.下载图片,以网站上图片的文件名保存至本地,同时对应第2步的文件夹。

代码和解释

注1:获取页码的方法,因为页码的HTML源码为<a href="/albums/XiuRen-27.html">27</a>
注2:因为我发现该网站翻页后的网址即为首页网址后加页码数字
注3:专辑标题的HTML源码为<div class=”title”><span class=”name”>专辑标题</span></div>

注4:将专辑标题命名为文件夹名,这里要给title字符串做些处理,下问讲
注5:放每个专辑自己链接的HTML源码为<td><a href="/photos/XiuRen-5541.html" target="_blank"></a></td>
注6、7:放图片的HTML源码为<div class="pic_box"><i.m.g(为防系统认为有图片) src=" " alt=" "></div>
通过find_all('div', class_ = 'pic_box')找到放图的区块,然后用find('img')找到图片的标签,再用get('src')的方法获取图片链接

通过以上的代码,下载所有图片并保存到对应的文件夹的流程就笨拙地完成了。该方法效率极低,首先是单线程操作,其次用了N次嵌套循环,因此我想到了借助多线程提高效率的方式。

多线程方法

介绍

Python多线程的方法在网上有很多文章介绍,但是都好(是)像(我)很(水)复(平)杂(低),后来我发现了一个模块,寥寥几行就实现了功能。

from multiprocessing.dummy import Pool as ThreadPool
import urllib2

url = “http://www.cnblogs.com
urls = [url] * 50
pool = ThreadPool(4)
results = pool.map(urllib2.urlopen, urls)
pool.close()
pool.join()

其中,urls是一个列表,该模块正是用map(func, list)的方法将list的元素从前到后送入至func运算。results传出的是一个列表类

在本案例中应用

QQ图片20160425095743

附加

由于我处的网络环境实在是太奇葩了,即使网页打得开、视频流畅,在用urlopen时却各种timeout,因此我添加了以下代码,将最后的链接字典保存成一个文件。

之后直接读取该文件。同时为了让程序在无数次蛋疼的timeout报错中自己不断重试,又进一步增加了循环语句。

写到这里,本程序就写完了,接下来就是跑起来然后看着一个个文件夹在电脑里冒出来,然后一个个图片如雨后春笋般出现吧。

以上です

最后,读者可修改我的代码为自己所用,文章转载请注明出处。(虽然我知道没人会转的)

1 7 收藏 1 评论

相关文章

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部