Python ビデオ チュートリアル コラムでは、分散クローラーの原理を紹介します。
無料のおすすめ: Python ビデオ チュートリアル
まずは、まずはやってみましょう。人間の通常の行動である場合、人々がどのように Web コンテンツを取得するかを見てみましょう。
(1) ブラウザを開いて URL を入力し、ソース Web ページを開きます
(2) タイトル、著者、要約など、必要なコンテンツを選択します情報
(3) ハードディスクに保存
技術レベルにマッピングされた上記の 3 つのプロセスは、実際には、ネットワーク要求、構造化データのキャプチャ、およびデータストレージ。
Python を使用して、上記の単純なクローリング関数を実装する簡単なプログラムを作成します。
#!/usr/bin/python #-*- coding: utf-8 -*- ''''' Created on 2014-03-16 @author: Kris ''' import urllib2, re, cookielib def httpCrawler(url): ''''' @summary: 网页抓取 ''' content = httpRequest(url) title = parseHtml(content) saveData(title) def httpRequest(url): ''''' @summary: 网络请求 ''' try: ret = None SockFile = None request = urllib2.Request(url) request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)') request.add_header('Pragma', 'no-cache') opener = urllib2.build_opener() SockFile = opener.open(request) ret = SockFile.read() finally: if SockFile: SockFile.close() return ret def parseHtml(html): ''''' @summary: 抓取结构化数据 ''' content = None pattern = '<title>([^<]*?)</title>' temp = re.findall(pattern, html) if temp: content = temp[0] return content def saveData(data): ''''' @summary: 数据存储 ''' f = open('test', 'wb') f.write(data) f.close() if __name__ == '__main__': url = 'http://www.baidu.com' httpCrawler(url)
非常にシンプルに見えますが、はい、これはクローラーを使い始めるための基本的なプログラムです。もちろん、収集プロセスの実装は上記の基本的な手順にすぎません。しかし、強力な収集プロセスを実装するには、次の問題が発生します:
(1) Cookie 情報によるアクセスが必要 たとえば、ほとんどのソーシャル ソフトウェアは基本的にユーザーにログインを要求します。価値のあるものを見ることができますか? 実際、それは非常に簡単です。Python が提供する cookielib モジュールを使用して、ソース Web サイトから提供される Cookie 情報を使用してすべての訪問を実現できます。このようにして、ログインを正常にシミュレートする限り、クローラーがログインしている状態になると、ログインしているユーザーに表示されるすべての情報を収集できます。以下は、Cookie を使用した httpRequest() メソッドの変更です:
ckjar = cookielib.MozillaCookieJar() cookies = urllib2.HTTPCookieProcessor(ckjar) #定义cookies对象 def httpRequest(url): ''''' @summary: 网络请求 ''' try: ret = None SockFile = None request = urllib2.Request(url) request.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)') request.add_header('Pragma', 'no-cache') opener = urllib2.build_opener(cookies) #传递cookies对象 SockFile = opener.open(request) ret = SockFile.read() finally: if SockFile: SockFile.close() return ret
(2) エンコーディングの問題。現在、Web サイトで最も一般的なエンコードは utf-8 または gbk の 2 つです。ソース Web サイトのエンコードを収集し、データベースに保存されているエンコードが矛盾している場合、たとえば 163.com のエンコードは gbk を使用しており、必要なものはストアが utf. -8 でエンコードされたデータの場合、Python で提供される encode() メソッドと decode() メソッドを使用して変換できます (例:
content = content.decode('gbk', 'ignore') #将gbk编码转为unicode编码 content = content.encode('utf-8', 'ignore') #将unicode编码转为utf-8编码
途中に Unicode エンコードがあり、必要があります) gbk または utf-8 変換するために、中間エンコーディングの unicode に変換します。
(3) Web ページのタグが不完全です。たとえば、一部のソース コードには開始タグがありますが、終了タグがありません。HTML タグが不完全な場合、構造化データをキャプチャする能力に影響します。 Python を使用できます。 BeautifulSoup モジュールは、まずソース コードをクリーンアップし、次にコンテンツを分析して取得します。
(4) 一部の Web サイトでは、JS を使用して Web コンテンツを保存します。ソースコードを直接見てみると、厄介な JS コードが大量に見つかりました。 mozilla、webkit、ブラウザを解析できるその他のツールキットを使用して js や ajax を解析することもできますが、速度は若干遅くなります。
(5)画像はフラッシュ形式で存在します。写真の内容がテキストや数字などの文字であればOCR技術を使って自動認識するだけで済むので扱いやすいですが、フラッシュリンクの場合はURL全体を保存します。
(6) Web ページには複数の Web ページ構造があります。クロール ルールが 1 セットしかない場合は、間違いなく機能しません。そのため、クロールを支援するために複数のシミュレーション セットを構成する必要があります。
(7) ソース Web サイトを監視します。結局のところ、他人の物をクロールするのは良いことではありません。そのため、ほとんどの Web サイトではアクセスを禁止するクローラーの制限が設けられています。
優れた収集システムとは、ターゲット データがどこにあっても、ユーザーに表示されている限り、データを収集できるものである必要があります。ログインが必要かどうかに関係なく、見たままがそのまま収集できるため、ブロックされずにスムーズにデータを収集できます。一般的にSNSなどの貴重な情報はログインが必要な情報が多く、ログインに対応するにはWebサイト側にユーザーのログインを模擬したクローラシステムを搭載し、正常にデータを取得する必要があります。しかし、ソーシャル ウェブサイトはクローズド ループを形成することを望んでおり、データをサイトの外部に置くことを好まないため、この種のシステムはニュースやその他のコンテンツほど人々にオープンではありません。これらのソーシャル Web サイトのほとんどは、ロボット クローラー システムによるデータのクロールを防ぐためにいくつかの制限を採用しています。通常、アカウントがクロールされてから検出され、アクセスが禁止されるまでに、それほど時間はかかりません。ということは、これらの Web サイトからデータをクロールできないということでしょうか?ソーシャル Web サイトが Web ページへのアクセスを閉鎖しない限り、一般の人がアクセスできるデータにもアクセスできます。結局のところ、これは人の通常の行動のシミュレーションであり、専門的には「アンチモニタリング」と呼ばれています。
ソース Web サイトには通常、次の制限があります:
1. 一定期間内の単一 IP へのアクセス数通常のユーザーはアクセスします。クリックして再生しないと、一定期間内に Web サイトにすぐにアクセスすることはなく、また、Web サイトに長時間アクセスすることもできません。この問題は簡単に解決でき、多数の不規則なプロキシ IP を使用してプロキシ プールを形成し、プロキシ プールからランダムにプロキシを選択し、アクセスをシミュレートできます。プロキシ IP には、透過プロキシと匿名プロキシの 2 種類があります。
2. 一定期間内の 1 つのアカウントへのアクセス数人間が 1 日 24 時間データ インターフェイスにアクセスし、その速度が非常に速い場合、それはロボットである可能性があります。通常の動作を持つ多数のアカウントを使用できます。通常の動作とは、一般の人々がソーシャル ネットワーキング サイトでどのように操作するかであり、単位時間あたりにアクセスする URL の数が最小限に抑えられます。各訪問の間には一定の期間があってもよいです。この時間間隔は、つまり、URL にアクセスするたびに、ランダムな期間スリープしてから、次の URL にアクセスします。
アカウントとIPのアクセスポリシーを制御できれば、基本的には問題ありません。もちろん、相手のサイトの運用・保守戦略も調整する必要があり、敵と自分との戦いにおいては、相手のアンチ監視が自分に影響を与えることをクローラーが察知し、管理者に通知する必要があります。タイムリーに処理するため。実際、最も理想的なのは、機械学習を通じてアンチモニタリング対決をインテリジェントに実装し、中断のないキャプチャを実現できることです。
次は、図 1 に示すように、私が最近設計している分散クローラー アーキテクチャ図です。
これは純粋に地味な作業です。 , 予備的なアイデア 実装されており、サーバーとクライアント間の通信が確立されています. サーバーとクライアント間の通信を実現するには、主に Python の Socket モジュールが使用されます。ご興味がございましたら、個別にご連絡いただき、より良い解決策について話し合い、完成させることができます。
以上がPython 分散クローラーの原理についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。