Bis zum letzten Mal ist es ein Programm geworden, das den Zweck erreichen kann. Aber ... diese Anforderung erfordert, dass dies jeden Tag regelmäßig durchgeführt wird.
Normalerweise können Sie das Batch-System regelmäßig mit Cron usw. betreiben, aber diesmal ist es nicht so einfach.
Erstens reCAPTHCA Maßnahmen. Als ich es nachschlug, stellte ich fest, dass es einen russischen Dienst namens "2CAPTCHA" gab.
Es ist ein Dienst, der reCAPTCHA remote freigibt. Es ist außergewöhnlich billig, mit einem Durchbruch von 1000 Mal und mehreren hundert Yen. Ich fand es etwas verdächtig, entschied mich aber dafür.
Registrieren Sie ein Konto bei 2captcha und setzen Sie Geld in Balance. Sie werden nicht nur für die Registrierung und Verwendung Ihrer Kreditkarte belastet, sondern können den Service auch für den eingezahlten Geldbetrag nutzen.
Ich werde weglassen, wie man es benutzt, weil es andere Leute gibt, die es eingeführt haben.
https://tanuhack.com/pr-2captcha/
Da ich "PayU" jedoch nicht verwenden konnte, habe ich Paypal über "PayPro Global" verwendet und zuerst 300 Yen berechnet. Bei der gegenwärtigen Rate scheint dies ungefähr 3000 Mal zu gehen.
Als allererstes
--2 Abrufen des API-Schlüssels von Captcha
Sie müssen drei Dinge tun.
google_site_key soll ein Schuss sein, wenn Sie mit `data-sitekey auf der obigen Site suchen, aber in meinem Fall war es in Javascript auf der Quelle. Es fühlt sich an, als hätte ich es gefunden, indem ich nach "recaptcha" gesucht habe. (Im Gegenteil, um Durchbrüche bei der Nutzung dieses Dienstes zu verhindern, kann es hilfreich sein, es schwierig zu machen, hier zu finden ...)
Der Textbereich fand sofort eine # g-recaptcha-Antwort. Aufgrund des Mechanismus kann dies nicht geändert werden ...
Wie Sie auf der Einführungsseite oben sehen können, können Sie den Textbereich nicht eingeben, wenn er unsichtbar ist. Verwenden Sie daher Javascript, um ihn zu visualisieren.
Außerdem wurde auf meiner Zielwebsite das Kontrollkästchen reCAPTCHA selbst ausgeblendet. Das Verhalten war "Drücken Sie die Anmeldetaste, um reCAPTCHA zu erhalten (drücken Sie nach dem Abbrechen erneut die Anmeldetaste, um sich anzumelden)".
driver.execute_script('document.querySelector(hoge).style.height = "auto";')
driver.execute_script('document.querySelector(hoge).style.position = "inherit";')
driver.execute_script('document.getElementById("g-recaptcha-response").style.display="";')
Holen Sie sich zuerst die captcha_id wie folgt. Ich hatte noch nie einen FEHLER damit, aber es wird passieren, wenn es um Service-Wartung geht.
#Überprüfen Sie, ob 2captcha bereit ist
url = "http://2captcha.com/in.php?key=" + config.service_key + "&method=userrecaptcha&googlekey=" + config.google_site_key + "&pageurl=" + LOGIN_URL
resp = requests.get(url)
if resp.text[0:2] != 'OK':
exit('2captcha Service error. Error code:' + resp.text)
captcha_id = resp.text[3:]
Verwenden Sie dann diese captcha_id, um eine Freigabe anzufordern.
#Stornierung tatsächlich beantragen
fetch_url = "http://2captcha.com/res.php?key="+ config.service_key + "&action=get&id=" + captcha_id
print('Stornierung beantragen ...')
for __i in range(1, 10):
time.sleep(5) # wait 5 sec.
resp = requests.get(fetch_url)
if resp.text[0:2] == 'OK':
break
print('Google response token: ', resp.text[3:])
Ich habe die Details nicht untersucht, aber es scheint, dass "CHA_NOT_READY" in der Antwort zurückgegeben wird. Kommt es vor, wenn das Personal nicht zum Entsperren bereit ist? In diesem Fall handelt es sich um ein Problem. In meinem Fall habe ich es so implementiert, dass es mehrmals von vorne beginnt.
if resp.text[3:] == 'CHA_NOT_READY':
print('Verarbeitung gescheitert')
driver.quit()
if count == 0:
exit('Error: 2captcha is not ready')
else:
#Von vorn anfangen
return getLoginedDriver(config,count-1)
Wenn das Token sicher zurückgegeben wird, legen Sie es im Textbereich ab und melden Sie sich an.
#Geben Sie den Token in das Textfeld ein
driver.find_element_by_id('g-recaptcha-response').send_keys(resp.text[3:])
time.sleep(INTERVAL)
driver.execute_script('document.querySelector(hoge).style.visibility = "hidden";') #Für diese Seite brauchte ich dies, um den Login-Button zu drücken
submit_button = driver.find_element_by_css_selector(hoge)
submit_button.click()
Wie Sie sehen können, wenn ich es versuche, ist das erstaunlich ... Vielen Dank für den wunderbaren Service.
Da das System jedoch vom Überleben dieses Dienstes abhängt, dachte ich erneut, dass ich nach Möglichkeit kein Scraping durchführen möchte. Wir verhandeln mit dem Betrieb dieser Website, um die API vorzubereiten, aber ich hoffe, dass es gut geht.
Da reCAPTCHA möglicherweise nicht herauskommt, wird es abgeschlossen, wenn wir diesen Fall behandeln können. Jetzt funktioniert es nur noch durch Ausführen (ohne reCAPTCHA abzubrechen).
Jetzt muss ich das nur noch auf dem Server ausführen, nicht auf dem lokalen PC ... Es ist ein weiterer Berg, weil er im kopflosen Modus nicht funktioniert.
Mehr dazu.
Recommended Posts