Python クローラーエージェント IP プールの実装方法

高洛峰
リリース: 2017-02-11 13:09:46
オリジナル
2649 人が閲覧しました

社内で分散ディープ Web クローラーとして機能し、数千のクローラーに効果的なプロキシを提供する安定したプロキシ プール サービスを構築しました。これにより、各クローラーが対応する Web サイトの有効なプロキシ IP を確実に取得できるようになり、クローラーの高速性が保証されます。安定して動作するため、いくつかの無料リソースを使用して、単純なプロキシ プール サービスを構築したいと考えています。

社内で分散型ディープ Web クローラーとして機能する私たちは、数千のクローラーに効果的なプロキシを提供する安定したプロキシ プール サービスを構築しました。これにより、各クローラーが対応する Web サイトの有効なプロキシ IP を確実に取得できるようになり、それによってクローラーが高速かつ安定した動作、もちろん自社で作ったものをオープンソース化することはできません。しかし、暇なときはかゆいので、無料のリソースを使って簡単なプロキシ プール サービスを構築したいと思います。

1. 質問

プロキシ IP はどこから来ていますか?
私が初めて自分でクロールを学んだとき、プロキシ IP を持っていなかったので、Xiqi プロキシや Express プロキシなどの無料プロキシを備えた Web サイトにアクセスしてクロールしました。まだ使用できるプロキシがいくつかあります。もちろん、より優れたプロキシ インターフェイスがある場合は、自分で接続することもできます。 無料のプロキシの収集も非常に簡単で、ページにアクセスする —> 通常/xpath 抽出 —> 保存

プロキシの品質を確保するにはどうすればよいですか?
無料のプロキシ IP のほとんどが使用できないことは確かです。そうでない場合、なぜ他社が有料 IP を提供するのでしょうか (しかし実際には、多くのエージェントの有料 IP は安定しておらず、その多くは使用できません)。したがって、収集したプロキシ IP を直接使用することはできません。これらのプロキシを継続的に使用する検出プログラムを作成して、安定した Web サイトにアクセスし、正常に使用できるかどうかを確認できます。プロキシの検出は遅いプロセスであるため、このプロセスはマルチスレッドまたは非同期にすることができます。

収集したプロキシを保存するにはどうすればよいですか?
Redis のプロキシには、複数のデータ構造をサポートする高性能 NoSQL データベースである SSDB をお勧めします。キュー、ハッシュ、セット、k-v ペア、および T レベル データをサポートします。これは、分散クローラーにとって非常に優れた中間ストレージ ツールです。

クローラーがこれらのプロキシを簡単に使用できるようにするにはどうすればよいですか?
その答えは間違いなく、Python には多数の Web フレームワークがあり、クローラが呼び出す API を作成することです。これには多くの利点があります。たとえば、クローラは、エージェントが使用できないことを検出した場合、エージェント プール IP が不十分であることを検出した場合、API を介してエージェント IP をアクティブに削除できます。 。これは検出プログラムよりも信頼性が高くなります。

2. プロキシ プールの設計

プロキシ プールは 4 つの部分で構成されます:

ProxyGetter:
プロキシ取得インターフェイスが呼び出されるたびに、これら 5 つの Web サイトの最新のプロキシが取得されます。 DB を入力すると、プロキシ取得インターフェイスを自分で追加できます。

DB:
はプロキシ IP を保存するために使用され、現在は SSDB のみをサポートしています。 SSDB を選択する理由については、個人的には、SSDB が Redis の代替として適していると思います。

スケジュール:
を参照してください。スケジュールされたタスクのユーザーは、DB 内のエージェントの可用性を定期的に確認し、利用できないエージェントを削除します。同時に、ProxyGetter を通じて最新のプロキシを取得して DB に配置することもできます。

ProxyApi:
プロキシ プールの機能は比較的シンプルなので、 Flask を 2 時間眺めた後、喜んで Flask を使用して実行することに決めました。この機能は、クローラによる直接の使用を容易にするために、クローラに取得/削除/更新およびその他のインターフェイスを提供することです。

Python クローラーエージェント IP プールの実装方法

[HTML_REMOVED] デザイン

3. コード モジュール

