練習の書き込みは、Pythonの爬虫類

爬虫類の基本的な流れ

次のようにウェブクローラの基本的なワークフローは次のとおりです。

まず慎重URLはシードURLキュータスクに追加され、選択した種子の部分を選択したキュークロールURL抽出されたURLから、解決DNSは、URLとダウンロードに対応するIPホストページを結果として取る、メモリにダウンロードすることが把持されますウェブライブラリ。また、これらのURLは、URLキューにクロール。URLキューに他のURLの解析、及びURLを把握するために、前記分析URLは、それによって次のサイクルを入力し、フェッチされたURLキューでした。分析ダウンロードページ、それを解決するために必要なデータ。データの永続性は、その後、データベースに保存されました。

戦略をクロール爬虫類

クロールURLキューまで爬虫類系では非常に重要な部分です。どのような順序でクロールされたURLするURLキューは、どのページクロール後に、それは最初のクロールそのページに関連する非常に重要な問題です。この方法は、戦略をクロールと呼ばれるこれらのURLの順番を決定します。次のハイライトいくつかの一般的なクロール戦略:

深さ優先の戦略(DFS)

深さ優先の戦略は、他のラインに切り替える前に、プロセスまでダウンクロールリンクへのリンクは、すべての行リンク上で、特定のURLから爬虫類です。

この時点で握り順:A - > B - > C - > D - > E - > F - > G - > H - > I - > J

幅優先戦略(BFS)

最初の巡回戦略の幅基本的な考え方は、新たなダウンロードページをリンクすることで、直接クロールキューへのURLの末尾に挿入されることが判明。また、スタートページにリンクされているすべてのページをクロールして、リンクページのいずれかを選択し、このページ上のリンクのすべてのページをクロールしていきますWebクローラーを指します。

この時点把持順序で:A - > B - > E - > G - > H - > I - > C - > F - > J - > D

ワークフローや爬虫類クロール戦略を理解し、手がそれにパイソンを達成するためにどのように!だから、アップ爬虫類を達成することができますか?

テクノロジー・スタック

ヒト化リクエストは、HTMLコンテンツのXPath murmurhashアンチクローラ戦略トランス爬虫類ユーザデータストレージポリシーのMySQLを解析重い文のためのブルームフィルタブルームフィルタを要求します

基本的に

以下は、擬似コードであります

インポートキュー

initial_page = " https://www.zhihu.com/people/gaoming623 "

url_queue = Queue.Queue()

見=セット()

seen.insert(initial_page)

url_queue.put(initial_page)

(真)ながら:#が行われています

:url_queue.size()> 0であれば

第一の実施形態のURLのうちcurrent_url = url_queue.get()#チーム

このURL店(current_url)#は良いのWebストアを表現しました

extract_urlsでnext_url(current_url)のために:#は、このURLへのURLリンクを抽出します

next_urlがで見ていない場合:

seen.put(next_url)

url_queue.put(next_url)

他:

ブレーク

あなたが直接実行直接処理上記のコードを見れば、あなたは、ユーザーに関するほぼ全ての既知の情報を降りるのに長い時間を必要とする、すべての後、我々は、約60万の月間アクティブユーザーを知っています。グーグルの必要性の内容のように、全体のネットワークダウンだけで検索エンジンをしてみましょう。どこに問題が続いているのですか?

ブルームフィルタ

上記のコードは遅すぎる遅すぎるしながら、ページを登るためには、あまりにも多くのです。その後、一度トラバースしたいすべてのページを分析しているため、Nサイトとのネットワーク全体を想像して、必要なログ(N)の複雑重い文の複雑さは、N *ログであれば、各再使用セットを宣告(N),. OK、私は、設定されたPythonの実装はhash--である知っているが、これは、少なくともではない効率的なメモリ使用量、遅すぎる、まだです。

通常、重い練習にどのように?ブルームフィルタである宣告。単純に、それはまだハッシュ法であるが、それを特徴とし、それはOに(ないURLと成長の数で)固定メモリを使用することができます(1)効率セット内にすでにURLかどうかを判断します。残念ながら、これはURLに設定されていない場合には、BFは必ずこのURLはそれを読んでいない100%とすることができ、唯一の問題があるのです、空きランチはありません。このURLが登場している必要がありますが、私は2%の不確実性を持っています。しかし、セット内のURL場合、それはあなたを教えてくれます。あなたの割り当てられたメモリの不確実性が十分に大きい、それは非常に小さくなることに注意してください。

