序文
この記事では、Python クローラー テクノロジーを使用してプロキシ IP を取得し、それをファイルに保存する方法を紹介します。サードパーティのライブラリ リクエストを使用して HTTP リクエストを送信し、lxml ライブラリを使用して HTML を解析することにより、複数の Web ページから IP、ポート、およびアドレス情報を取得できます。この記事では、読者がクローラーの動作をよりよく理解できるように、コードの各部分を段階的に分析します。
依存ライブラリをインポートする
import requests
from lxml import etree
requests
HTTP リクエストを送信するためのライブラリとHTML を解析するためのライブラリをインポートしますlxml
。
データを書き込む準備ができているファイルを開きます
with open('IP代理.txt','w',encoding='utf-8') as f:
open
関数を使用してファイル オブジェクトを作成しf
、ファイル名を指定し'IP代理.txt'
、書き込みモードでファイルを開きます。エンコーディングは に設定されています'utf-8'
。
複数のページをクロールするループ
for i in range(1,10):
url = f'http://www.66ip.cn/{
i}.html'
print(f'正在获取{
url}')
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
}
resp = requests.get(url,headers = headers)
resp.encoding ='gbk'
e = etree.HTML(resp.text)
ips = e.xpath('//div[1]/table//tr/td[1]/text()')
ports = e.xpath('//div[1]/table//tr/td[2]/text()')
addrs = e.xpath('//div[1]/table//tr/td[3]/text()')
for i,p,a in zip(ips,ports,addrs):
f.write(f'IP地址:{
i}----port端口号:{
p}-----地址:{
a}\n')
コードのこの部分では、ループを使用して複数のページのプロキシ情報をクロールします。ループ変数のi
範囲は 1 ~ 9 です。ページごとに、最初に完全な URL が構築されます。http://www.66ip.cn/{i}.html
ここで、{i}
はページのページ番号です。次に、print
関数を使用して、取得されているページの URL を出力します。
次に、独自のブラウザを偽装するために、headers
ブラウザのユーザー エージェント情報を含む辞書が定義されます。
ディクショナリ内のユーザー エージェント情報をrequests
使用して、ライブラリを通じてGET リクエストを送信します。headers
取得した応答内容はresp
変数に保存されます。
対象の Web サイトでは GBK エンコードが使用されているため、応答のエンコードを に設定します'gbk'
。
応答コンテンツを操作可能な HTML オブジェクトに解析し、ライブラリの関数e
を使用して変数に代入します。lxml
etree.HTML
XPath 式を使用して HTML オブジェクトから IP、ポート、およびアドレスのリストを抽出します。IP リストは に保存されips
、ポート リストは に保存されports
、アドレス リストはaddrs
に保存されます。
関数を使用してzip
3 つのリストを 1 つずつパックし、for
ループを使用してパックされたデータを走査します。ループ内では、 file オブジェクトf
のメソッドを使用してwrite
各プロキシ情報をファイルに書き込みます。書き込み形式は です'IP地址:{i}----port端口号:{p}-----地址:{a}\n'
。
コード全体の機能は、複数の Web ページの IP、ポート、およびアドレス情報をクロールし、結果を'IP代理.txt'
という名前のファイルに保存することです。
完全なコード
import requests
from lxml import etree
# 定义保存结果的文件
with open('IP代理.txt', 'w', encoding='utf-8') as f:
# 循环爬取多个页面
for i in range(1, 10):
# 构造完整的URL
url = f'http://www.66ip.cn/{
i}.html'
print(f'正在获取{
url}')
# 伪装浏览器请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'
}
# 发送GET请求
resp = requests.get(url, headers=headers)
# 设置响应的编码为GBK
resp.encoding = 'gbk'
# 解析HTML
e = etree.HTML(resp.text)
# 提取IP、Port和地址信息
ips = e.xpath('//div[1]/table//tr/td[1]/text()')
ports = e.xpath('//div[1]/table//tr/td[2]/text()')
addrs = e.xpath('//div[1]/table//tr/td[3]/text()')
# 将提取的代理信息写入文件
for ip, port, addr in zip(ips, ports, addrs):
f.write(f'IP地址:{
ip}----port端口号:{
port}-----地址:{
addr}\n')
実行結果
結論
この記事で紹介した Python クローラー テクノロジーを使用すると、プロキシ IP を簡単に取得してファイルに保存できます。これは、データ収集、クローラ対策処理、またはプロキシ IP を使用する必要があるその他の Web クローラ アプリケーションに非常に役立ちます。この記事が、クローラーの動作原理をより深く理解し、実際のプロジェクトで役割を果たすのに役立つことを願っています。