Python の高レベルのデータ構造、動的型付け、および動的バインディングにより、迅速なアプリケーション開発に非常に適しており、グルー言語接続としても適しています。コンポーネント。 Python を使用してこのプロキシ IP プールを作成することも非常に簡単です。コードは 6 つのモジュールに分かれています:

Api: API インターフェイス関連のコード 現在、API は Flask によって実装されており、コードも非常に単純です。クライアントリクエストは Flask に渡され、Flask は get/delete/refresh/get_all を含む ProxyManager の実装を呼び出します。 get/delete/refresh/get_all

DB:   数据库相关代码,目前数据库是采用SSDB。代码用工厂模式实现,方便日后扩展其他类型数据库;

Manager:   get/delete/refresh/get_all

DB: データベース関連のコード。現在のデータベースは SSDB を使用します。コードは、将来他のタイプのデータベースの拡張を容易にするために、ファクトリ モードで実装されています。

Manager: get/delete/refresh/get_all などのインターフェイスの特定の実装クラス。プロキシの管理のみを担当しますが、将来的にはさらに多くの機能が追加される可能性があります (エージェントとクローラのバインディング、エージェントとアカウントのバインディングなど)。

ProxyGetter: 現在、エージェントによって取得される関連コード。エージェント、エージェント 66、エージェント、Xixi エージェント、および guobanjia がキャプチャされます。テストの結果、これら 5 つの Web サイトには、毎日更新される利用可能なプロキシが 60 個または 70 個しかありません。プロキシ インターフェイス; 🎜🎜スケジュール: スケジュールされたタスク関連のコード。スケジュールされた更新コードのみを実装し、マルチプロセス メソッドを使用して利用可能なエージェントを確認します。

Util: GetConfig:读取配置文件config.ini的类,ConfigParse: 集成重写ConfigParser的类,使其对大小写敏感, Singleton:实现单例,LazyPropertyを含むいくつかのパブリック モジュール メソッドまたは関数を保存します: クラス属性の遅延計算を実装します。など;

その他のファイル: 構成ファイル: Config.ini、データベース構成およびプロキシ取得インターフェース構成 GetFreeProxy に新しいプロキシ取得メソッドを追加し、それを Config.ini に登録して使用できます。

4.

ダウンロードコード:

git clone git@github.com:jhao104/proxy_pool.git

或者直接到https://github.com/jhao104/proxy_pool 下载zip文件
ログイン後にコピー

依存関係のインストール:

pip install -r requirements.txt
ログイン後にコピー

起動:

需要分别启动定时任务和api
到Config.ini中配置你的SSDB

到Schedule目录下:
>>>python ProxyRefreshSchedule.py

到Api目录下:
>>>python ProxyApi.py
ログイン後にコピー

5. を使用します

スケジュールされたタスクが開始されると、メソッドが取得されますエージェント経由 すべてのエージェントをデータベースにフェッチして確認します。その後、デフォルトで 20 分ごとに繰り返されます。スケジュールされたタスクが開始されてから約 1 ~ 2 分後、SSDB で利用可能なプロキシが更新されていることがわかります。

Python クローラーエージェント IP プールの実装方法

ProxyApi.py を開始した後、インターフェイスを使用してブラウザでプロキシを取得できます。これがプロキシです。ブラウザ内のスクリーンショット:

index ページ:


Python クローラーエージェント IP プールの実装方法

get ページ:


Python クローラーエージェント IP プールの実装方法

get_all ページ:


Python クローラーエージェント IP プールの実装方法

クローラーで使用されます。クローラー コードで使用したい場合は、カプセル化できます。この API を関数に直接使用します。例:

import requests

def get_proxy():
  return requests.get("http://127.0.0.1:5000/get/").content

def delete_proxy(proxy):
  requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))

# your spider code

def spider():
  # ....
  requests.get('https://www.example.com', proxies={"http": "http://{}".format(get_proxy)})
  # ....
ログイン後にコピー

6. 最後に

急いでいるのですが、関数とコードは比較的単純です。将来時間があれば改善します。気に入ったら、github でスターを付けてください。ありがたい!

Python クローラー エージェント IP プールの実装方法に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート