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.
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.
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.)
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.
key.yaml
---
:2Capthca:2 Captcha-API-Schlüssel
Für Mac
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222 &
Gemfile
source "https://rubygems.org"
gem 'nokogiri'
gem 'chrome_remote'
bundle install
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
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.