[PYTHON] Jeden Tag automatisch die reCAPTCHA-Site abkratzen (2/7: Scraping)

  1. Anforderungsdefinition ~ Aufbau der Python-Umgebung
  2. ** Erstellen Sie einen Site-Scraping-Mechanismus **
  3. Verarbeiten Sie die heruntergeladene Datei (xls), um das Endprodukt (csv) zu erstellen.
  4. Erstellen Sie einen Dateidownload von S3 / Datei-Upload nach S3 1.2 Implementiertes Captcha
  5. Lassen Sie es in einem Docker-Container starten
  6. Registrieren Sie sich für den AWS-Stapel

Schaffung eines Kratzmechanismus

Diese Seite verwendet React und Selen, da es mit Javascript funktioniert.

Überprüfen Sie die Dateistruktur


├── app
│ ├ Treiber Selen Treiber platzieren
│   └── source           
│       └── scraping.py Verarbeitung
└── tmp
    ├── files
│ └ download Laden Sie die durch Scraping heruntergeladene Datei ab
└── protokolliert Protokolle(Selen Log etc.)

Treiber herunterladen

Sie müssen entscheiden, welchen Browser Sie zum Ausführen von Selen verwenden möchten. Es gibt wahrscheinlich die folgenden drei Kandidaten.

――Hat es zum vorherrschenden kopflosen Browser geworden? PhantomJS

Zuerst habe ich Chrome verwendet, aber mit dem späteren "Xvfb" hat es nicht gut funktioniert, also habe ich mich für Firefox entschieden. Laden Sie den Treiber von der obigen URL herunter und platzieren Sie ihn unter "/ drivers /". [^ 1]

Um den Gecko-Treiber von Firefox ausführen zu können, muss Firefox auf dem Betriebssystem installiert sein. Wenn Sie es noch nicht getan haben, laden Sie es bitte von der [offiziellen Website] herunter (https://www.mozilla.org/ja/firefox/new/).

[^ 1]: Ich glaube, ich habe die neueste Version (Mac-Version) heruntergeladen ... Außerdem scheint es, dass Sie, wenn Sie den Treiber unter macOS an der angegebenen Position platzieren, die Datei beim Start nicht angeben müssen, aber diesmal verwende ich diese Methode nicht.

Bereiten Sie den Download-Zielordner vor

Endlich Codierung.

  1. Legen Sie die heruntergeladene Datei in einem bestimmten Ordner ab
  2. Verarbeiten Sie 1, um zu liefernde Daten (CSV) zu erstellen. In einen anderen Ordner legen
  3. Senden Sie 2 an S3

Bereiten Sie einen Download-Zielordner vor, damit wir fortfahren können.

scraping.py


date = datetime.now().strftime('%Y%m%d')
dldir_name = os.path.abspath(__file__ + '/../../../tmp/files/download/{}/'.format(date))
dldir_path = Path(dldir_name)
dldir_path.mkdir(exist_ok=True)
download_dir = str(dldir_path.resolve())

Die Importanweisung usw. wird am Ende zusammen eingeführt. ... Ich denke, der Code ist redundant, aber er hat funktioniert, also bin ich damit zufrieden.

Schreiben Sie bis zum Beginn von Selen

Als nächstes werde ich bis zum Starten des Geckotreibers mit Selen beschreiben. Im Fall von Firefox wird das Download-Dialogfeld angezeigt, wenn Sie es normal starten. Sie müssen daher verschiedene Optionen angeben, damit es nicht angezeigt wird.

scraping.py


driver_path = os.path.abspath(__file__ + '/../../drivers/geckodriver') #Geben Sie die Position des Fahrers an.
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2) #Es scheint, dass es eine Option zum "Festlegen des Download-Ordners" war.
fp.set_preference("browser.download.dir", download_dir)
fp.set_preference("browser.download.manager.showWhenStarting",False) #Was ist es? weiß nicht
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
log_path = os.path.abspath(__file__ + '/../../../tmp/logs/geckodriver.log') #Wenn Sie nichts tun, wird am Speicherort der ausführbaren Datei eine Protokolldatei generiert.
driver = webdriver.Firefox(firefox_profile=fp,executable_path=driver_path,service_log_path=log_path)

driver.maximize_window() #Das Seitenmenü verschwindet je nach Fenstergröße ...
driver.implicitly_wait(10)  #Fehler, wenn 10 Sekunden lang kein Element angegeben wurde

