ホームページ バックエンド開発 Python チュートリアル Python 分散クローラーの原理についての深い理解

Python 分散クローラーの原理についての深い理解

Nov 26, 2020 pm 05:59 PM
python 分散型クローラー

Python ビデオ チュートリアル コラムでは、分散クローラーの原理を紹介します。

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 = &#39;<title>([^<]*?)</title>&#39; 
  temp = re.findall(pattern, html) 
  if temp: 
    content = temp[0] 
   
  return content 
   
def saveData(data): 
  &#39;&#39;&#39;&#39;&#39; 
  @summary: 数据存储 
  &#39;&#39;&#39; 
  f = open(&#39;test&#39;, &#39;wb&#39;) 
  f.write(data) 
  f.close() 
   
if __name__ == &#39;__main__&#39;: 
  url = &#39;http://www.baidu.com&#39; 
  httpCrawler(url)
ログイン後にコピー

非常にシンプルに見えますが、はい、これはクローラーを使い始めるための基本的なプログラムです。もちろん、収集プロセスの実装は上記の基本的な手順にすぎません。しかし、強力な収集プロセスを実装するには、次の問題が発生します:

(1) Cookie 情報によるアクセスが必要 たとえば、ほとんどのソーシャル ソフトウェアは基本的にユーザーにログインを要求します。価値のあるものを見ることができますか? 実際、それは非常に簡単です。Python が提供する cookielib モジュールを使用して、ソース Web サイトから提供される Cookie 情報を使用してすべての訪問を実現できます。このようにして、ログインを正常にシミュレートする限り、クローラーがログインしている状態になると、ログインしているユーザーに表示されるすべての情報を収集できます。以下は、Cookie を使用した httpRequest() メソッドの変更です:

ckjar = cookielib.MozillaCookieJar() 
cookies = urllib2.HTTPCookieProcessor(ckjar)     #定义cookies对象 
def httpRequest(url): 
  &#39;&#39;&#39;&#39;&#39; 
  @summary: 网络请求 
  &#39;&#39;&#39;  
  try: 
    ret = None 
    SockFile = None 
    request = urllib2.Request(url) 
    request.add_header(&#39;User-Agent&#39;, &#39;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)&#39;) 
    request.add_header(&#39;Pragma&#39;, &#39;no-cache&#39;) 
    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(&#39;gbk&#39;, &#39;ignore&#39;)   #将gbk编码转为unicode编码 
content = content.encode(&#39;utf-8&#39;, &#39;ignore&#39;)  #将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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

hadidb:pythonの軽量で水平方向にスケーラブルなデータベース hadidb:pythonの軽量で水平方向にスケーラブルなデータベース Apr 08, 2025 pm 06:12 PM

hadidb:軽量で高レベルのスケーラブルなPythonデータベースHadIDB(HadIDB)は、Pythonで記述された軽量データベースで、スケーラビリティが高くなっています。 PIPインストールを使用してHADIDBをインストールする:PIPINSTALLHADIDBユーザー管理CREATEユーザー:CREATEUSER()メソッド新しいユーザーを作成します。 Authentication()メソッドは、ユーザーのIDを認証します。 fromhadidb.operationimportuseruser_obj = user( "admin"、 "admin")user_obj。

Python:主要なアプリケーションの調査 Python:主要なアプリケーションの調査 Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間のPython計画:現実的なアプローチ 2時間のPython計画:現実的なアプローチ Apr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

MongoDBデータベースパスワードを表示するNAVICATの方法 MongoDBデータベースパスワードを表示するNAVICATの方法 Apr 08, 2025 pm 09:39 PM

Hash値として保存されているため、Navicatを介してMongoDBパスワードを直接表示することは不可能です。紛失したパスワードを取得する方法:1。パスワードのリセット。 2。構成ファイルを確認します(ハッシュ値が含まれる場合があります)。 3.コードを確認します(パスワードをハードコードできます)。

Amazon AthenaでAWS接着クローラーの使用方法 Amazon AthenaでAWS接着クローラーの使用方法 Apr 09, 2025 pm 03:09 PM

データの専門家として、さまざまなソースから大量のデータを処理する必要があります。これは、データ管理と分析に課題をもたらす可能性があります。幸いなことに、AWS GlueとAmazon Athenaの2つのAWSサービスが役立ちます。

高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? 高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? Apr 08, 2025 pm 06:03 PM

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

Redisでサーバーを開始する方法 Redisでサーバーを開始する方法 Apr 10, 2025 pm 08:12 PM

Redisサーバーを起動する手順には、以下が含まれます。オペレーティングシステムに従ってRedisをインストールします。 Redis-Server(Linux/Macos)またはRedis-Server.exe(Windows)を介してRedisサービスを開始します。 Redis-Cli ping(Linux/macos)またはRedis-Cli.exePing(Windows)コマンドを使用して、サービスステータスを確認します。 Redis-Cli、Python、node.jsなどのRedisクライアントを使用して、サーバーにアクセスします。

Redisキューの読み方 Redisキューの読み方 Apr 10, 2025 pm 10:12 PM

Redisのキューを読むには、キュー名を取得し、LPOPコマンドを使用して要素を読み、空のキューを処理する必要があります。特定の手順は次のとおりです。キュー名を取得します:「キュー:キュー」などの「キュー:」のプレフィックスで名前を付けます。 LPOPコマンドを使用します。キューのヘッドから要素を排出し、LPOP Queue:My-Queueなどの値を返します。空のキューの処理:キューが空の場合、LPOPはnilを返し、要素を読む前にキューが存在するかどうかを確認できます。

See all articles