社内で分散ディープ 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 を使用して実行することに決めました。この機能は、クローラによる直接の使用を容易にするために、クローラに取得/削除/更新およびその他のインターフェイスを提供することです。
[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
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 で利用可能なプロキシが更新されていることがわかります。 ProxyApi.py を開始した後、インターフェイスを使用してブラウザでプロキシを取得できます。これがプロキシです。ブラウザ内のスクリーンショット:index ページ:
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)}) # ....