Created
January 15, 2014 05:53
-
-
Save furaibo/8431493 to your computer and use it in GitHub Desktop.
2Dbookloaderからフリーアップロードファイルを取得するスクリプトです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
#-*- coding:utf-8 -*- | |
# 2Dbookloaderからフリーアップロードファイルを取得するスクリプト | |
# パッケージのインポート | |
import os | |
import sys | |
import re | |
import urllib | |
import urllib2 | |
import StringIO | |
import gzip | |
import time | |
from datetime import datetime | |
from BeautifulSoup import BeautifulStoneSoup | |
from HTMLParser import HTMLParser | |
# 関数定義 | |
# HTMLタグを取り除くクラスと関数 | |
class MLStripper(HTMLParser): | |
def __init__(self): | |
self.reset() | |
self.fed = [] | |
def handle_data(self, d): | |
self.fed.append(d) | |
def get_data(self): | |
return ''.join(self.fed) | |
def strip_tags(html): | |
s = MLStripper() | |
s.feed(html) | |
return s.get_data() | |
# 指定したURLのHTMLページの内容をダウンロードする関数 | |
def html_download(html_url): | |
# ダウンロード間隔を開けるため、一時停止 | |
time.sleep(2) # 2秒間一時停止する | |
# 例外処理 | |
# HTMLページを取得しリストに格納 | |
# 失敗時にはエラーメッセージのみ返す | |
try: | |
# HTTPリクエスト | |
req = urllib2.Request(html_url, headers={'User-Agent' : 'Magic Browser', 'Accept-encoding' : 'gzip'}) | |
con = urllib2.urlopen(req) | |
html = con.read() | |
# body部分がgzip化されている場合の処理 | |
if con.info().get('Content-Encoding') == 'gzip': | |
data = StringIO.StringIO(html) | |
gzipper = gzip.GzipFile(fileobj=data) | |
html = gzipper.read() | |
except urllib2.URLError, e: | |
sys.exit("Error! : URLエラーにより画像を取得できません") | |
except urllib2.HTTPError, e: | |
sys.exit("Error! : HTTPエラーにより画像を取得できません") | |
# 戻り値 | |
return html | |
# 2Dbookloaderからzipファイルをダウンロードする関数 | |
def zip_2dbook_download(dl_path, file_name): | |
# ダウンロード間隔を開けるため、一時停止 | |
time.sleep(5) # 5秒間一時停止する | |
# 変数 | |
output = "" # 出力ファイル名 | |
file_url = "" # ファイルのURL | |
# 正規表現 | |
pat_output = re.compile('.+/(.*)$') | |
# URL指定 | |
urls = [ | |
"http://199.189.108.116/file/%s.zip"%(file_name), | |
"http://173.45.36.44/file/%s.zip"%(file_name), | |
"http://67.208.80.59/file/%s.zip"%(file_name), | |
"http://199.189.108.116/file/%s.rar"%(file_name), | |
"http://173.45.36.44/file/%s.rar"%(file_name), | |
"http://67.208.80.59/file/%s.rar"%(file_name), | |
] | |
# ページの存在を確認 | |
for i in urls: | |
ret = urllib.urlopen(i) | |
if ret.getcode() == 200: | |
file_url = i | |
m = pat_output.match(i) | |
if m is not None: | |
output = "%s/%s"%(dl_path, m.group(1)) | |
print output # ファイルの出力先を表示する | |
break | |
# 一致したものがなければ終了する | |
if file_url == "": | |
print "ファイルが見つかりませんでした" | |
return | |
# URLよりファイルを取得する | |
# もし同名のzipファイルが存在するならば、上書きは行わない | |
if not os.path.exists(output): | |
urllib.urlretrieve(file_url, output) | |
# 戻り値 | |
return | |
# main関数 | |
if __name__ == '__main__': | |
# 変数 | |
dl_path = "./downloads" # ファイルのダウンロード先ディレクトリ | |
count = 0 # ダウンロードしたファイル数 | |
count_limit = 50 # ダウンロードするファイルの数の上限 | |
start_page = 1 # ダウンロードを開始するページ番号 | |
info = [] # HTMLから抽出した文字列を格納するリスト | |
# 各ページのURLのリスト | |
page_urls = [ | |
"http://2dbook.com/lists/search/word:/free:0", | |
"http://2dbook.com/lists/search/word:/free:1", | |
"http://2dbook.com/lists/search/word:/free:1/period:/sorting:/page:2" | |
] | |
for i in range(3, 100): | |
page_urls.append("http://2dbook.com/lists/search/page:%d/word:/free:1/period:/sorting:"%(i)) | |
# 正規表現 | |
pat_file = re.compile('<p class="filetitle"><a href="(.*?)">(.*?)</a></p>') # 検索結果のページからファイルページのURLを抜き出す | |
# メッセージの出力 | |
print "ダウンロードを開始しました..." | |
# ディレクトリを作成し、権限を付与する | |
if not os.path.exists(dl_path): | |
os.mkdir(dl_path) | |
os.chmod(dl_path, 0777) | |
# URLを含むリストを作成 | |
for i in range(start_page, (count_limit/40+start_page+2)): | |
# URL | |
html_url = page_urls[i] | |
# 検索結果ページのHTMLを取得 | |
html = html_download(html_url) | |
# HTMLから情報を取り出す | |
soup = BeautifulStoneSoup(html) | |
tmp_list = soup.findAll("p", {"class": "filetitle"}) # 一時的なリスト | |
info = info + tmp_list # リストの結合 | |
# リストからURLを取得 | |
for i in info: | |
# ダウンロードしたファイル数が上限に達した場合は終了 | |
if count > count_limit: | |
break; | |
else: | |
count += 1 | |
# ファイルページのURLを取得 | |
m1 = pat_file.match(str(i)) # 文字列へと変換後、マッチング | |
link = m1.group(1) | |
file_page_url = "http://2dbook.com%s"%(link) | |
# ファイルの名称と圧縮形式を取得 | |
file_page_html = html_download(file_page_url) | |
# HTMLからファイル名を判別する | |
file_page_soup = BeautifulStoneSoup(file_page_html) | |
file_page_titlebar = file_page_soup.findAll("div", {"class": "titlebar"}) | |
tmp = str(file_page_titlebar[0]).replace('\n','') # 文字列へと変換し、改行文字を削除 | |
file_name = strip_tags(tmp) | |
# ファイルのダウンロード | |
zip_2dbook_download(dl_path, file_name) | |
# メッセージの出力 | |
print "Success! : ダウンロードが完了しました" | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment