Scrapy ist ein leistungsstarkes Python-Framework, das uns dabei hilft, Daten auf Websites einfach zu crawlen. Allerdings treten Probleme auf, wenn die Website, die wir crawlen möchten, über einen Bestätigungscode verfügt. Der Zweck von CAPTCHAs besteht darin, automatisierte Crawler daran zu hindern, eine Website anzugreifen. Daher sind sie in der Regel sehr komplex und schwer zu knacken. In diesem Beitrag erfahren Sie, wie Sie mit dem Scrapy-Framework CAPTCHAs identifizieren und verarbeiten, damit unsere Crawler diese Abwehrmaßnahmen umgehen können.
Was ist ein Verifizierungscode?
Ein CAPTCHA ist ein Test, mit dem nachgewiesen werden soll, dass der Benutzer ein echter Mensch und keine Maschine ist. Normalerweise handelt es sich um eine verschleierte Textzeichenfolge oder ein unleserliches Bild, das den Benutzer dazu zwingt, manuell einzugeben oder auszuwählen, was angezeigt wird. CAPTCHAs dienen dazu, automatisierte Bots und Skripte abzufangen, um Websites vor böswilligen Angriffen und Missbrauch zu schützen.
Normalerweise gibt es drei Arten von CAPTCHAs:
Warum müssen Sie Bestätigungscodes verarbeiten?
Crawler sind oft in großem Umfang automatisiert, sodass sie leicht als Roboter identifiziert und von der Datenbeschaffung auf Websites ausgeschlossen werden können. Um dies zu verhindern, wurden CAPTCHAs eingeführt. Sobald ep in die Phase des Verifizierungscodes eintritt, wartet der Scrapy-Crawler nicht mehr auf Benutzereingaben und kann daher nicht mit dem Crawlen von Daten fortfahren, was zu einer Verringerung der Effizienz und Integrität des Crawlers führt.
Wir brauchen also eine Möglichkeit, mit dem Captcha umzugehen, damit unser Crawler es automatisch weitergeben und seine Aufgabe fortsetzen kann. Normalerweise verwenden wir Tools oder APIs von Drittanbietern, um die Erkennung von Verifizierungscodes abzuschließen. Diese Tools und APIs verwenden maschinelles Lernen und Bildverarbeitungsalgorithmen, um Bilder und Zeichen zu erkennen und die Ergebnisse an unser Programm zurückzugeben.
Wie gehe ich mit Verifizierungscodes in Scrapy um?
Öffnen Sie die Datei „settings.py“ von Scrapy. Wir müssen das Feld DOWNLOADER_MIDDLEWARES ändern und den folgenden Proxy hinzufügen:
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.download ermiddleware. httpcom Druck .HttpCompressionMiddleware': 800,
'scrapy.contrib.downloadermiddleware.chunked.ChunkedTransferMiddleware': 830,'scrapy.contrib.downloadermiddleware.stats.DownloaderStats': 850,
'tutorial.middlewares.CaptchaMiddleware': 999}
In In In diesem Beispiel verwenden wir CaptchaMiddleware, um den Bestätigungscode zu verarbeiten. CaptchMiddleware ist eine benutzerdefinierte Middleware-Klasse, die die Download-Anfrage verarbeitet und die API aufruft, um bei Bedarf den Bestätigungscode zu identifizieren, dann den Bestätigungscode in die Anfrage einzufügen und zurückzukehren, um mit der Ausführung fortzufahren.
Codebeispiel:
Klasse CaptchaMiddleware (Objekt):
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
In dieser Middleware haben wir das CaptchaClient-Objekt als Captcha-Lösungs-Middleware verwendet. Wir können mehrere Captcha-Lösungs-Middleware verwenden.
Hinweise
Bitte achten Sie bei der Implementierung dieser Middleware auf folgende Punkte:
Fazit
Durch die Verwendung des Scrapy-Frameworks und der Middleware zur Erkennung und Verarbeitung von Bestätigungscodes können wir die Verteidigungsstrategie für Bestätigungscodes effektiv umgehen und ein effektives Crawlen der Zielwebsite erreichen. Diese Methode spart in der Regel Zeit und Aufwand als die manuelle Eingabe von Bestätigungscodes und ist effizienter und genauer. Es ist jedoch wichtig zu beachten, dass Sie die Lizenzvereinbarungen und Anforderungen von Drittanbieter-Tools und APIs lesen und einhalten, bevor Sie diese verwenden.
Das obige ist der detaillierte Inhalt vonDie Kraft von Scrapy: Wie erkennt und verarbeitet man Verifizierungscodes?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!