この記事は、MaNong.com の Xiao Hao によって書かれたものです。転載については、記事の最後にある転載要件をお読みください。有料投稿プランへの参加を歓迎します。
私はいつもアメリカのテレビシリーズを見る習慣がありますが、一方では英語のリスニングの練習にもなり、他方では時間を潰すことができます。以前は動画サイトで視聴することができましたが、国家ラジオ映画テレビ総局による制限令が出てからは、以前のようにアメリカやイギリスの輸入ドラマが同時に更新されなくなったようです。しかし、オタクとして、ドラマを追いかけないわけにはいかないので、インターネットで検索したところ、Thunderを使用してダウンロードできるアメリカのドラマダウンロードサイト[Tiantian American Drama]を発見しました。さまざまなリソースを自由にダウンロードできます。 . 最近、BBC のハイビジョン ドキュメンタリーに夢中です。自然はとても美しいです。
ダウンロードできるリソース Web サイトを見つけましたが、毎回ブラウザを開いて URL を入力し、アメリカのドラマを見つけて、リンクをクリックしてダウンロードする必要があります。時間が経つと手続きが非常に面倒になり、Webサイトのリンクが開けなくなることもあり、ちょっと面倒です。私はたまたま Python クローラー を学習していたので、今日は Web サイト上のすべてのアメリカのドラマのリンクを取得してテキスト ドキュメントに保存するクローラーを作成しました。ドラマが必要な場合は、それを開いてコピーしてください。 Xunlei にリンクしてダウンロードします。
実際、私は当初、URL を検索し、リクエストを使用してそれを開き、ダウンロード リンクを取得し、ホームページから始めてサイト全体をクロールするメソッドを作成する予定でした。ただし、重複リンクが多く、Web サイトの URL が思ったほど規則的ではありません。私が望むような分岐したクローラーをまだ書けていないのです。十分なので、これからも頑張ってください。 。 。
後から気づいたのですが、テレビシリーズへのリンクはすべて記事内にあり、記事の URL の後ろには http://cn163.net/archives/24016/ のように数字があったので、賢明でした。クローラーの経験に基づいて、解決策は、URL を自動的に生成することです。また、それぞれのドラマはユニークなので、どのくらいの記事があるかを調べてみました。 range 関数を使用して数値を直接かつ連続的に生成し、URL を構築します。
しかし、多くの URL は存在しないため、直接ハングアップします。心配しないでください。リクエストを使用しており、その組み込みの status_code は、リクエストによって返されるステータスを決定するために使用されます。コードは 404 です。これをスキップして他のリンクをクロールし、URL の問題を解決します。
以下は上記の手順の実装コードです。
def get_urls(self): try: for i in range(2015,25000): base_url='http://cn163.net/archives/' url=base_url+str(i)+'/' if requests.get(url).status_code == 404: continue else: self.save_links(url) except Exception,e: pass
あとはすんなり進みました。以前ネットで誰かが書いた同様のクローラーを見つけたのですが、1記事しかクロールできなかったので、その正規表現を拝借しました。 BeautifulSoupを使用しましたが、通常の方法ほど効果がなかったので、学習に制限はありません。ただし、その効果はそれほど理想的ではありません。リンクの約半分は正しくクロールできないため、引き続き最適化する必要があります。
# -*- coding:utf-8 -*- import requests import re import sys import threading import time reload(sys) sys.setdefaultencoding('utf-8') class Archives(object): def save_links(self,url): try: data=requests.get(url,timeout=3) content=data.text link_pat='"(ed2k://\|file\|[^"]+?\.(S\d+)(E\d+)[^"]+?1024X\d{3}[^"]+?)"' name_pat=re.compile(r'<h2 class="entry_title">(.*?)</h2>',re.S) links = set(re.findall(link_pat,content)) name=re.findall(name_pat,content) links_dict = {} count=len(links) except Exception,e: pass for i in links: links_dict[int(i[1][1:3]) * 100 + int(i[2][1:3])] = i#把剧集按s和e提取编号 try: with open(name[0].replace('/',' ')+'.txt','w') as f: print name[0] for i in sorted(list(links_dict.keys())):#按季数+集数排序顺序写入 f.write(links_dict[i][0] + '\n') print "Get links ... ", name[0], count except Exception,e: pass def get_urls(self): try: for i in range(2015,25000): base_url='http://cn163.net/archives/' url=base_url+str(i)+'/' if requests.get(url).status_code == 404: continue else: self.save_links(url) except Exception,e: pass def main(self): thread1=threading.Thread(target=self.get_urls()) thread1.start() thread1.join() if __name__ == '__main__': start=time.time() a=Archives() a.main() end=time.time() print end-start
フルバージョンのコードもマルチスレッドを使用していますが、PythonのGILのせいで無駄な気がします。クローリングを完了するには長い時間がかかると思いました。ただし、URL は除きます。エラーや一致しないものの場合、クロール時間の合計は 20 分未満です。当初は Redis を使用して 2 台の Linux マシンをクロールしたかったのですが、いろいろ考えた結果、それは不必要だと感じたのでそのままにして、後でさらにデータが必要になったときに実行することにしました。
このプロセス中に私を悩ませたもう 1 つの問題は、ファイル名の保存でした。txt テキスト形式のファイル名にはスペースを含めることができますが、スラッシュ、バックスラッシュ、括弧などを含めることはできません。これが問題で、最初はデータをクロールする際のエラーだと思いましたが、クロールされたドラマのタイトルにスラッシュが含まれていることがわかりました。惨めな。 。
以上がPython クローラーがアメリカのドラマの Web サイトを取得の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。