[PYTHON] Grattez automatiquement le site reCAPTCHA tous les jours (2/7: Scraping)

  1. Définition de l'exigence ~ construction de l'environnement python
  2. ** Créer un mécanisme de scraping de site **
  3. Traitez le fichier téléchargé (xls) pour créer le produit final (csv)
  4. Créer un téléchargement de fichier depuis S3 / télécharger un fichier vers S3 1.2 Captcha implémenté
  5. Autorisez-le à démarrer dans un conteneur Docker
  6. Inscrivez-vous au lot AWS

Création d'un mécanisme de grattage

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.)

téléchargement du pilote

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.

Préparez le dossier de destination du téléchargement

Enfin le codage.

  1. Placez le fichier téléchargé dans un dossier spécifique
  2. Processus 1 pour créer des données livrables (csv). Mettre dans un autre dossier
  3. Envoyer 2 vers S3

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.

Ecrivez jusqu'au début du sélénium

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)

Processus de connexion

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')

Obtenez des données

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()

Achevée

Si 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

Grattez automatiquement le site reCAPTCHA tous les jours (2/7: Scraping)
Grattez automatiquement le site reCAPTCHA quotidiennement (6/7: conteneurisation)
Grattez automatiquement le site reCAPTCHA quotidiennement (5/7: 2captcha)
Grattez automatiquement le site reCAPTCHA quotidiennement (4/7: traitement des fichiers S3)
Grattez automatiquement le site reCAPTCHA tous les jours (1/7: construction de l'environnement python)
Grattez automatiquement le site reCAPTCHA quotidiennement (3/7: traitement des fichiers xls)
L'édition définitive du grattage python! (Site cible: grande caméra)
J'ai essayé de gratter la publicité du site de dessin animé piraté
Principes de base du grattage Python