Web クローラーの開発に伴い、データが悪意を持ってクロールされるのを防ぐために、ますます多くの Web サイトやサーバーがクローラー対策戦略を採用し始めています。これらの戦略には、IP ブロック、ユーザー エージェント検出、Cookie 検証などが含まれます。対応する対応戦略がなければ、当社のクローラーは簡単に悪意のあるものとして分類され、禁止されてしまう可能性があります。したがって、この状況を回避するには、Scrapy フレームワークのクローラー プログラムにプロキシ IP、ユーザー エージェント、Cookie などのポリシーを適用する必要があります。この記事では、これら3つの戦略を適用する方法を詳しく紹介します。
プロキシ IP は実際の IP アドレスを効果的に変更するため、サーバーがクローラ プログラムを検出できなくなります。同時に、プロキシ IP を使用すると、複数の IP をクロールする機会も得られるため、頻繁なリクエストによって単一の IP がブロックされる状況を回避できます。
Scrapy では、ミドルウェアを使用してプロキシ IP を設定できます。まず、settings.py で関連する設定を行う必要があります。例:
DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, 'scrapy.downloadermiddlewares.retry.RetryMiddleware': None, 'scrapy_proxies.RandomProxy': 100, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110, }
上記の設定では、scrapy_proxies ライブラリを使用してプロキシ IP 設定を実装します。このうち、100が優先度を表し、値が小さいほど優先度が高くなります。この設定の後、リクエスト プロセス中に、Scrapy はプロキシ IP プールから IP アドレスをランダムに選択してリクエストを行います。
もちろん、プロキシ IP ソースをカスタマイズすることもできます。たとえば、無料のプロキシ IP Web サイトが提供する API を使用して、プロキシ IP を取得できます。コード例は次のとおりです。
class GetProxy(object): def __init__(self, proxy_url): self.proxy_url = proxy_url def get_proxy_ip(self): response = requests.get(self.proxy_url) if response.status_code == 200: json_data = json.loads(response.text) proxy = json_data.get('proxy') return proxy else: return None class RandomProxyMiddleware(object): def __init__(self): self.proxy_url = 'http://api.xdaili.cn/xdaili-api//greatRecharge/getGreatIp?spiderId=e2f1f0cc6c5e4ef19f884ea6095deda9&orderno=YZ20211298122hJ9cz&returnType=2&count=1' self.get_proxy = GetProxy(self.proxy_url) def process_request(self, request, spider): proxy = self.get_proxy.get_proxy_ip() if proxy: request.meta['proxy'] = 'http://' + proxy
上記のコードでは、RandomProxyMiddleware クラスを定義し、Requests ライブラリを使用してプロキシ IP を取得します。リクエストヘッダーにプロキシIPを追加することで、プロキシIPを設定できます。
ユーザー エージェントは識別リクエスト ヘッダーの一部であり、リクエストを開始したデバイス、オペレーティング システム、ブラウザなどの情報が含まれています。多くのサーバーはリクエストを処理するときに、リクエスト ヘッダー内のユーザー エージェント情報を使用してリクエストがクローラーかどうかを判断し、それによってアンチクローラー処理を実行します。
同様に、Scrapy ではミドルウェアを使用してユーザー エージェント設定を実装できます。例:
class RandomUserAgent(object): def __init__(self): self.user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'] def process_request(self, request, spider): user_agent = random.choice(self.user_agents) request.headers.setdefault('User-Agent', user_agent)
上記のコードでは、RandomUserAgent クラスを定義し、リクエスト ヘッダー内のユーザー エージェント情報としてユーザー エージェントをランダムに選択します。こうすることで、たとえクローラーが大量のリクエストを送信したとしても、サーバーによって悪意のあるクローラーとみなされることを回避できます。
Cookie は、リクエストに応答するときに、応答ヘッダーの Set-Cookie フィールドを通じてサーバーによって返されるデータの一部です。ブラウザがサーバーへのリクエストを再度開始すると、以前の Cookie 情報がリクエスト ヘッダーに含まれ、ログイン検証やその他の操作が行われます。
同様に、Scrapy ではミドルウェアを介して Cookie を設定することもできます。例:
class RandomCookies(object): def __init__(self): self.cookies = { 'example_cookie': 'example_value' } def process_request(self, request, spider): cookie = random.choice(self.cookies) request.cookies = cookie
上記のコードでは、RandomCookies クラスを定義し、リクエスト ヘッダーの Cookie 情報として Cookie をランダムに選択します。このように、リクエストプロセス中に Cookie を設定することでログイン検証操作を実装できます。
概要
データ クロールに Scrapy を使用するプロセスでは、クローラー対策戦略のアイデアや手法を避けることが非常に重要です。この記事では、Scrapy のミドルウェアを介してプロキシ IP、ユーザー エージェント、Cookie およびその他のポリシーを設定し、クローラー プログラムをより隠蔽し安全にする方法について詳しく説明します。
以上がScrapy がプロキシ IP、ユーザー エージェント、Cookie を使用してクローラ対策戦略を回避する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。