本日のお題2つ目
AndroidでWeb画像クローラアプリを発見してちょっと感動したので僕も作ってみようと思った。
しかし、Eclipseを起動するのもだるいし… と思っていたらAndroid上でPythonが動くなんて話を思い出したのでやってみた
作ってみたけどくだらないですはい。 あとDLしすぎてBANされても僕は知りません
このスクリプトのターゲットは「2ch画像まとめ」( http://pic2ch.giox.org/ )です
起動するとindexを読みに行きます しばらくすると どの画像を集めるかを聞いてきます。
選ぶと後は延々DLし続けます SDカードがあふれても僕は知りません(一応100枚くらいでとまるはず)
ASEに関しては
- http://handasse.blogspot.com/2010/02/androidpythonluajavascript.html
- http://handasse.blogspot.com/2010/04/android-scripting-environment-ase.html
を参考にしました ありがとうございます
ソース
ダイアログの出し方とかはAndroid特有 ほかは普通のPythonプログラム
#!-*- coding:utf-8 -*- import htmlentitydefs import re import urllib import json import os import android # http://snipplr.com/view.php?codeview&id=11344 # 実体参照 & 文字参照を通常の文字に戻す def htmlentity2unicode(text): # 正規表現のコンパイル reference_regex = re.compile(u'&(#x?[0-9a-f]+|[a-z]+);', re.IGNORECASE) num16_regex = re.compile(u'#x\d+', re.IGNORECASE) num10_regex = re.compile(u'#\d+', re.IGNORECASE) result = u'' i = 0 while True: # 実体参照 or 文字参照を見つける match = reference_regex.search(text, i) if match is None: result += text[i:] break result += text[i:match.start()] i = match.end() name = match.group(1) # 実体参照 if name in htmlentitydefs.name2codepoint.keys(): result += unichr(htmlentitydefs.name2codepoint[name]) # 文字参照 elif num16_regex.match(name): # 16進数 result += unichr(int(u'0'+name[1:], 16)) elif num10_regex.match(name): # 10進数 result += unichr(int(name[1:])) return result droid = android.Android(); droid.makeToast("Start index searcher") rs = '<a href="([^"]*)">([^<>]*)</a>\s(\d+)\spieces' rrs = re.compile(rs); f = urllib.urlopen("http://pic2ch.giox.org/feed"); s = f.read(); #print s f.close() l = rrs.findall(htmlentity2unicode(s)); l2 = []; for x in l: l2.append((x[0],x[1],int(x[2]))) ll = reversed(sorted(l2,key=lambda x:x[2])); lll = []; lls = []; for i,x in enumerate(ll): #print i,x[0],x[1].encode("mbcs"),x[2]; lll.append((x[0],x[1],x[2])) lls.append(x[1]+":"+str(x[2])) if i>100: break; droid.dialogCreateAlert("select"); droid.dialogSetItems(lls); droid.dialogShow(); i = droid.dialogGetResponse() print i; i = i.result droid.makeToast("Select:"+lll[i["item"]][1] + "\n" + lll[i["item"]][0]); if not(os.path.exists("/sdcard/ina-img")): os.mkdir("/sdcard/ina-img"); url = lll[i["item"]][0] droid.makeToast("running test web crawler"); f = urllib.urlopen(url); s = f.read(); rs = r"urls:'([^'])*'"; rrs = re.compile(rs); jstr = rrs.search(s).group(0); #print jstr[6:-1]; l = jstr[6:-1].split(":"); for i,x in enumerate(l): print i,"download...",x; droid.makeToast(str(i)+":download... "+ x); nf =urllib.urlopen("http://strage.giox.info/pics3/"+x); f = open("/sdcard/ina-img/p%03d.jpg" % (i),"wb"); f.write(nf.read()); nf.close(); f.close(); if i>100: droid.makeToast("over 100pics!"); break; print len(l) droid.makeToast("complete!");