Skip to content

Instantly share code, notes, and snippets.

@furaibo
Created January 15, 2014 05:53
Show Gist options
  • Save furaibo/8431493 to your computer and use it in GitHub Desktop.
Save furaibo/8431493 to your computer and use it in GitHub Desktop.
2Dbookloaderからフリーアップロードファイルを取得するスクリプトです。
#!/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