幸せな偶然の一致によって、友人は漫画「ターンの奇跡」をダウンロードするように私に頼みました。
要点をつかむ
UA-IXで人気のあるトラッカーの1つを訪れて、この漫画を見つけました。各エピソードのみが個別にアップロードされましたが、「ダウンロード」ボタンを65回押したくありませんでした。 その瞬間、私はPythonを思い出しました。
すぐに、サイトからファイルを取得する方法に関する情報を探し始めました。 Googleと悪名高いStackOverflowサイトのおかげで、すぐに答えが返ってきました。 ライブラリをインポートして数行追加することで、ファイルを「引き出す」ことができることがわかりました。 これがどのように機能するかを小さな次元のファイルでテストした後、次の段階に進みました。 すべてのダウンロードリンクとそれに対応するファイル名を収集する必要がありました。
同じタグ内のどこにも指定されていないため、リンクとファイル名を別々に収集しました。
リンクを収集するために、このサイトで既に説明したlxmlライブラリーが使用されました。 このライブラリをダウンロードしてインストールした後、プログラムの作成に進みました。 プログラムコードは次のとおりです。
#! /usr/bin/env python import urllib import lxml.html load = 'load' page = urllib.urlopen('http://www.***.ua/view/12345678') doc = lxml.html.document_fromstring(page.read()) for link in doc.cssselect('p span.r_button_small a'): if link.text == None: continue if load not in link.get('href'): continue print 'http://***.ua'+link.get('href')
収集されたすべてのリンクは、さらに作業するためにファイルに保存されました。 コンストラクトがすべてのデータのフィルタリングに使用された場合。 そのため、ファイルをコンピューターにダウンロードするために使用されたリンクのみを受け取りました。
ファイル名はあまり便利ではありませんでした。 したがって、プログラムがファイルの名前を受け取ると、すぐにそれをより便利な名前に変更しました。 したがって、すべてのファイルはフォームの名前を受け取りました。 XXではなく、シリーズXX-シリーズ番号。
プログラムコード:
#! /usr/bin/env python # -*- coding: utf-8 -*- import urllib import lxml.html file_name = u' . ' episode = 0 page = urllib.urlopen('http://www.***.ua/view/12345678') doc = lxml.html.document_fromstring(page.read()) for name in doc.cssselect('tr td a'): if name.text == None: continue if not name.text.endswith('.avi'): continue name.text = file_name + str(episode) + name.text[-4:] print name.text.encode('utf8') episode += 1
そのため、Python 2.6インタープリターのバージョンが使用したように、キリルアルファベットを正しく処理するには、エンコードメソッドを使用する必要がありました。 収集されたデータもファイルに保存されました。
両方のプログラムの作業後、ハードディスク上に2つのテキストファイルがありました。 1つはファイルをダウンロードするためのリンクが保存され、もう1つはシリーズの名前が保存されていました。
辞書を使用して、リンクとファイル名をリンクしました。 リンクがキーであり、ファイル名はキー値に保存されていました。 その後、キーを取得し、呼び出し関数でそれを置き換えて、保存する場所、ファイル名を指定するだけで済みました。
これらのアクションを実行するコード:
#! usr/bin/env python # -*- coding: utf-8 -*- import urllib links = open('link','r') names = open('file_name', 'r') download = {} path = '/media/6A9F550C59BC1824/TaleSpin/' url = 'http://www.***.ua/load/12345678' loadf = [] download = dict(zip(links, names)) for link in download.iterkeys(): name = download[link].rstrip() if name not in loadf: urllib.urlretrieve(link,path+name) loadf.append(name) else: continue
また、既にダウンロードされているシリーズの名前が入力されるリストも使用されます。 これは、ダウンロードが中断した場合に、すでにハードディスク上にあるシリーズがスイングしないようにするために使用されます。
おわりに
[ダウンロード]ボタンを手動でクリックした場合よりも、このコードをすべて記述するのに時間がかかった可能性があります。 しかし、実用的なプログラムはより多くの喜びをもたらしました。 さらに、新しい知識もあります。
使用材料
ご清聴ありがとうございました。
サイトのアドレスは、広告と見なされないように隠されています。