目次
序文
クローラー テクノロジーの継続的な開発により、多くの Web サイトではデータとユーザーのプライバシーを保護するためにクロール防止メカニズムが採用されています。一般的なクローリング防止方法には、検証コードの設定、IP ブロック、アクセス頻度の制限などが含まれます。
ただし、テクノロジーがある限り、クローラー攻撃をクラックする方法が必要であるため、これらのクローリング防止メカニズムはクローラー攻撃を完全に防ぐことはできません。この記事では、クロール対策にプロキシ IP を使用する方法と、関連する Python コードと事例を紹介します。
1. プロキシ IP とは何ですか?
プロキシ IP とは、ネットワークにアクセスするときに、自分の IP アドレスの代わりにプロキシ サーバーの IP アドレスが使用されることを意味します。プロキシ サーバーはブリッジに相当し、最初に要求したデータをプロキシし、それをターゲット Web サイトに転送することで、実際の IP アドレスを隠す効果を実現します。
プロキシ IP は、身元を隠し、アクセス制限を突破し、アクセス速度を向上させ、個人のプライバシーを保護する機能を備えています。クロール防止の観点からは、プロキシ IP を使用すると、ブロックされた IP を効果的に回避し、ターゲット Web サイトのデータをクロールできます。
2. クロール防止にプロキシ IP を使用する
1.プロキシIPを取得する
プロキシ IP を取得する最も一般的な方法は、無料のプロキシ Web サイトをクロールするか、有料のプロキシ サービスを購入することです。無料プロキシ Web サイトの無料 IP の品質は不均一でブロックされやすいのに対し、有料プロキシ サービスの IP 品質は比較的高く、信頼性が高くなります。
プロキシ IP を取得するときは、次の点に注意する必要があります。
- 取得したプロキシ IP が使用可能でなければなりません。そうでないと、ターゲット Web サイトに正常にアクセスできません。
- 取得したプロキシ IP は、ブロックされたり無効になったりしないように定期的に更新する必要があります。
- 同じプロキシ IP を頻繁に使用しないでください。使用しないと、ターゲット Web サイトによって簡単に識別されてしまいます。
2.プロキシIPの設定
プロキシIPを使用する場合は、リクエストヘッダーにプロキシIPを設定する必要があります。リクエスト ライブラリを例に挙げると、次のコードを通じてプロキシ IP を設定できます。
import requests
proxies = {
'http': 'http://ip:port',
'https': 'https://ip:port'
}
response = requests.get(url, proxies=proxies)
このうち、「ip」と「port」はプロキシ IP のアドレスとポート番号であり、実際の状況に応じて設定する必要があります。
3. プロキシ IP を確認する
クロールする前に、プロキシ IP が利用可能かどうかを確認する必要があります。一般に、プロキシ IP が利用可能かどうかは、http://httpbin.org/ip Web サイトにアクセスすることで確認できます。リクエスト ライブラリを例に挙げると、次のコードを通じてプロキシ IP が利用可能かどうかを確認できます。
import requests
proxies = {
'http': 'http://ip:port',
'https': 'https://ip:port'
}
try:
response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10)
if response.status_code == 200:
print('代理IP可用')
else:
print('代理IP不可用')
except:
print('代理IP请求失败')
4.プロキシプールを設定する
単一のプロキシ IP の利用可能な時間は限られており、プロキシ IP の品質も不均一であるため、プロキシ プールを設定し、アクセスのために利用可能なプロキシ IP をランダムに選択する必要があります。
エージェント プールは、リスト、キュー、またはデータベースを通じて実装できます。リストを例として挙げると、次のコードを通じてプロキシ プールを設定できます。
proxy_pool = [
'http://ip1:port1',
'http://ip2:port2',
'http://ip3:port3',
...
]
proxy = random.choice(proxy_pool)
proxies = {
'http': proxy,
'https': proxy
}
このうち「random.choice(proxy_pool)」は、プロキシプールからランダムにプロキシIPを選択してアクセスすることを意味します。
5. プロキシ IP を定期的に更新する
プロキシ IP がブロックされたり無効になったりしないようにするには、プロキシ IP を定期的に更新する必要があります。プロキシ IP を更新するにはさまざまな方法があり、無料のプロキシ Web サイトをクロールしたり、有料のプロキシ サービスを購入したり、独自のプロキシ サーバーを構築したりすることができます。プロキシ IP を更新するときは、次の点に注意する必要があります。
- 更新されたプロキシ IP が使用可能である必要があります。
- 更新されたプロキシ IP をプロキシ プールに追加し、次のリクエストで使用するためにランダムに選択する必要があります。
3. 登山防止ケース
以下では、TOP250 Douban ムービーのクロールを例として、プロキシ IP を使用して逆クロールする方法を紹介します。
1. 対象のWebサイトを分析する
Douban Movie TOP250 の Web サイトは、https://movie.douban.com/top250 です。映画の名前、映画のリンク、映画の評価などの情報を取得する必要があります。
ブラウザの開発者ツールを開くと、ターゲット Web サイトのデータ リクエスト リンクが https://movie.douban.com/top250?start=0&filter= であることがわかります。ここで、「start」は開始位置を示します。 1ページあたり25項目のデータ、計10ページのデータです。映画の情報を取得するには、これら 10 ページのデータを走査する必要があります。
2. 対象の Web サイトをクロールします。
まず、プロキシ IP を取得する必要がありますが、ここで使用する無料プロキシ Web サイトは次のとおりです。
import requests
from bs4 import BeautifulSoup
import random
def get_proxy():
url = 'https://www.zdaye.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
trs = soup.find_all('tr')
proxy_list = []
for tr in trs[1:]:
tds = tr.find_all('td')
ip = tds[1].text
port = tds[2].text
proxy = 'http://{}:{}'.format(ip, port)
proxy_list.append(proxy)
return proxy_list
このうち、「get_proxy()」関数はプロキシ IP を取得するために使用され、プロキシ IP のリストを返します。
次に、プロキシ プールを設定する必要があります。コードは次のとおりです。
proxy_pool = get_proxy()
アクセスするプロキシ IP をランダムに選択します。コードは次のとおりです。
proxy = random.choice(proxy_pool)
proxies = {
'http': proxy,
'https': proxy
}
次に、ターゲット Web サイトのクロールを開始します。コードは次のとおりです。
import requests
from bs4 import BeautifulSoup
import random
def get_proxy():
url = 'https://www.zdaye.com/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
trs = soup.find_all('tr')
proxy_list = []
for tr in trs[1:]:
tds = tr.find_all('td')
ip = tds[1].text
port = tds[2].text
proxy = 'http://{}:{}'.format(ip, port)
proxy_list.append(proxy)
return proxy_list
def get_movie_info(url, proxies):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers, proxies=proxies)
soup = BeautifulSoup(response.text, 'html.parser')
items = soup.find_all('div', class_='info')
movie_list = []
for item in items:
name = item.find('span', class_='title').text
href = item.find('a')['href']
rating = item.find('span', class_='rating_num').text
movie_info = {
'name': name,
'href': href,
'rating': rating
}
movie_list.append(movie_info)
return movie_list
if __name__ == '__main__':
proxy_pool = get_proxy()
movie_list = []
for i in range(10):
url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)
proxy = random.choice(proxy_pool)
proxies = {
'http': proxy,
'https': proxy
}
movie_list += get_movie_info(url, proxies)
print(movie_list)
コードを実行するときに、プロキシ IP が利用できない場合があります。これは、複数回試行するか、プロキシ IP を定期的に更新することで解決できます。
4. まとめ
この記事では、クロール防止にプロキシ IP を使用する方法を紹介し、関連する Python コードとケースを示します。実際にデータをクロールする場合は、次の点にも注意する必要があります。
- ターゲット Web サイトへの頻繁なリクエストを回避し、ターゲット Web サイトへの負担を最小限に抑えます。
- 実際のリクエストをシミュレートし、User-Agent や Referer などの適切なリクエスト ヘッダー パラメータを設定します。
- 検証コード、JS レンダリング、動的 IP などのクロール防止メカニズムを処理します。
つまり、クローラ防止メカニズムはクローラ開発において避けられない課題であり、課題にうまく対処して必要なデータを取得するための技術の継続的な学習、方法の探索、および戦略の思考が必要です。