bloom_filter.py BIT_SIZE = 5000000クラスブルームフィルタ:デフのinit位は、URLを追加し、セットポイント:(自己):#初期化ブルーム0にフィルタ、セットサイズ及び全ビットbit_array = bitarray(BIT_SIZE)bit_array.setall(0)self.bit_array = bit_array DEF(自己、URL)を追加1 bitarray(ポイントカウントハッシュのfuncsに等しいカウント。)ここで、#7はハッシュ関数を使用します。point_listにおけるbについてpoint_list = self.get_postions(URL):self.bit_array [B] = 1がデフ(自己、URL)が含まれます:#チェックURLがための真のコレクションpoint_list = self.get_postions(URL)結果=である場合ビットベクトル位取得ポイント位置:point_listにおけるB:get_postions(自己、URL)DEF結果=結果とself.bit_array [B]リターン結果。POINT1 = mmh3.hash(URL、41)%BIT_SIZEポイント2 = mmh3.hash(URL、42)%BIT_SIZE POINT3 = mmh3.hash(URL、43)%BIT_SIZE POINT4 = mmh3.hash(URL、44)%BIT_SIZE POINT5 = mmh3.hash(URL、45)%BIT_SIZE point6 = mmh3.hash(URL、46)%BIT_SIZE point7 = mmh3。

原則ブルームフィルタ(ブルームフィルタ)と実装:私は記事を書いた前に、BFは、概略的な言及を詳細に説明しました

テーブルを作成するには

こうした回答番号、資料番号、質問番号、ファンの数、そして上のようにプラットフォーム上のユーザ名、プロファイル、産業、金融機関、専門家やデータアクティビティを含む貴重な情報を持つユーザー。

次のようにユーザ情報格納テーブルの構造は次のとおりです。

DATABASE CREATE zhihu_user/ 40100 UTF8 DEFAULT CHARACTER SET! /; -ユーザー情報ベース表のCREATE TABLE t_useruidBIGINT(20は)NOT NULL符号なしAUTO_INCREMENT、usernameVARCHAR(50)COMMENTはNOT NULL 'ユーザ名'、brief_infoVARCHAR(400)COMMENT 'プロフィール' 、industryVARCHAR(50 ')で、業界COMMENT、educationVARCHAR(50)COMMENTは、 '卒業' majorVARCHAR(50)COMMENT '専攻'、answer_countINT(10)DEFAULT 0 COMMENT '答え'、符号なしarticle_count整数(10 )符号なしDEFAULT 0 COMMENT '資料番号' ask_question_countINT(10)符号なしDEFAULT 0 COMMENT '質問番号' collection_countINT(10)符号なしDEFAULT 0 COMMENT 'コレクション番号' follower_countINT(10)符号なしDEFAULT 0 COMMENT 'の数について懸念しています' followed_countINT(10)符号なしDEFAULT 0 COMMENT ' 数を懸念'follow_live_countINT(10)符号なしDEFAULT 0 COMMENT 「 ライブの数に注意」follow_topic_countINT(10)符号なしDEFAULT 0 COMMENT ' いくつかのトピックに関心'、follow_column_countINT(10)符号なしDEFAULT 0 COMMENT ' 列の数に注目する'、follow_question_countINT(10)符号なしDEFAULT 0 COMMENT ' いくつかの問題に注意'、follow_collection_countINT(10)符号なしDEFAULT 0 COMMENT '好きな数見' gmt_create日時NOT NULL COMMENT '作成時間'、gmt_modifyタイムスタンプNOT NULLをDEFAULT CURRENT_TIMESTAMP COMMENT '最後の編集'、PRIMARY KEY( uid))ENGINE = MyISAMのAUTO_INCREMENT = 1 DEFAULT CHARSET = utf8をCOMMENT =「利用者基本情報テーブル「;

ユーザーの各次元のための抽出データにXPathを解析することにより、Webページをダウンロードした後、最終的にデータベースに保存。

-headersに対処するためのアンチ爬虫類戦略

一般的なサイトは、抗爬虫類、いくつかの次元から来る:ユーザーは、ヘッダー、ユーザーの行動、ウェブサイトやデータのロード方法を要求します。ユーザーのリクエストヘッダから抗クローラは、多くのサイトが検出されただけでなく、リファラーが検出されるサイトの一部されたUser-Agentのヘッダになります最も一般的な戦略である(サイトのリソースの一部は、リファラー抗ホットリンクを検出することです)。

あなたは抗爬虫類このタイプのメカニズムが発生した場合は、ヘッダ内爬虫類に直接追加することができ、ヘッダ爬虫類のにブラウザのUser-Agentをコピー、またはターゲットドメインのリファラー値を変更します。抗爬虫類を検出するためのヘッダ、ヘッダが良いバイパスクローラことができる変更または追加します。

クッキー= { "d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE = | 1468847182"、 "ログイン": "NzM5ZDc2M2JkYzYwNDZlOGJlYWQ1YmI4OTg5NDhmMTY = | 1480901173 | 9c296f424b32f241d1471203244eaf30729420f0"、 "N_C": "1"、 "q_c1": "395b12e529e541cbb400e9718395e346 | 1479808003000 | 1468847182000"、 " l_cap_id ": "NzI0MTQwZGY2NjQyNDQ1NThmYTY0MjJhYmU2NmExMGY = | 1480901160 | 2e7a7faee3b3e8d0afb550e8e7b38d86c15a31bc"、 "d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE = | 1468847182"、 "cap_id": "N2U1NmQwODQ1NjFiNGI2Yzg2YTE2NzJkOTU5N2E0NjI = | 1480901160 | fd59e2ed79faacc2be1010687d27dd559ec1552a"}ヘッダー= { "ユーザエージェント"の" Mozilla / 5.0(Macintosh版、インテルのMac OS X 10_12_1)のAppleWebKit / 537.36(ヤモリのようにKHTML、)クローム/ 54.0.2840.98サファリ/ 537.3"、 "リファラー": " https://www.zhihu.com/ "} R = requests.get(URL、クッキー=クッキー、ヘッダ=ヘッダ)

対処するためのアンチ爬虫類戦略 - プロキシIPプール

ユーザーの行動を、検出することにより、サイトの一部は、このような短い時間内に同じページを複数回アクセスするために同じIP、または短時間に同じアカウントと同じ操作を複数回としてあります。

ほとんどのサイトは、前者の場合あり、この場合には、IPプロキシの使用を解消することができます。このようなプロキシのIPクローラが頻繁に使用されている、それは自分で用意するのが最善です。あなたは多数のエージェントを持っていたら、最初の抗クローラバイパス簡単にすることができますので、数回を交換するための要求IP各IPは、それは、要求やurllib2の中で行うことは非常に容易であることができます。現在、すでに単一IP、一定の期間、システムがアップクロールを続行することができない、異常なトラフィックを促すメッセージが表示されます場合は、ほとんどの爬虫類は、制限されている知っています。そのため、プロキシIPプールが重要です。無料オンラインAPIプロキシIPがあります:http://api.xicidaili.com/free2016.txt

DEF:インポート要求がランダムクラスのプロキシインポートはinit(自己):無料プロキシAPIのURLからself.cache_ip_list = []#取得ランダムなIPを。デフget_random_ip(自己):lenはない場合(self.cache_ip_list):api_url = ' http://api.xicidaili.com/free2016.txt '試し:R = requests.get(api_url)ip_list = r.text.split( '「)self.cache_ip_list = ip_list電子などの例外を除い:例外をキャッチしたときに#リターンヌルリスト。#この場合、クローラは、プロキシIPを使用しません。印刷Eリターン{} proxy_ip = random.choice(self.cache_ip_list)プロキシ= { 'HTTP': 'のhttp://' + proxy_ip}戻りプロキシ

フォロー

分散タスクキューおよび分散クローラをクロールログレコードおよびエラーログを使用してモジュール

爬虫類出典:zhihu-クローラ後ピップをダウンロードすることにより、関連当事者のパッケージをインストールした後、$ Pythonのcrawler.py実行することができます(ヘルプカザフスタンスターのポイントなどを、だけでなく、簡単に更新フォローアップ機能を参照してください)

分散学習のpython爬虫類 - 基本から戦闘へ - 火災ヤン・カレッジ

おすすめ

転載: blog.51cto.com/12486145/2452599