Je souhaite collecter les informations bibliographiques + les résumés de tous les articles publiés dans le Journal of Science Direct.
(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? ??
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)
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.
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.
Ce que je veux faire, c'est aller sur la page de Jounral
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.
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()
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()
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