Ce site utilise React et utilise du sélénium car il fonctionne avec javascript.
Revoir la structure des fichiers
├── app
│ ├── pilotes sélénium Place pilotes
│ └── source
│ └── scraping.traitement py
└── tmp
├── files
│ └── télécharger Placez le fichier téléchargé en grattant
└── enregistre les journaux(journal de sélénium, etc.)
Vous devez décider quel navigateur utiliser pour exécuter le sélénium. Il y aura probablement les trois candidats suivants.
――Est-il devenu le navigateur sans tête prédominant? PhantomJS
Au début, j'utilisais Chrome, mais cela ne fonctionnait pas bien avec le dernier Xvfb
, alors j'ai décidé d'utiliser Firefox. Téléchargez le pilote à partir de l'URL ci-dessus et placez-le sous / drivers /
. [^ 1]
De plus, pour exécuter le pilote gecko de Firefox, Firefox doit être installé sur le système d'exploitation. Si vous ne l'avez pas déjà fait, veuillez le télécharger depuis le Site officiel.
[^ 1]: Je pense avoir téléchargé la dernière version (version mac) ... De plus, il semble que si vous placez le pilote dans la position spécifiée sous macOS, vous n'avez pas à spécifier le fichier au démarrage, mais cette fois je n'utilise pas cette méthode.
Enfin le codage.
Préparez un dossier de destination de téléchargement afin que nous puissions continuer.
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())
La déclaration d'importation, etc. sera introduite ensemble à la fin. ... Je pense que le code est redondant, mais cela a fonctionné, donc je suis content de cela.
Ensuite, je décrirai jusqu'au point de départ du pilote gecko avec du sélénium. Dans le cas de Firefox, la boîte de dialogue de téléchargement apparaîtra lorsque vous le démarrez normalement, vous devez donc spécifier diverses options pour qu'elle n'apparaisse pas.
scraping.py
driver_path = os.path.abspath(__file__ + '/../../drivers/geckodriver') #Spécifiez la position du conducteur.
fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList",2) #Il semble que c'était une option pour "spécifier le dossier de téléchargement".
fp.set_preference("browser.download.dir", download_dir)
fp.set_preference("browser.download.manager.showWhenStarting",False) #Qu'Est-ce que c'est? ne sait pas
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
log_path = os.path.abspath(__file__ + '/../../../tmp/logs/geckodriver.log') #Si vous ne faites rien, un fichier journal sera généré à l'emplacement du fichier exécutable.
driver = webdriver.Firefox(firefox_profile=fp,executable_path=driver_path,service_log_path=log_path)
driver.maximize_window() #Le menu latéral disparaît en fonction de la taille de la fenêtre ...
driver.implicitly_wait(10) #Erreur s'il n'y a pas d'élément spécifié pendant 10 secondes
Soyez prudent avec l'option helperApps.neverAsk.saveToDisk
.
Seul le format de fichier spécifié ici n'affichera pas la boîte de dialogue "Voulez-vous télécharger?". Le fichier xls que j'ai téléchargé cette fois semblait être ** application / vnd.openxmlformats-officedocument.spreadsheetml.sheet **. [^ 2]
[^ 2]: Le format officiel du fichier xls est différent, mais vous devez spécifier le format du fichier qui est effectivement téléchargé.
Au fait, c'était si facile avec Chrome
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)
Dans le cas de ce site, j'ai pu me connecter en procédant comme suit.
scraping.py
#S'identifier
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()
… Cependant, lorsque vous cliquez dessus, reCAPTCHA apparaîtra, vous devez donc l'annuler manuellement. Je le résoudrai plus tard en utilisant 2captcha, mais je ne l'ai pas encore fait, donc je le publierai moi-même quand il sortira.
Insérez un processus d'attente pour que le processus attende d'être libéré. Dans l'exemple ci-dessous, vous pouvez attendre jusqu'à 100 secondes.
scraping.py
try:
WebDriverWait(driver, 100).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "* Éléments affichés après la connexion"))
)
except TimeoutException:
driver.quit()
exit('Error:Je n'ai pas réussi à me connecter')
Maintenant, il est enfin temps d'obtenir les données. Je l'ai fait comme ça.
scraping.py
#Rechercher à l'aide de mots de recherche
search_box = driver.find_element_by_xpath(SEARCH_BOX_XPATH)
search_box.clear()
search_box.click()
search_box.send_keys(word) #Entrez dans la fenêtre de recherche
time.sleep(INTERVAL) #Attendre le traitement React
search_box.send_keys(Keys.RETURN) #Touche retour → Le premier résultat de la recherche est sélectionné
#Ouvrir le menu
try:
driver.find_element_by_xpath(MENU_XPATH).click()
except ElementNotInteractableException:
#Lorsque le menu ne peut pas être sélectionné → L'accordéon n'est pas ouvert
driver.find_element_by_xpath(MENU_OPEN_XPATH).click()
driver.find_element_by_xpath(MENU_XPATH).click()
#Télécharger
driver.find_element_by_xpath(DOWNLOAD_XPATH).click()
time.sleep ()
.
--Lorsqu'il n'y a aucun élément, ʻElementNotInteractableException` est levé. Il ne semble pas y avoir de méthode pour vérifier "si cet élément existe ou non?", Alors faisons-en bon usage.
――Si c'est un site normal, vous pouvez l'obtenir en cliquant sur l'URL sans avoir à cliquer dessus ... Mais cette fois, j'ai dû cliquerSi vous connectez ceux introduits jusqu'à présent, la partie téléchargement est terminée! Enfin, je voudrais présenter la déclaration d'importation.
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
Plus à ce sujet.
Recommended Posts