用 Python 抓漫画(2011-01-21)

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

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

兴奋

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

先把js文件抓下来:

import urllib  
str = urllib.urlopen('http://hotpic.sfacg.com/Utility/4/523.js').read()  
str = urllib.quote(str).replace("/n", " ").replace("%20", " ").replace("%22", "/"").replace("%3A", ":").replace("%3B", ";").replace("%3D", "=")  
print str  

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

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

import re  
count = 1  
for m in re.finditer(r'/"(http:[//w/.]+png)/"', str):  
    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) 

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

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

Python的正则表达式模块叫re

import re  

常用的函数有这么几个:

  • match()search(),功能类似,但match()只从头匹配,而search()则可以匹配任意位置。
>>> re.match("c", "abcdef")  # No match  
>>> re.search("c", "abcdef") # Match  
<_sre.SRE_Match object at ...>  
  • split()
>>> re.split('/W+', 'Words, words, words.')  
['Words', 'words', 'words', '']  
  • findall()finditer()
>>> re.findall("(/w+)", "Pope is a dog.")  
['Pope', 'is', 'a', 'dog']  
>>> for m in re.finditer("(/w+)", "Pope is a dog."):  
...     print m.group()  
...   
Pope  
is  
a  
dog 
  • sub(pattern, repl, string),把string中所有匹配pattern的子串全部替换为repl
>>> re.sub(r"(/w+)", r"@/1@","Pope is a dog.")  
'@Pope@ @is@ @a@ @dog@.'  
  • group(), start(), end(), span():用于查询匹配结果,group()返回被匹配的字串,start()end()分别返回匹配的开始和结束位置,span()返回一个元组(开始位置,结束位置)。详见官方说明 Python 正则表达式操作指南

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

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

import zipfile   
import glob  
import os  
directory = "/Users/Pope/Desktop/"  
f = zipfile.ZipFile( directory + 'naruto_523.zip', 'w' )   
for img in glob.glob( os.path.join( directory, '*.png' ) ):  
    f.write( img )  
f.close()  

完整代码:

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()  

  1. UPDATE 2017-12-09: 现在这个网页已经失效了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容

  • 其实从接触python到现在已经快大半年了,中间看过不少的视频,也跟着别人的教程写过不少东西,但是到现在还感觉没有...
    VB过得VB阅读 2,062评论 4 10
  • 1 前言 作为一名合格的数据分析师,其完整的技术知识体系必须贯穿数据获取、数据存储、数据提取、数据分析、数据挖掘、...
    whenif阅读 18,072评论 45 523
  • 无聊浏览某漫画网站(你懂的。-_-),每次翻页时都需要重新请求整个页面,页面杂七杂八的内容过多,导致页面加载过程耗...
    msq3阅读 21,100评论 6 34
  • 不想想得太多,只是偶尔问一句:值得吗?每做一件事情,都这么问自己,得到的答案却是,不知道。生活就是这样,你没走过的...
    易简易峰阅读 134评论 1 0
  • 一开始知道罗马尼亚的签证要去到北京办的时候,我内心是拒绝的。但可能是缘分或者是注定的,最后还是坚持选择去罗马尼亚的...
    志恒_eb2c阅读 328评论 0 0