用Python抓漫画

我现在只追海贼王、火影、死神这三部漫画,一般在SF在线漫画上看。这地方的好处就是看漫画的时候点一下图片就会翻下一页,不像有些文章非要点“下一页”,还整得贼小,周围都是广告。但有时加载图片会发生错误,显示一半就罢工了,无论你怎么刷新都没用。

今天看漫画的时候(一般是周四更新)突然想何不把漫画抓下来看呢。于是,我看了一下网页源码,发现它每张图片会附带一个随机数,猜都没得猜,比如,火影第524话的第1页http://hotpic.sfacg.com/Pic/OnlineComic1/Naruto/524/001_3760.png。没办法,继续看源码。居然发现有个js文件包含了这一话所有图片的网址兴奋

接下来的问题是一个古老的问题,用什么语言呢?我决定尝尝鲜,Python吧,不说它擅长网络事务么。搜了一下,决定用urllib库

先把js文件抓下来:

 

解释一下,由于是js文件,而且有中文编码,所以用quote()先编个码。这时,汉字不管它,但有些符号也跟着变了,比如,空格是“%20”,冒号是“%3A”,……,详见

下面是把url指向的图片抓下来(暂时放桌面吧):

 

这里多亏了urlretrieve(url, filename)老兄,它负责把url所指的东西抓下来写进filename里。

顺便复习一下正则表达式:

PythonPython正则表达式

Python的正则表达式模块叫re。

 

常用的函数有这么几个:

  • match()和search(),功能类似,但match()只从头匹配,而search()则可以匹配任意位置。

 

  • split()

 

  • findall()和finditer()

 

 

  • sub(patternreplstring),把string中所有匹配pattern的子串全部替换为repl。

 

  • group(), start(), end(), span():用于查询匹配结果,group()返回被匹配的字串,start()和end()分别返回匹配的开始和结束位置,span()返回一个元组(开始位置,结束位置)

详见官方说明Python正则表达式操作指南

    火影

    P.S. 有个哥们写了个比较详细的urllib介绍

    P.P.S. Mac上看漫画推荐Simple ComicSimple Comic,可以直接看压缩文件。所以,最好把下载下来的png图片打个包:

     

    完整代码:

    import urllib
    
    one_piece_url = "http://hotpic.sfacg.com/Utility/2/"
    n = "640"
    comic_url = one_piece
    comic_name = "OnePiece"
    
    str = urllib.urlopen(comic_url + n + ".js").read()
    url_encoding = [["\n", " "], ["%20", " "], ["%22", '"'], ["%3A", ":"], ["%3B", ";"], ["%3D", "="], ["%5B", "["], ["%5D", "]"]]
    pages = urllib.quote(str)
    for pair in url_encoding:
        pages = pages.replace(pair[0], pair[1])
    print "js: " + pages
    print "end js\n"
    
    import re
    count = 1
    for m in re.finditer(r'(http:[\w./]+.png)', pages):
        print "url: ", m.group(1)
        print "end url\n"
    
        url = m.group(1)
        path = r"/Users/Pope/Desktop/%d.png" % count
        count += 1
        data = urllib.urlretrieve(url,path)
    
    import zipfile
    import glob
    import os
    directory = "/Users/Pope/Desktop/"
    f = zipfile.ZipFile( directory + comic_name + n + '.zip', 'w' )
    for img in glob.glob( os.path.join( directory, '*.png' ) ):
        f.write( img )
        os.remove( img )
    f.close()


    • 0
      点赞
    • 1
      收藏
      觉得还不错? 一键收藏
    • 1
      评论
    评论 1
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值