お手軽ダウンローダー PyCherryPick 作ってみた (Python)


相変わらずめちゃめちゃ湿度高くて暑いですねコニャチワワorz
湿度高いと汗疹できるからツライー・・・。

先週末の話ですが。
調べ物のためにあっちのページのPDF, こっちのページのPDFをぽちぽちダウンロードしてたんす。
・・・量が多い(=ω=)
右クリック→「リンク先を名前をつけて保存」
このアクションが1つや2つならいいけど、5つ6つ7つとかなってくるとひたすら面倒くさい。

ダウンロード専用ツールを探して、インストールして、使い方調べt・・・これまた面倒くさい。

なんかないか。・・・ないか(=ω=)。
じゃあ作ってしまえホトトギス。
→→作った。

名前は PyCherryPick にしました。
この名前、なんかエロいね(*・∀・*)
※ちなみにcherrypickってのは英語で「つまみ食い」って意味w

ソースコードはコチラ
github: https://github.com/wgkoro/PyCherryPick

ちなみにコマンド実行するとこうなります↓ (各画像クリックで拡大)

ページから欲しいファイルを抜き出して、自動ダウンロードします。


↑保存された画像達。

以下、使い方。

必須条件

・Python2.x
・BeautifulSoup (パッケージにバンドルしてあります)
Macの方はダウンロード後、コマンドラインたたけば使えるはず。デフォルトでPython入ってるので。
Windowsの方は、Pythonインストールしないとダメかな・・・。

基本的な使い方

基本的にコマンドラインで利用します。
本体(pycherrypick.py)があるディレクトリまで移動して
$ python pycherrypick.py [ターゲットのURL]

例:

$ python pycherrypick.py https://zafiel.wingall.com/archives/2011071715282121.php

これでhttps://zafiel.wingall.com/archives/2011071715282121.phpを走査し、リンク先が「jpg」のものを自動ダウンロードします。
オプション無し、URLのみ指定だと、jpgファイルのみ取ってきます。
これなんてエロ画像ダウンローダ?

応用 Options

コマンド実行時にオプションを指定すると、処理が色々変わります。
オプション一覧:
–version
     バージョンを表示
-h, –help
     このヘルプを表示
-f FILE, –file=FILE
     ローカルのHTMLファイルのパス。
     これが指定されているとローカルHTMLファイルを走査します。
     もしURLと両方指定されている場合、ローカルを優先します。
-t TYPE, –type=TYPE
     ダウンロードするファイルタイプを指定。pngファイルが欲しい場合はpngと指定します。
     jpg,gif,png とカンマ区切りにすると複数タイプをまとめてダウンロードします。
     -r オプション(正規表現)が指定されている場合、-t オプションは無視されます。     
-i INTERVAL, –interval=INTERVAL
     複数ファイルをダウンロードする際のインターバル(秒)を指定。デフォルトは2(秒)
-d DOWNLOAD, –download=DOWNLOAD
     ダウンロードファイルの保存先を指定。(フルパスで指定)
     デフォルトは、pycherrypick.pyのディレクトリにあるdownloadsフォルダに格納されます。
-e ENCODE, –encode=ENCODE
     ターゲットとするページの文字エンコードを指定。
     カスタムスクレイピングする場合以外は指定の必要はありません。
-u UA, –ua=UA
     ファイルダウンロードする際のユーザーエージェント変更。デフォルトはIE8がセットされています。
-r REGEX, –regex=REGEX
     ダウンロードするURLをフィルタする正規表現。
     -t オプションも指定されている場合、
     この-rオプションが優先され、-tオプションは無視されます。
     例: -r ‘http.+\/.jpg’

例:pdfファイルが欲しい!

$ python pycherrypick.py https://zafiel.wingall.com/ -t pdf

例:pngとjpgファイル両方欲しい!

$ python pycherrypick.py https://zafiel.wingall.com/ -t jpg,png

例:pngとgifとpdfファイルを /Users/Foo/Downloads に保存したい

$ python pycherrypick.py https://zafiel.wingall.com/ -t png,gif,pdf -d /Users/Foo/Downloads

リンク先だけでなく、他のファイルも欲しい!

デフォルトは、リンク先のみを見ます。
例えばページに貼ってあるimgタグのsrcが欲しい場合は、カスタマイズしちゃって下さい。

クラスPyCherryPickを継承した新しいクラスを作り、scrape()をオーバーライドすれば楽かと思います。
PyCherryPick/python/custom_example.pyを参照して下さい。

custom_example.py
[python]
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pycherrypick import PyCherryPick
import re

class CustomExample(PyCherryPick):
def __init__(self):
PyCherryPick.__init__(self)

def scrape(self):
"""
新しいスクレイピング処理を書く。ダウンロード対象とするURLリストを返せばOK
imgタグを取得して、それぞれのパスを返す
"""
reg = re.compile(self.regex)
images = self.soup.findAll(‘img’)
results = []
for img in images:
try:
url = dict(img.attrs)[‘src’]
url = self._make_url_path(url)
if reg.match(url):
results.append(url)

except:
pass

print ‘Img tag scraping OK’
return results

if __name__ == ‘__main__’:
f = CustomExample()
f.main()
[/python]

使い方はこんな感じ(・∀・)

毎回urllib.open()とかBeautifulSoupでスクレイピング書いてもいいけどめんどくさいからね・・・。
これでファイル収集少しは楽になるかなー?

追記:
友人から「wgetでいいやん」ってつっこまれた。
wgetの機能がそんなに色々あると知らなかった・・・よ・・・ orz
ま、コード書く練習になったからいいとしよう(・ω・)
あ、ユーザーエージェント偽装できるのは強みか?w

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください