この記事の内容は、Python を使用して匿名プロキシ プールを構築する方法を紹介することです。匿名プロキシ プールを構築する方法。一定の参考値があるので、困っている友達は参考にしていただければ幸いです。
クローラーが多すぎるために自分の IP が Web サイトによってブロックされ、さまざまなプロキシ IP を頻繁に使用する必要があるという多くの人々の不満をよく聞きますが、インターネット上のパブリック プロキシのほとんどは使用できないため、お金と労力をかけて VIP エージェントに応募する必要がありますが、紆余曲折を経てブロックされてしまいます。ここでは、時間とエネルギーコストを削減し、アクティブなプロキシ IP を自動的に取得する機能を実現するために、Python を使用してプロキシ プールを構築する方法に関する記事を書きます。
動作原理
1. Web サイト プロキシの取得
1. 無料のプロキシ Web サイトの IP リストにアクセスして、プロキシが適切かどうかをテストします。匿名
2. すべてある場合はデータベースに入れ、そうでない場合は破棄します。
3. 手順 2
2 を繰り返します。障害が発生したエージェントをできるだけ早くエージェント プールから選択できるようにします
1. クローラー データベースから IP を取得します。
2. IP の可用性と匿名性をテストします。
3. 利用可能な場合匿名の場合は保持し、そうでない場合は破棄します。
4. ステップ 1 を繰り返します
手順①: この側面を持つクローラー デーモン (Daemon) を作成できます。必要な人は自分でググってみてください、ここでは紹介しません。
説明②: 外部プロキシ情報インターフェースを構築できます。NodeJS、Flask/Django、PHPのどれで記述しても構いません。ここでは紹介しません。 。
実装:
推奨ライブラリ:requests、BeautifulSoup、re、sqlite3。
このうち、request ライブラリはエージェントの Web サイトページの取得に使用され、BeautifulSoup および re ライブラリはエージェント情報の取得に使用され、sqlite3 はこの情報にアクセスするために使用されます。
必要に応じて (プロキシ Web サイトにクローラ対策戦略がある場合など)、PhantomJS を使用してリクエストを置き換えたり、対応するライブラリをデータ クリーニング (base64 デコードなど) に使用したりできます。
以下は、コードの各部分の簡単なデモです:
最初は、プロキシをクロールでき、IP によって簡単にブロックされない複数の Web サイトを選択します。ここでは、proxy-list です。 org は例として使用されます。
BASE_URL = "https://proxy-list.org/english/index.php?p=" #IP地址及端口的正则 Re_Pattern_IP = re.compile("(.*):") Re_Pattern_PORT = re.compile(":(.*)") #网站有11页,所以循环11次获取所有代理IP及端口 for startingURL_Param in range(1,11): HTML_ProxyPage = requests.get(BASE_URL+str(startingURL_Param)).content soup = bs(HTML_ProxyPage,"html.parser") for Raw_ProxyInfo in soup.find_all("ul",{"class":None}): #此网站有用Base64简单对代理进行了加密,所以这里对其解码 ip_port = base64.b64decode(Raw_ProxyInfo.find("li",{"class":"proxy"}).text.replace("Proxy('","").replace("')","")) #接下来利用正则从网页数据中提取我们需要的信息 IP = re.findall(Re_Pattern_IP, ip_port)[0] PORT = re.findall(Re_Pattern_PORT, ip_port)[0] TYPE = Raw_ProxyInfo.find("li",{"class":"https"}).text
以下は、プロキシ データベースの追加、削除、接続性の検出、および匿名性の検出を提供する単純なプロキシ プール フレームワーク クラスのコードです:
class ProxyPool: #初始化爬虫池数据库 def __init__(self,ProxyPoolDB): self.ProxyPoolDB = ProxyPoolDB self.conn = sqlite3.connect(self.ProxyPoolDB, isolation_level=None) self.cursor = self.conn.cursor() self.TB_ProxyPool = "TB_ProxyPool" self.cursor.execute("CREATE TABLE IF NOT EXISTS "+self.TB_ProxyPool+"(ip TEXT UNIQUE, port INTEGER, protocol TEXT)") #添加代理IP进代理池的接口 def addProxy(self, IP, PORT, PROTOCOL): self.cursor.execute("INSERT OR IGNORE INTO " + self.TB_ProxyPool+"(ip, port, protocol) VALUES (?,?,?)", [IP,PORT,PROTOCOL]) #检查代理的匿名性及可连接性 def testConnection(self, IP, PORT, PROTOCOL): proxies = { PROTOCOL: IP+":"+PORT } try: OrigionalIP = requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT).content MaskedIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT,proxies=proxies).content if OrigionalIP != MaskedIP: return True else: return False except: return False #删除代理IP对应的数据库记录 def delRecord(self, IP): self.cursor.execute("DELETE FROM "+self.TB_ProxyPool+" WHERE ip=?",(IP,))
以下は、プロキシ プールを削除する手順です。無効な IP のコード: 振り返ってみると、ロジックが十分に厳密ではなく、さまざまな機能が結合されすぎており、多くの段落を書き直す必要があります。コードはキャンパス ネットワーク上で実行されるため、ネットワーク接続の安定性を考慮する必要があるため、一部のコード間で不整合が発生します。 icanhazip.com を介してプロキシの匿名性を検出する方法は効果的かもしれませんが、X-Forwarded-For HTTP ヘッダーを無視するため、非常に危険であり、改善する必要があります。
エージェント プール内のエージェントの有効性を確認するにはマルチスレッドが必要ですが、現在のソリューションは非効率すぎます。
完全なコード
以上がPython を使用して匿名プロキシ プールを構築するにはどうすればよいですか?匿名プロキシ プールを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。