Rumah >pembangunan bahagian belakang >Tutorial Python >Kuasa Scrapy: Bagaimana untuk mengenali dan memproses kod pengesahan?
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:
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.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!