Python爬虫下载漫画

在线看漫画时,总是被烦人的广告弹窗,还必须考虑到网速影响,其实在线漫画真正加载的内容只是放置在某个服务器上的图片文件,完全可以使用Python爬虫将图片下载到本地,无论是收藏还是本地观看,都是比较方便而且有效避免了让人无法接受的网速。不得不吐槽学校的网速。。。

1、首先,以4399漫画为要爬取的对象,我们选择已经完结的经典漫画SLAMDUNK(灌篮高手)为例子。

sd0

漫画的首页:

http://www.4399dmw.com/guanlangaoshou/manhua/

观察到完结漫画一共有31卷

sd1

2、点击开第一卷,找到图片,右键审查元素,找到引用的图片位置实际为:

http://dmimg.5054399.com/mh/guanlangaoshou/001v/001.jpg?201208111036

sd2

而实际上?后边的参数没用,即

http://dmimg.5054399.com/mh/guanlangaoshou/001v/001.jpg

sd3

通过URL格式以及对其他链接的尝试,发现了命名规律:

http://服务器基址/xxxv/xxx.jpg

一共有31卷,每卷最多有100话,按照命名规律,可以给出通过第几卷以及第几张图片这两个参数来控制URL,并且当访问到的图片不存在时,会报错:

sd4

由此,可以通过try except来控制

3、根据以上分析,可以编写爬虫代码

import os
import urllib
import urllib2

#返回第几卷
def getjuan(juan):
    if juan<10:
        return '00'+str(juan)+'v/'
    elif juan>=10:
        return '0'+str(juan)+'v/'

#返回第几张jpg
def getjpg(jpg):
    if jpg<10:
        return '00'+str(jpg)+'.jpg'
    elif jpg>=10 and jpg <100:
        return '0'+str(jpg)+'.jpg'
    else:
        return str(jpg)+'.jpg'

#返回合成的url
def geturl(juan,jpg):
    return baseurl +getjuan(juan)+getjpg(jpg)


if __name__ == '__main__':
    baseurl = 'http://dmimg.5054399.com/mh/guanlangaoshou/'
    comic_juan = 1
    comic_jpg = 1
    path = r'f:/aaa/'
    path += u'第'+str(comic_juan)+u'卷'
    if not os.path.exists(path):
        os.mkdir(path)
    os.chdir(path)
    print u'开始下载。。。'
    while True:
        try:
            url = geturl(comic_juan, comic_jpg)
            urllib2.urlopen(url)
            print 'downloading...'+getjuan(comic_juan)+getjpg(comic_jpg)
            urllib.urlretrieve(url, getjpg(comic_jpg))
            comic_jpg += 1
        except urllib2.HTTPError as e:
            if comic_jpg != 1:
                print u'第'+str(comic_juan)+u'卷下载完成'
                print u'第'+str(comic_juan)+u'卷共'+str(comic_jpg-1)+u'张'
                print u'开始下载第'+str(comic_juan+1)+u'卷'
                comic_juan += 1
                comic_jpg = 1
                path = r'f:/aaa/'
                path += u'第'+str(comic_juan)+u'卷'
                if not os.path.exists(path):
                    os.mkdir(path)
                os.chdir(path)
            else:
                print u'全部下载完成'
                break


4、爬虫测试OK

运行成功

sd5

下载到本地的文件

sd6

图片文件打开完全OK

sd7

5、总结:这个爬虫写法相对简单,缺点也是十分明显:首先是单线程,运行效率很低;而且最后生成的文件中多出第32卷的文件夹,是个只读文件,Python对中文的支持是出了名的烂,各种编码方式让人抓狂,这里直接忽略,执行完后自己删除这个文件就好了。。。

BTW:灌篮高手给了我们太多的欢笑和泪水,再次向井上雄彦致敬。感谢如此伟大的作品!!!

Have Fun!

您可能还喜欢...