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.)
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.
Endlich Codierung.
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.
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)
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')
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()
time.sleep ()
.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