Seien Sie vorsichtig mit der Option helperApps.neverAsk.saveToDisk. Nur das hier angegebene Dateiformat zeigt nicht das Dialogfeld "Möchten Sie herunterladen?" An. Die XLS-Datei, die ich dieses Mal heruntergeladen habe, schien ** application / vnd.openxmlformats-officedocument.spreadsheetml.sheet ** zu sein. [^ 2]

[^ 2]: Das offizielle XLS-Dateiformat ist unterschiedlich, Sie müssen jedoch das Format der tatsächlich heruntergeladenen Datei angeben.

Mit Chrom war es übrigens so einfach

scraping.py


driver_path = os.path.abspath(__file__ + '/../../drivers/chromedriver')
options = webdriver.ChromeOptions()
options.add_experimental_option("prefs", {"download.default_directory": download_dir})
driver = webdriver.Chrome(executable_path=driver_path, options=options)

Anmeldevorgang

Im Fall dieser Site konnte ich mich wie folgt anmelden.

scraping.py


#Einloggen
driver.get(LOGIN_URL)
mail_address = driver.find_element_by_id("mail_address")
mail_address.send_keys(config.mail_address)
password = driver.find_element_by_id("password")
password.send_keys(config.password)
submit_button = driver.find_element_by_css_selector("button.submit")
submit_button.click()

… Wenn Sie jedoch darauf klicken, wird reCAPTCHA angezeigt, sodass Sie es manuell abbrechen müssen. Ich werde es später mit 2captcha lösen, aber ich habe es noch nicht getan, also werde ich es selbst veröffentlichen, wenn es herauskommt.

Fügen Sie einen Warteprozess ein, damit der Prozess wartet, bis er freigegeben wird. Im folgenden Beispiel können Sie bis zu 100 Sekunden warten.

scraping.py


try:
  WebDriverWait(driver, 100).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "* Elemente, die nach dem Login angezeigt werden"))
  )
except TimeoutException:
    driver.quit()
    exit('Error:Ich konnte mich nicht anmelden')

Daten bekommen

Jetzt ist es endlich Zeit, die Daten zu erhalten. Ich habe es so gemacht.

scraping.py


#Suche mit Suchwörtern
search_box = driver.find_element_by_xpath(SEARCH_BOX_XPATH)
search_box.clear()
search_box.click()
search_box.send_keys(word) #Geben Sie in das Suchfenster ein
time.sleep(INTERVAL) #Warten auf die React-Verarbeitung
search_box.send_keys(Keys.RETURN) #Eingabetaste → Das erste Suchergebnis wird ausgewählt

#Menü öffnen
try:
    driver.find_element_by_xpath(MENU_XPATH).click()
except ElementNotInteractableException:
    #Wenn das Menü nicht ausgewählt werden kann → Das Akkordeon ist nicht geöffnet
    driver.find_element_by_xpath(MENU_OPEN_XPATH).click()            
    driver.find_element_by_xpath(MENU_XPATH).click()

#herunterladen
driver.find_element_by_xpath(DOWNLOAD_XPATH).click()

Komplett

Wenn Sie die bisher eingeführten verbinden, ist der Download-Teil abgeschlossen! Abschließend möchte ich die Importanweisung einführen.

scraping.py


import os
import time
from pathlib import Path
from datetime import datetime

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import ElementNotInteractableException
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

Mehr dazu.

Recommended Posts

Jeden Tag automatisch die reCAPTCHA-Site abkratzen (2/7: Scraping)
Die reCAPTCHA-Site wird täglich automatisch abgekratzt (6/7: Containerisierung)
Täglich automatisch die reCAPTCHA-Site abkratzen (5/7: 2captcha)
Automatische tägliche Überprüfung der reCAPTCHA-Site (4/7: S3-Dateiverarbeitung)
Kratzen Sie die reCAPTCHA-Site jeden Tag automatisch ab (1/7: Aufbau der Python-Umgebung)
Automatische tägliche Überprüfung der reCAPTCHA-Site (3/7: xls-Dateiverarbeitung)
Die endgültige Ausgabe von Python Scraping! (Zielort: Große Kamera)
Ich habe versucht, die Werbung für die Raubkopien-Website zu kratzen
Grundlagen der Python-Scraping-Grundlagen