ホームページ >バックエンド開発 >Python チュートリアル >Scrapy のパワー: 検証コードを認識して処理する方法?

Scrapy のパワー: 検証コードを認識して処理する方法?

王林
王林オリジナル
2023-06-22 15:09:121824ブラウズ

Scrapy は、Web サイト上のデータを簡単にクロールできる強力な Python フレームワークです。ただし、クロールしたい Web サイトに確認コードがある場合、問題が発生します。 CAPTCHA の目的は、自動化されたクローラーによる Web サイトへの攻撃を防ぐことであるため、CAPTCHA は非常に複雑になり、解読が困難になる傾向があります。この投稿では、Scrapy フレームワークを使用して CAPTCHA を識別および処理し、クローラがこれらの防御を回避できるようにする方法について説明します。

確認コードとは何ですか?

キャプチャは、ユーザーが機械ではなく本物の人間であることを証明するために使用されるテストです。通常、これは難読化されたテキスト文字列または判読不能な画像であり、ユーザーは表示内容を手動で入力または選択する必要があります。 CAPTCHA は、自動化されたボットやスクリプトを捕捉して、Web サイトを悪意のある攻撃や悪用から保護するように設計されています。

通常、CAPTCHA には次の 3 種類があります。

  1. テキスト CAPTCHA: ユーザーは、自分がボットではなく人間のユーザーであることを証明するために、テキスト文字列をコピーして貼り付ける必要があります。
  2. 番号確認コード: ユーザーは、表示された番号を入力ボックスに入力する必要があります。
  3. 画像検証コード: ユーザーは、表示された画像内の文字または数字を入力ボックスに入力する必要があります。これは、画像内の文字や数字が歪む可能性があるため、通常、解読が最も困難なタイプです。場所が間違っているか、その他の視覚的なノイズがあります。

なぜ確認コードを処理する必要があるのですか?

クローラーは大規模に自動化されることが多いため、簡単にロボットであると識別され、Web サイトからのデータ取得が禁止される可能性があります。これを防ぐために CAPTCHA が導入されました。 ep が検証コード段階に入ると、Scrapy クローラーはユーザー入力の待機を停止するため、データのクロールを続行できなくなり、クローラーの効率と整合性が低下します。

したがって、クローラーが自動的にタスクを通過してタスクを続行できるように、検証コードを処理する方法が必要です。通常、検証コードの認識を完了するにはサードパーティのツールまたは API を使用します。これらのツールと API は、機械学習と画像処理アルゴリズムを使用して画像と文字を認識し、結果をプログラムに返します。

Scrapy で検証コードを処理するにはどうすればよいですか?

Scrapy の settings.py ファイルを開き、DOWNLOADER_MIDDLEWARES フィールドを変更して次のプロキシを追加する必要があります:

DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 350、'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': 400、
'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700、'scrapy.contrib. downloadermiddleware.httpproxy.HttpProxyMiddleware': 750,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400,'scrapy.contrib.downloadermiddleware.defaultheaders.DefaultHeadersMiddleware': 550,
'scrapy.contrib.downloadermiddleware。 ajaxcrawl.AjaxCrawlMiddleware': 900,'scrapy.contrib.downloadermiddleware.httpcompression.HttpCompressionMiddleware': 800,
'scrapy.contrib.downloadermiddleware.chunked.ChunkedTransferMiddleware': 830,'scrapy.contrib.downloadermiddleware.stats.DownloaderSt ats ' : 850,
'tutorial.middlewares.CaptchaMiddleware': 999}

この例では、CaptchaMiddleware を使用して検証コードを処理します。 CaptchMiddleware は、ダウンロード リクエストを処理し、必要に応じて API を呼び出して検証コードを識別し、リクエストに検証コードを入力して戻って実行を継続するカスタム ミドルウェア クラスです。

コード例:

class CaptchaMiddleware(object):

def __init__(self):
    self.client = CaptchaClient()
    self.max_attempts = 5

def process_request(self, request, spider):
    # 如果没有设置dont_filter则默认开启
    if not request.meta.get('dont_filter', False):
        request.meta['dont_filter'] = True

    if 'captcha' in request.meta:
        # 带有验证码信息
        captcha = request.meta['captcha']
        request.meta.pop('captcha')
    else:
        # 没有验证码则获取
        captcha = self.get_captcha(request.url, logger=spider.logger)

    if captcha:
        # 如果有验证码则添加到请求头
        request = request.replace(
            headers={
                'Captcha-Code': captcha,
                'Captcha-Type': 'math',
            }
        )
        spider.logger.debug(f'has captcha: {captcha}')

    return request

def process_response(self, request, response, spider):
    # 如果没有验证码或者验证码失败则不重试
    need_retry = 'Captcha-Code' in request.headers.keys()
    if not need_retry:
        return response

    # 如果已经尝试过,则不再重试
    retry_times = request.meta.get('retry_times', 0)
    if retry_times >= self.max_attempts:
        return response

    # 验证码校验失败则重试
    result = self.client.check(request.url, request.headers['Captcha-Code'])
    if not result:
        spider.logger.warning(f'Captcha check fail: {request.url}')
        return request.replace(
            meta={
                'captcha': self.get_captcha(request.url, logger=spider.logger),
                'retry_times': retry_times + 1,
            },
            dont_filter=True,
        )

    # 验证码校验成功则继续执行
    spider.logger.debug(f'Captcha check success: {request.url}')
    return response

def get_captcha(self, url, logger=None):
    captcha = self.client.solve(url)
    if captcha:
        if logger:
            logger.debug(f'get captcha [0:4]: {captcha[0:4]}')
        return captcha

    return None

このミドルウェアでは、CaptchaClient オブジェクトをキャプチャ ソリューション ミドルウェアとして使用し、複数のキャプチャ ソリューションを使用できます。ミドルウェア。

注意事項

このミドルウェアを実装する場合は、次の点に注意してください。

  1. 検証コードの識別と処理には、サードパーティ ツールの使用が必要です。法的ライセンスを取得していることを確認し、メーカーの要件に従って使用する必要があります。
  2. このようなミドルウェアを追加した後は、リクエスト プロセスがより複雑になるため、開発者はプログラムが適切に動作することを確認するために慎重にテストとデバッグを行う必要があります。

結論

検証コードの認識と処理に Scrapy フレームワークとミドルウェアを使用することで、検証コード防御戦略を効果的に回避し、ターゲット Web サイトの効果的なクローリングを実現できます。この方法は通常、検証コードを手動で入力するよりも時間と労力を節約し、より効率的かつ正確です。ただし、サードパーティのツールや API を使用する前に、それらのライセンス契約と要件を読み、それらの要件に従うことに注意することが重要です。

以上がScrapy のパワー: 検証コードを認識して処理する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。