Heim  >  Artikel  >  Backend-Entwicklung  >  Die Kraft von Scrapy: Wie erkennt und verarbeitet man Verifizierungscodes?

Die Kraft von Scrapy: Wie erkennt und verarbeitet man Verifizierungscodes?

王林
王林Original
2023-06-22 15:09:121786Durchsuche

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:

  1. Text-CAPTCHA: Benutzer müssen eine Textzeichenfolge kopieren und einfügen, um zu beweisen, dass sie ein menschlicher Benutzer und kein Bot sind.
  2. Nummernverifizierungscode: Der Benutzer muss die angezeigte Nummer in das Eingabefeld eingeben.
  3. Bildverifizierungscode: Der Benutzer wird aufgefordert, Zeichen oder Zahlen aus einem angezeigten Bild in das Eingabefeld einzugeben. Dies ist normalerweise der am schwersten zu knackende Typ, da die Zeichen oder Zahlen im Bild verzerrt oder falsch platziert sein können oder andere visuelle Elemente aufweisen Lärm. .

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:

  1. Die Identifizierung und Verarbeitung von Verifizierungscodes erfordert die Verwendung von Tools oder APIs von Drittanbietern, und wir müssen sicherstellen, dass wir über eine legale Lizenz verfügen und befolgen Sie die Anforderungen des Herstellers. Verwenden Sie sie.
  2. Nach dem Hinzufügen einer solchen Middleware wird der Anforderungsprozess komplexer und Entwickler müssen sorgfältig testen und debuggen, um sicherzustellen, dass das Programm ordnungsgemäß funktioniert.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn