Automatisches Scraping mit dem Dienst "2Captcha", der "CAPTCHA" und Ruby + Chrome_Remote durchbricht

Einführung

Als ich kratzte, hatte ich die Erfahrung, dass CAPTCHA herauskam und das Programm gestoppt wurde. (Nur diese Personen werden diesen Artikel sehen.) Um CAPTHCA irgendwie zu vermeiden, gibt es Möglichkeiten, es wie eine BOT- oder IP-Verteilung zu bewegen, aber dieses Mal werde ich versuchen, CAPTCHA gehorsam zu lösen. Da ich Ingenieur bin, möchte ich es natürlich automatisch im Programm lösen, anstatt es selbst zu lösen. Maschinelles Lernen hat hohe Lernkosten und Einführungskosten, und ich möchte es noch mehr genießen. Ein Dienst namens 2Cpathca macht dies möglich. Es gibt viele andere Dienste, finden Sie also den, der am besten zu Ihnen passt. Es gab einen Python-Artikel, aber ich konnte keinen Ruby-Artikel finden, also habe ich ihn geschrieben.

Was ist 2Capthca?

image.png Es ist ein Dienst, um die CAPTHCA-Funktion zu durchbrechen, und die Authentifizierung kann mithilfe der API automatisiert werden. Es ist ein kostenpflichtiger Dienst, aber reCAPTCHA v2 kostet für 1.000 Anfragen nur 2,99 US-Dollar. Zur Erinnerung, es gibt keinen Geldwechsel zwischen mir und 2Captcha für Werbezwecke.

Was ist Chrome_Remote?

Eine Bibliothek, mit der Sie Chrome-Instanzen von Ruby aus betreiben können. Einzelheiten zur Verwendung finden Sie unter Erklärungsseite und Repository. Als Voraussetzung für das Schaben ist es notwendig, CAPTHCA das Erscheinen überhaupt erst zu erschweren. Im Gegensatz zu Selen usw. ist Chrome_Remote, auf dem Chrome ausgeführt wird, schwieriger, BOT zu beurteilen. (Ich möchte den Unterschied bald überprüfen.)

Was du machen willst

image.png Durchbrechen Sie die reCAPTCHA-Demoseite. 2 Informationen zum Erstellen eines Capthca-Kontos und zum Abrufen eines API-Schlüssels finden Sie in Artikel des Vorgängers.

Durchbrechen Sie reCAPTHCA mit "2Captcha" und Ruby + Chrome_Remote

2 Holen Sie sich den Captcha-API-Schlüssel und speichern Sie ihn als Datei.

key.yaml


---
:2Capthca:2 Captcha-API-Schlüssel

Starten Sie Chrome mit Debugging-Port.

Für Mac


/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 &

Installieren Sie den erforderlichen Edelstein.

Gemfile


source "https://rubygems.org"
gem 'nokogiri'
gem 'chrome_remote'
bundle install

Das Ruby-Programm selbst.

crawler.rb



require 'nokogiri'
require 'chrome_remote'
require 'yaml'

class CaptchaDetectedException < StandardError; end

