標準の爬虫類では、パイソンの親からの夕食!

  まず第一に、彼は見出しパーティーをしたことを認めざるを得ない、この論文の本質はアドレス500lines以下クロールプロジェクトを分析することで、このプロジェクトはhttps://github.com/aosabook/500linesで、興味のある学生は見ることができ、それは非常に高く、オープンソース・プロジェクトの品質のコレクションは、本を書くと言われているが、コードに提出したレコードを見て、この本はすぐに利用可能な時間であってはなりません。この記事は非常にかすを書かれた、エラーがああ言及する必要があります。

 

  一つまたは複数の最初のページからWebクローラURLは、Webページをクロールする過程で、最初のページのURLのようにして得られた、システムが停止条件を満たしている必要がありますまで、キューに現在のページから新しいURLを抽出するために継続されます。単純なウェブクローラは、条件がトリガされていない場合、クローラは常に各ページからデータを取得するために、終了条件とwhileループとして理解し、取得した送信要求URL、現在のページのURLを解析し、継続してもよいですダウンイテレーション。パイソンによって現在の要求が再スケジューリングした後、その後、現在のタスクを一時停止に失敗したときエンジニアリングの中でクロールでは、このプロセスが完了すると、クローラのクラス、彼はそのことができ、幅優先または深さ、最初の爬虫類を使用していませんでしたかろうじてベースのネットワーク接続を以下のように動作モードがある*検索を、理解。

  

  忙しいコレクション、他の爬虫類データのURL収集のための保全待ち;行わコレクション、URLをクロール保存完了ページURLが存在している初期化後のクローラオブジェクト、TODOの収集、保管、まだURLクローラの操作を行うことを続けるにはコレクション。コア爬虫類は、まず、すべての爬虫類のそのオブジェクトを初期化し、TODOのセットの中からURLを取得し、この死のサイクルでは、ページ上のURLを取得し、最終的なタスクのスケジューリング要求URLのタスクを実行取得するために使用されます。次のコードに示すこのプロセス。

1  asyncio.coroutine @
 2  デフ:クロール(自己)
 3          "" " 全て終了するまで、クローラを実行します""" 
4          (と収率 からself.termination):
 5              ながら self.todo または:self.busy
 6                  場合に自己。 TODO:
 7                      URL、max_redirect = self.todo.popitem()
 8                      フェッチャ= Fetcherの(URL、
 9                                        クローラ= 自己、
 10                                        max_redirect = max_redirect、
11の                                        = max_tries self.max_tries、
 12  13                      self.busy [URLを] = フェッチャ
 14                      fetcher.task = asyncio.Task(self.fetch(フェッチャ))を
 15                  16                      収量 からself.termination.wait()
 17          自己。 T1 = time.time()

   

  明らかに、クローラは、単に無限ループで構成されていないだろう、外層は、次のようにネットワークの接続、URL取得タスクスケジューリングタスク、プロジェクトのスケジューリングフレームワーク全体をクロールを含め、そのクロール操作中に他のモジュールをサポートする必要があります。

 

  最初のクロールを作成するには、初期化時間のConnectionPoolの作成:

 

  self.pool =のConnectionPool(max_pool、max_tasks)

  asyncio.open_connection(介して取得した)、接続およびホストのポート番号に保存され、SSLをサポートしています。そして、前記保持特性は、それぞれ、接続をキュー、そしてその後のスケジューリングのためのコレクション・キュー接続を保持しています。

  self.connections = {}#{(ホスト、ポート、SSL):[接続、...]、...}
  self.queue = []#[接続、...]

  タスクを実行する方法は、イベントループの最初の負荷loop.run_until_complete(crawler.crawl())を介してクロールプールのConnectionPoolを構築し、上記のステートメントは、リンク接続オブジェクトを保存し、接続オブジェクトは、次にによって取得されたデータメソッドクロールオブジェクトフェッチャをフェッチ取ります。使用してタスクのURL要求、フェッチャ処理は、スケジューリングが使用されるasyncio.Taskのスケジューリング方法。どのasyncio.Taskの実行に、発電機のハングアップを取得するメソッドを取得します。

  そしてasynico.coroutine文から収率により、この方法は時間が保留中である場合、処理は、スケジューラによって実行されるfetcher.fetch()メソッドを実行し、実行中に発生なります。

  fetcher.fetch()メソッドは、試みは上限停止動作に到達するときに、ページデータを取得しようとするネットワークからTODOそれらのコレクションにロードされたURLとページのデータを取得するための責任があるWebクローラーの中核方法で、成功するためのHTMLそして、外部データリンクとリダイレクトリンクが保存されます。URLリンク数が上限に達した場合には、これは、URLリンク操作、出力エラーログを停止します。ページの異なる状態の後、別のアプローチを取ります。

  次のコード方式に対応する領域のスタートライン(crawling.py)の端からcrawling.pyファイル333で、ページ状態の選択は、異なるアプローチによって決定されます。正規表現、ページのURLに関する情報へのアクセスは、ここで選択した文字列のhrefの始まりである場合、コアのURLは以下のコードを抽出します。 

1  画像のリンクをたどるために|:(SRCをHREF?)とのhrefを交換してください。
2 self.urls =セット(re.findall(R ' ?(I)のhref = "\']([^ \ sの?" \ '<>] +)' 、ボディ))
 3  であればself.urls:
 4      logger.warn(' %Rから%rの異なるURLを持っ' においてlen(self.urls)、self.url)
 5      self.new_urls = セット()
 6      のための URL self.urls:
 7          URL = アンエスケープ(URL)
 8          URL = urllib.parse.urljoin(self.url、URL)
 9          URL、FRAG =urllib.parse.urldefrag(URL)
 10          もしself.crawler.add_url(URL):
 11              self.new_urls.add(URL)            

  コードを、それがクリアされているあなたは結果の定期的なセットを見ることができる間に設定して順次forループで処理マッチングTODOのURLに格納され、現在は、クローラうちフェッチャオブジェクトに追加されます。

 

  さらなる分析のためにcrawl.pyマスターファイルの分析の前に基づき、当社は、爬虫類の全体的なアーキテクチャを取得することができます:

  なお、第1 argparse.ArgumentParser解析によりどのマスターファイルで行われ、IOCPはイベントループターゲットウィンドウ環境として選択された前記データの読み出し及び制御コンソールは、提供されます。主な方法は、まず、ルート属性なしで、プロンプトを辞書コマンドparse_argsによって格納されたデータを返さ。次いでない出力の最低レベル以下に、ログレベル、ログ出力レベル表示を設定します。

  コマンドから最初のラインパラメータに従って、メインエントリポイント法を介して、プログラムを入力するときにクローラをする初期化、およびget使用するasyncio ループイベントオブジェクト実行run_until_completeの方法であって、このプログラムは実行の終了まで実行されます。

  また、現在の印刷ジョブの実行のためにreporting.py。どのfetcher_report印刷ジョブのステータスのURLの(フェッチャ、統計、ファイル=なし)、URLはURLフェッチャ財産であり、プロジェクト全体のレポート(クローラ、ファイル=なし)URLの印刷ジョブのステータスすべて完了しました。

  至此,crawl的基本框架就展现在眼前了。至于在这个程序中出现的一些不容易理解的python语言特性,某些应用到的核心模块,将在下一篇博客《标准爬虫分析,精简不简单!》中进行阐述。

 

转载于:https://www.cnblogs.com/wangbiaoneu/p/crawl-python-500lines.html

おすすめ

転載: blog.csdn.net/weixin_34413103/article/details/93550861
おすすめ