漫画ページのコミックをダウンロードするPythonコード
以下のコードは「http://xkcd.com」というサイトからBeautifulSoupモジュールを使って画像の要素を見つけ「xkcd」というフォルダに画像を保存します。画像の保存が全て終わったら次のページに推移します。
import requests, os, bs4 url = 'http://xkcd.com' os.makedirs('xkcd', exist_ok=True) while not url.endswith('#'): # ページをダウンロードする print('ページをダウンロード中 {}...'.format(url)) res = requests.get(url) res.raise_for_status() soup = bs4.BeautifulSoup(res.text, 'html.parser') # コミック画像のURLを見つける # id="comic"のimgタグ comic_elem = soup.select('#comic img') if comic_elem == []: print('コミック画像が見つかりませんでした') else: comic_url = 'http:' + comic_elem[0].get('src') # 画像をダウンロードする print('画像をダウンロード中 {}...'.format(comic_url)) res = requests.get(comic_url) res.raise_for_status() # 画像を./xkcdに保存する image_file = open(os.path.join('xkcd', os.path.basename(comic_url)), 'wb') for chunk in res.iter_content(100000): image_file.write(chunk) image_file.close() # prevボタンのURLを取得する prev_link = soup.select('a[rel="prev"]')[0] url = 'http://xkcd.com' + prev_link.get('href') print('完了')
スクリプトの解説
- importで必要なモジュールを読み込む
- os.makedirsでカレントディレクトリに新しいフォルダを作る。exist_ok=Trueは同名のフォルダが存在していたら例外をおこさない
- requests.get()で該当ページをダウンロード
- bs4.BSにurlを渡す
- soup.select()で id=” comic”のimgタグをセレクトしてリストにする
- リストがなかったらprint(‘コミックが見つかりませんでした ‘)
- リストがあったら、get(‘src’)でsrc属性から属性値を得るそれをhttp:と合体
- requests.get()で合体したurlをダウンロード
- open()関数内ではフォルダ名とurlのbasenameをjoinでつなげて、’wb’というバイナリ書き込みモードで開く
- forループでiter_content(100000)で100キロバイトにごとに書き込む。終わったら閉じる
- select() aタグのrel属性が”prev”のものをみつける。
- get(‘href’)でhrefの属性値とつなげる。→これがurlになる
- whileなのでこれを繰り返す。
まとめ
このコードを使えばいろいろなサイトから画像をダウンロードできそうです。フリーの画像ダウンローダーを使えば必要ないプログラムかもしれませんが、webスクレイピングはアイデア次第では色々なことができそうです。
コメント