class ChromeController
  def initialize
    @chrome = ChromeRemote.client

    # Enable events
    @chrome.send_cmd "Network.enable"
    @chrome.send_cmd "Page.enable"
  end
  
  def open(url)
    #Seitenzugriff
    move_to url
    captcha_detect
  end
  
  def reload_page
    sleep 1
    @chrome.send_cmd "Page.reload", ignoreCache: false
    wait_event_fired
  end
  
  def execute_js(js)
      @chrome.send_cmd "Runtime.evaluate", expression: js
  end
  
  def wait_event_fired
      @chrome.wait_for "Page.loadEventFired"
  end
  
  #Seitennavigation
  def move_to(url)
    sleep 1
    @chrome.send_cmd "Page.navigate", url: url
    wait_event_fired
  end
  
  #Holen Sie sich HTML
  def get_html
    response = execute_js 'document.getElementsByTagName("html")[0].innerHTML'
    html = '<html>' + response['result']['value'] + '</html>'
  end
  
  def captcha_detect
    bot_detect_cnt = 0
    begin
      html = get_html
      raise CaptchaDetectedException, 'Captcha bestätigt' if html.include?("captcha")
    rescue CaptchaDetectedException => e
      p e
      bot_detect_cnt += 1
      p "Versuch, Captcha zu durchbrechen: #{bot_detect_cnt}Zeit"
      doc = Nokogiri::HTML.parse(html, nil, 'UTF-8')
      return if captcha_solve(doc) == 'Erfolgreiche Veröffentlichung'
      reload_page
      retry if bot_detect_cnt < 3
      p 'Captcha Durchbruch Fehler. Beende Ruby'
      exit
    end
    p 'Es gab kein Captcha'
  end

  def captcha_solve(doc)
    id = request_id(doc).match(/(\d.*)/)[1]
    solution = request_solution(id)
    return false unless solution
    submit_solution(solution)
    p captcha_result
  end

  def request_id(doc)
    #API-Schlüssel lesen
    @key = YAML.load_file("key.yaml")[:"2Capthca"]
    # data-Ruft den Wert des Sitekey-Attributs ab
    googlekey = doc.at_css('#recaptcha-demo')["data-sitekey"]
    method = "userrecaptcha"
    pageurl = execute_js("location.href")['result']['value']
    request_url="https://2captcha.com/in.php?key=#{@key}&method=#{method}&googlekey=#{googlekey}&pageurl=#{pageurl}"
    #Anfrage zur Freigabe von Captcha
    fetch_url(request_url)
  end

  def request_solution(id)
    action = "get"
    response_url = "https://2captcha.com/res.php?key=#{@key}&action=#{action}&id=#{id}"
    sleep 15
    retry_cnt = 0
    begin
      sleep 5
      #Holen Sie sich den Captcha-Freischaltcode
      response_str = fetch_url(response_url)
      raise 'Vor dem Loslassen von Captcha' if response_str.include?('CAPCHA_NOT_READY')
    rescue => e
      p e
      retry_cnt += 1
      p "wiederholen:#{retry_cnt}Zeit"
      retry if retry_cnt < 10
      return false
    end
    response_str.slice(/OK\|(.*)/,1)
  end

  def submit_solution(solution)
    #Geben Sie den Freischaltcode in das angegebene Textfeld ein
    execute_js("document.getElementById('g-recaptcha-response').innerHTML=\"#{solution}\";")
    sleep 1
    #Klicken Sie auf die Schaltfläche Senden
    execute_js("document.getElementById('recaptcha-demo-submit').click();")
  end

  def captcha_result
    sleep 1
    html = get_html
    doc = Nokogiri::HTML.parse(html, nil, 'UTF-8')
    doc.at_css('.recaptcha-success') ? 'Erfolgreiche Veröffentlichung' : 'Stornierungsfehler'
  end


  def fetch_url(url)
    sleep 1
    `curl "#{url}"`
  end

end

crawler = ChromeController.new
url = 'https://www.google.com/recaptcha/api2/demo'
crawler.open(url)

Wenn Sie das Programm ausführen, greift es auf die Demoseite von reCAPTCHA zu und versucht, CAPTCHA zu durchbrechen.

bundle exec ruby crawler.rb

Schließlich

Abhängig vom Zweck und der Art des Scrapings und dem Umgang mit den durch das Scraping erhaltenen Daten besteht die Gefahr eines Verstoßes gegen das Urheberrecht und das Gesetz zum Schutz personenbezogener Daten. Ich wünsche Ihnen allen ein glückliches Leben.

Recommended Posts

Automatisches Scraping mit dem Dienst "2Captcha", der "CAPTCHA" und Ruby + Chrome_Remote durchbricht
[Ruby] 5 häufige Fehler, die beim Schaben mit Selen auftreten und wie man damit umgeht