Rumah >pembangunan bahagian belakang >Tutorial Python >Kuasa Scrapy: Bagaimana untuk mengenali dan memproses kod pengesahan?

Kuasa Scrapy: Bagaimana untuk mengenali dan memproses kod pengesahan?

王林
王林asal
2023-06-22 15:09:121824semak imbas

Scrapy ialah rangka kerja Python yang berkuasa yang membantu kami merangkak data di tapak web dengan mudah. Walau bagaimanapun, kami menghadapi masalah apabila tapak web yang ingin kami rangkak mempunyai kod pengesahan. Tujuan CAPTCHA adalah untuk menghalang perangkak automatik daripada menyerang tapak web, jadi mereka cenderung menjadi sangat kompleks dan sukar untuk dipecahkan. Dalam siaran ini, kami akan membincangkan cara menggunakan rangka kerja Scrapy untuk mengenal pasti dan memproses CAPTCHA untuk membolehkan perangkak kami memintas pertahanan ini.

Apakah itu kod pengesahan?

Captcha adalah ujian yang digunakan untuk membuktikan bahawa pengguna adalah manusia sebenar dan bukan mesin. Ia biasanya rentetan teks yang dikelirukan atau imej yang tidak boleh dibaca yang memerlukan pengguna memasukkan atau memilih perkara yang dipaparkan secara manual. CAPTCHA direka bentuk untuk menangkap bot dan skrip automatik untuk melindungi tapak web daripada serangan berniat jahat dan penyalahgunaan.

Secara amnya terdapat tiga jenis CAPTCHA:

  1. Teks CAPTCHA: Pengguna perlu menyalin dan menampal rentetan teks untuk membuktikan mereka adalah pengguna manusia dan bukan bot.
  2. Kod pengesahan nombor: Pengguna dikehendaki memasukkan nombor yang dipaparkan dalam kotak input.
  3. Kod pengesahan imej: Pengguna dikehendaki memasukkan aksara atau nombor daripada imej yang dipaparkan dalam kotak input Ini biasanya jenis yang paling sukar untuk dipecahkan kerana aksara atau nombor dalam imej boleh diherotkan, salah letak atau Mempunyai bunyi visual yang lain.

Mengapa anda perlu memproses kod pengesahan?

Perangkak selalunya diautomasikan pada skala besar, jadi mereka boleh dikenal pasti dengan mudah sebagai bot dan dilarang daripada tapak web daripada menuai data. CAPTCHA telah diperkenalkan untuk mengelakkan perkara ini daripada berlaku. Sebaik sahaja ep memasuki peringkat kod pengesahan, perangkak Scrapy akan berhenti menunggu input pengguna, dan oleh itu tidak boleh terus merangkak data, mengakibatkan penurunan kecekapan dan integriti perangkak.

Oleh itu, kami memerlukan cara untuk mengendalikan captcha supaya perangkak kami boleh lulus secara automatik dan meneruskan tugasnya. Biasanya kami menggunakan alat atau API pihak ketiga untuk melengkapkan pengecaman kod pengesahan ini menggunakan pembelajaran mesin dan algoritma pemprosesan imej untuk mengecam imej dan aksara, dan mengembalikan hasilnya kepada program kami.

Bagaimana untuk mengendalikan kod pengesahan dalam Scrapy?

Buka fail settings.py Scrapy, kita perlu mengubah suai medan DOWNLOADER_MIDDLEWARES dan menambah proksi berikut:

DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,>'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700 downloadermiddleware.httpproxy.HttpProxyMiddleware': 750,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400,'scrapy.contrib.downloadermiddleware.defaultheaders.DefaultHeadersMiddleware': ..contribMiddleware': 5. ajaxcrawl.AjaxCrawlMiddleware': 900,'scrapy.contrib.downloadermiddleware.httpcompression.HttpCompressionMiddleware': 800,
'scrapy.contrib.downloadermiddleware.chunked.ChunkedTransferMiddleware': 830,'scrapy.statpy 850,
'tutorial.middlewares.CaptchaMiddleware': 999}

Dalam contoh ini, kami menggunakan CaptchaMiddleware untuk mengendalikan kod pengesahan. CaptchMiddleware ialah kelas middleware tersuai yang akan mengendalikan permintaan muat turun dan memanggil API untuk mengenal pasti kod pengesahan apabila diperlukan, kemudian mengisi kod pengesahan ke dalam permintaan dan kembali untuk meneruskan pelaksanaan.

Contoh kod:

class CaptchaMiddleware(objek):

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

Dalam middleware ini, kami telah menggunakan objek CaptchaClient sebagai middleware penyelesaian captcha, kami boleh menggunakan beberapa perisian tengah penyelesaian captcha .

Nota

Apabila melaksanakan perisian tengah ini, sila beri perhatian kepada perkara berikut:

Pengenalpastian dan pemprosesan kod pengesahan memerlukan penggunaan alat pihak ketiga atau API Kita perlu memastikan kita mempunyai lesen yang sah dan menggunakannya mengikut keperluan pengeluar.
  1. Selepas menambah perisian tengah tersebut, proses permintaan akan menjadi lebih rumit dan pembangun perlu menguji dan nyahpepijat dengan berhati-hati untuk memastikan program itu boleh berfungsi dengan betul.
  2. Kesimpulan

Dengan menggunakan rangka kerja Scrapy dan perisian tengah untuk pengecaman dan pemprosesan kod pengesahan, kami boleh memintas strategi pertahanan kod pengesahan dan mencapai rangkak tapak web sasaran dengan berkesan. Kaedah ini biasanya menjimatkan masa dan usaha daripada memasukkan kod pengesahan secara manual, dan lebih cekap dan tepat. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa anda membaca dan mematuhi perjanjian lesen dan keperluan alat dan API pihak ketiga sebelum menggunakannya.

Atas ialah kandungan terperinci Kuasa Scrapy: Bagaimana untuk mengenali dan memproses kod pengesahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn