Grattage avec Python, Selenium et Chromedriver

Chose que tu veux faire

Je souhaite collecter les informations bibliographiques + les résumés de tous les articles publiés dans le Journal of Science Direct.

Apprenez d'abord les bases du grattage

(Référence: https://codezine.jp/article/detail/12230) Il semble que cela soit essentiellement fait en utilisant le package requests et le package Beautiful Soup 4. Alors, installez d'abord ces gars

pip install requests, beautifulsoup4

Alors j'ai essayé quelque chose comme ça.

import request
from bs4 import BeautifulSoup

#Envoyez une demande à l'URL à récupérer et obtenez le HTML
res = requests.get('https://www.ymori.com/books/python2nen/test1.html')

#Créer un objet BeautifulSoup à partir du code HTML de la réponse
soup = BeautifulSoup(res.text, 'html.parser')
print(soup)

Pour le moment, j'ai pu obtenir le html sous forme de texte, mais comment le faire, par exemple, en activant la case à cocher ou en cliquant sur le bouton? ??

Pilote Selenium et Chrome

Après enquête, il semble que Beautiful Soup ne puisse pas créer de pages qui modifient dynamiquement le contenu d'affichage en utilisant pleinement Javascript. Après avoir étudié quoi faire, je suis arrivé à un paquet appelé Selenium. (Référence: https://qiita.com/Fujimon_fn/items/16adbd86fad609d993e8) Apparemment, vous pouvez faire quelque chose comme RPA. En d'autres termes, utilisez le navigateur Web de manière à ce qu'il puisse être vu par les humains. Cependant, si c'est tout ce dont vous avez besoin, vous avez besoin d'un pilote qui correspond au navigateur que vous utilisez. (Référence: https://kurozumi.github.io/selenium-python/installation.html#drivers)

Installation

Installez Selenium et Chromedriver. Avant l'installation, consultez la page ChromeDriver pour la version du pilote correspondant à votre version de Chrome (cochez). Ensuite, c'était 84.0.4147.30). (Référence: https://qiita.com/hanzawak/items/2ab4d2a333d6be6ac760)

pip install selenium, chromedriver-binary==84.0.4147.30

Une fois installé, vous n'avez pas besoin de définir le chemin (mais vous devez inclure ʻimport chrome driver`) Cependant, le fichier Exe téléchargé directement depuis ChromeDriver, par exemple, dans c: \ work, entrez explicitement le chemin. Vous pouvez également le donner. Dans ce cas, vous n'avez pas besoin d'importer le package.

Commençons pour le moment

Ce qui suit est un exemple de passage explicite du chemin au lieu de ʻimport chromedriver`.

OpenBrowser.py


import requests
from selenium import webdriver  #  import chromedriver_binary

load_url = "https://www.sciencedirect.com/journal/reliability-engineering-and-system-safety/vol/204/suppl/C"
driver = webdriver.Chrome(executable_path='c:/work/chromedriver.exe')  #  driver = webdriver.Chrome()
driver.get(load_url)

Ensuite, le navigateur a démarré sans autorisation et est passé à la page à l'adresse spécifiée. C'est complètement RPA.

Manipulation de page

Ce que je veux faire, c'est aller sur la page de Jounral

  1. Tout d'abord, cliquez sur «Sélectionner tout» en haut à gauche et activez toutes les cases à cocher Papier affichées.
  2. Cliquez sur Exporter les citations pour afficher une boîte de dialogue de téléchargement des informations du document.
  3. Cliquez sur "Exporter la citation et le résumé en texte" dans la boîte de dialogue pour télécharger les informations de la littérature. → Ensuite, il sera téléchargé sous forme de fichier texte.
  4. Lorsque vous avez terminé la DLing du fichier texte, cliquez sur "Vol / numéro précédent" en haut de la page pour aller à la page du volume précédent. image.png image.png

Traitement appelé. Si vous bouclez ceci, vous pouvez obtenir des informations de toute la littérature. Alors, découvrez comment cliquer sur "Sélectionner tout", "Exporter les citations" et "Exporter la citation et le résumé en texte".

Fondamentalement, vous pouvez trouver la cible que vous souhaitez utiliser à partir de la page chargée par le pilote, comme l'ID, le nom de la classe, l'attribut Name et envoyer .click (). Alors, cherchez d'abord "Select_All". Accédez à la page avec chrome et appuyez sur la touche F12 pour afficher l'écran du développeur. Ensuite, appuyez sur Ctrl + F pour ouvrir la zone de recherche et entrez "Sélectionner tout" pour rechercher. Ensuite, vous trouverez l'endroit où Select All est écrit. En fait, il a été fait avec une étiquette de bouton. Eh bien, c'est vrai. Cependant, cela ne ressemblait pas à un bouton à première vue, donc j'ai été un peu surpris. Pour le moment, faites un clic droit sur cette balise de bouton et sélectionnez Copier ⇒ Copier le sélecteur pour obtenir le sélecteur CSS. image.png

Donc, revenons au code source, Collez le sélecteur css précédent. Cependant, tout ce dont vous avez besoin est le "bouton". Et ci-dessous. Voilà pourquoi

button = driver.find_element_by_css_selector("button.button-link.button-link-secondary.js-select-all")
button.click()

Attendre le processus jusqu'à ce que l'élément devienne accessible

Cependant, même si j'ajoute soudainement ce qui précède à OpenBrowser.py et que je l'exécute, cela échoue. En effet, lorsque vous transmettez l'URL à Chrome, elle n'est pas immédiatement accessible, mais avant de récupérer le HTML à partir de l'URL, de l'analyser et l'élément peut y accéder. Parce qu'il y a un décalage dans le temps. Je dois donc attendre un moment. Cette page récupère time.sleep () du package time et l'utilise. Cependant, cette méthode n'est pas intelligente comme décrit dans ce manuel. C'est pourquoi j'utilise la fonction Attendre fournie avec WebDriver. C'est pourquoi les sources suivantes. (Référence: https://qiita.com/uguisuheiankyo/items/cec03891a86dfda12c9a) (Référence: https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html) Dans Manual, il n'y avait qu'un moyen de spécifier l'élément par ID, mais dans le cas du sélecteur css Utilise CSS_SELECTOR. (Référence: https://selenium-python.readthedocs.io/locating-elements.html)

J'ai en fait essayé de l'utiliser, mais cela n'a pas fonctionné avec Wait. Il semble que le timing sera par tous les moyens décalé et une erreur se produira. J'ai donc décidé d'inclure time.sleep () après tout.

WaitAndOperation.py


import requests
from selenium import webdriver  #  import chromedriver_binary
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

load_url = "https://www.sciencedirect.com/journal/reliability-engineering-and-system-safety/vol/204/suppl/C"
driver = webdriver.Chrome(executable_path='c:/work/chromedriver.exe')  #  driver = webdriver.Chrome()
driver.get(load_url)
    #WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located)
time.sleep(5)
    #WebDriverWait(driver, 20).until(
    #    EC.element_to_be_clickable((By.CSS_SELECTOR, "button.button-link.button-link-secondary.js-select-all"))
    #)
button = driver.find_element_by_css_selector("button.button-link.button-link-secondary.js-select-all")
button.click()

La même chose s'applique aux autres éléments ...

Ainsi, pour les autres "Exporter les citations" et "Exporter la citation et le résumé vers le texte", obtenez le sélecteur CSS et ajoutez le processus pour cliquer.

D'un autre côté, "Previous Vol / Issue" était un lien plutôt qu'un bouton. Vous pouvez spécifier le lien avec le sélecteur css de la même manière, mais vous pouvez également accéder à l'élément avec le texte du lien. J'ai donc essayé d'y accéder par SMS.

final.py


import time
import requests
#from bs4 import BeautifulSoup
# import chromedriver_binary

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

load_url = "https://www.sciencedirect.com/journal/reliability-engineering-and-system-safety/vol/204/suppl/C"
Last_url = "https://www.sciencedirect.com/journal/reliability-engineering-and-system-safety/vol/20/issue/1"

driver = webdriver.Chrome(executable_path='c:/work/chromedriver.exe')
driver.get(load_url)

while 1:
    time.sleep(5)

    button = driver.find_element_by_css_selector("button.button-link.button-link-secondary.js-select-all")
    button.click()

    time.sleep(2)

    button2 = driver.find_element_by_css_selector("button.button-alternative.text-s.u-margin-xs-top.u-display-block.js-export-citations-button.button-alternative-primary")
    button2.click()

    time.sleep(2)

    button3 = driver.find_element_by_css_selector("button.button-link.button-link-primary.u-margin-xs-bottom.text-s.u-display-block.js-citation-type-textabs")
    button3.click()

    time.sleep(3)

    #Obtenez l'URL actuelle
    Purl = driver.current_url
    #Casser si Purl et Curl sont identiques
    if Purl== Last_url:
        break

    link = driver.find_element_by_link_text('Previous vol/issue')
    link.click()

Recommended Posts

Grattage avec Python, Selenium et Chromedriver
Grattage avec du sélénium [Python]
Pratiquer le web scraping avec Python et Selenium
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
Grattage avec du sélénium en Python
Grattage avec Selenium + Python Partie 2
Grattage au sélénium
Grattage avec Python
Scraping avec Node, Ruby et Python
Grattage avec Python
Scraping avec Selenium en Python (Basic)
Grattage avec Python et belle soupe
Grattage avec du sélénium
Scraping Web facile avec Python et Ruby
Grattage réussi avec Selenium
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
ScreenShot avec Selenium (édition Python)
Scraping avec Python + PyQuery
Scraping RSS avec Python
python sélénium chromedriver beautifulsoup
Grattage de la nourriture avec python et sortie en CSV
Essayez d'exécuter Google Chrome avec Python et Selenium
Faites glisser et déposez un fichier local avec Selenium (Python)
Programmation avec Python et Tkinter
J'ai essayé de gratter avec Python
Chiffrement et déchiffrement avec Python
Web scraping avec python + JupyterLab
Python et matériel - Utilisation de RS232C avec Python -
Grattage festif avec Python, scrapy
Python: travailler avec Firefox avec du sélénium
Grattage avec Tor en Python
Web scraping avec Selenium (Python)
Scraping prévisions météorologiques avec python
python avec pyenv et venv
[Python + Selenium] Conseils pour le grattage
J'ai essayé de gratter avec du python
Web scraping débutant avec python
Défiez Python3 et Selenium Webdriver
Gratter la page i-town avec du sélénium
Fonctionne avec Python et R
Installez le sélénium sur votre Mac et essayez-le avec python
Suivi automatique sur Twitter avec python et sélénium! (RPA)
J'étais accro au grattage avec Selenium (+ Python) en 2020
Automatisez Chrome avec Python et Selenium sur votre Chromebook
Traduisez automatiquement DeepL en anglais avec Python et Selenium
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Essayez de gratter avec Python + Beautiful Soup
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python