Scraping mit Python, Selen und Chromedriver

Was du machen willst

Ich möchte bibliografische Informationen + Abstracts aller im Journal of Science Direct veröffentlichten Artikel sammeln.

Lernen Sie zuerst die Grundlagen des Schabens

(Referenz: https://codezine.jp/article/detail/12230) Es scheint, dass dies im Wesentlichen mit dem Anforderungspaket und dem Beautiful Soup 4-Paket erfolgt. Installieren Sie also zuerst diese Typen

pip install requests, beautifulsoup4

Also habe ich so etwas versucht.

import request
from bs4 import BeautifulSoup

#Senden Sie eine Anfrage an die URL, die gelöscht werden soll, und rufen Sie den HTML-Code ab
res = requests.get('https://www.ymori.com/books/python2nen/test1.html')

#Erstellen Sie ein BeautifulSoup-Objekt aus dem Antwort-HTML
soup = BeautifulSoup(res.text, 'html.parser')
print(soup)

Vorläufig konnte ich das HTML als Text abrufen, aber wie mache ich das zum Beispiel, indem ich das Kontrollkästchen aktiviere oder auf die Schaltfläche klicke? ??

Selen- und Chrome-Treiber

Nach der Untersuchung scheint es, dass Beautiful Soup keine Seiten erstellen kann, die den Anzeigeinhalt dynamisch ändern, indem Javascript vollständig verwendet wird. Nachdem ich untersucht hatte, was zu tun war, kam ich zu einem Paket namens Selen. (Referenz: https://qiita.com/Fujimon_fn/items/16adbd86fad609d993e8) Anscheinend können Sie so etwas wie RPA machen. Mit anderen Worten, bedienen Sie den Webbrowser so, dass er von Menschen gesehen werden kann. Wenn dies jedoch alles ist, was Sie benötigen, benötigen Sie einen Treiber, der dem von Ihnen verwendeten Browser entspricht. (Referenz: https://kurozumi.github.io/selenium-python/installation.html#drivers)

Installation

Installieren Sie Selen und Chromedriver. Überprüfen Sie vor der Installation auf der Seite ChromeDriver die Treiberversion, die Ihrer Chrome-Version entspricht (überprüfen). Dann war es 84.0.4147.30). (Referenz: https://qiita.com/hanzawak/items/2ab4d2a333d6be6ac760)

pip install selenium, chromedriver-binary==84.0.4147.30

Nach der Installation müssen Sie den Pfad nicht mehr festlegen (Sie müssen jedoch den "Chrome-Treiber importieren" einschließen). Die direkt von [ChromeDriver] heruntergeladene Exe-Datei (https://sites.google.com/a/chromium.org/chromedriver/downloads), z. B. in c: \ work, geben Sie den Pfad explizit ein. Sie können es auch geben. In diesem Fall müssen Sie das Paket nicht importieren.

Beginnen wir vorerst damit

Das Folgende ist ein Beispiel für die explizite Übergabe des Pfads anstelle von "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)

Dann startete der Browser ohne Erlaubnis und sprang unter der angegebenen Adresse zur Seite. Es ist komplett RPA.

Seitenmanipulation

Ich möchte auf Jounrals Seite gehen

  1. Klicken Sie zuerst oben links auf "Alle auswählen" und aktivieren Sie alle angezeigten Kontrollkästchen für Papier.
  2. Klicken Sie auf Zitate exportieren, um ein Dialogfeld zum Herunterladen von Dokumentinformationen anzuzeigen.
  3. Klicken Sie im Dialogfeld auf "Zitat und Zusammenfassung in Text exportieren", um Literaturinformationen herunterzuladen. → Dann wird es als Textdatei heruntergeladen.
  4. Wenn Sie mit dem DLing der Textdatei fertig sind, klicken Sie oben auf der Seite auf "Vorheriger Band / Problem", um zur Seite des vorherigen Bandes zu gelangen. image.png image.png

Verarbeitung aufgerufen. Wenn Sie dies wiederholen, können Sie Informationen aus der gesamten Literatur erhalten. Erfahren Sie also, wie Sie auf "Alle auswählen", "Zitate exportieren" und "Zitieren und Zusammenfassung in Text exportieren" klicken.

Grundsätzlich können Sie das Ziel, das Sie bedienen möchten, auf der vom Treiber geladenen Seite finden, z. B. ID, Klassenname, Namensattribut und send .click (). Suchen Sie also zuerst nach "Select_All". Gehen Sie zur Seite mit Chrom und drücken Sie die Taste F12, um den Entwicklerbildschirm anzuzeigen. Drücken Sie dann "Strg" + "F", um das Suchfeld zu öffnen, und geben Sie "Alle auswählen" ein, um zu suchen. Dann finden Sie den Ort, an dem Select All geschrieben ist. Eigentlich wurde es mit einem Button-Tag gemacht. Nun, das stimmt. Auf den ersten Blick sah es jedoch nicht wie ein Knopf aus, so dass ich ein wenig überrascht war. Klicken Sie vorerst mit der rechten Maustaste auf dieses Schaltflächen-Tag und wählen Sie Kopieren ⇒ Kopierauswahl, um die CSS-Auswahl zu erhalten. image.png

Also zurück zum Quellcode, Fügen Sie den CSS-Selektor von früher ein. Sie benötigen jedoch nur den "Button". Und unten. Deshalb

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

Warten Sie, bis das Element verfügbar ist

Selbst wenn ich das Obige plötzlich zu OpenBrowser.py hinzufüge und es ausführe, schlägt es fehl. Wenn Sie die URL an Chrome übergeben, ist der Zugriff nicht sofort möglich. Bevor Sie jedoch den HTML-Code von der URL abrufen, analysieren Sie ihn, und das Element kann darauf zugreifen. Weil es eine Zeitverzögerung gibt. Also muss ich eine Weile warten. Diese Seite ruft time.sleep () aus dem Zeitpaket ab und verwendet es. Diese Methode ist jedoch nicht intelligent, wie in diesem Handbuch beschrieben. Deshalb verwende ich die mit WebDriver gelieferte Wait-Funktion. Deshalb die folgenden Quellen. (Referenz: https://qiita.com/uguisuheiankyo/items/cec03891a86dfda12c9a) (Referenz: https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html) In Manual gab es nur eine Möglichkeit, das Element anhand der ID anzugeben, im Fall des CSS-Selektors Verwendet "CSS_SELECTOR". (Referenz: https://selenium-python.readthedocs.io/locating-elements.html)

Ich habe es tatsächlich versucht, aber es hat mit Wait nicht funktioniert. Es scheint, dass das Timing auf jeden Fall ausfällt und ein Fehler auftritt. Also habe ich mich doch für time.sleep () entschieden.

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

Gleiches gilt für andere Elemente ...

Für andere "Zitate zitieren" und "Zitate und Zusammenfassung in Text exportieren" rufen Sie die CSS-Auswahl auf und fügen Sie den zu klickenden Prozess hinzu.

Auf der anderen Seite war "Previous Vol / Issue" kein Button, sondern ein Link. Sie können den Link mit dem CSS-Selektor auf die gleiche Weise angeben, aber Sie können auch mit dem Text des Links auf das Element zugreifen. Also habe ich versucht, per Text darauf zuzugreifen.

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)

    #Holen Sie sich die aktuelle URL
    Purl = driver.current_url
    #Brechen Sie, wenn Purl und Curl gleich sind
    if Purl== Last_url:
        break

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

Recommended Posts

Scraping mit Python, Selen und Chromedriver
Schaben mit Selen [Python]
Üben des Web-Scrapings mit Python und Selen
Schaben mit Selen in Python
Schaben mit Selen + Python Teil 1
Scraping mit Selen in Python
Schaben mit Selen + Python Teil 2
Schaben mit Selen
Scraping mit Python
Scraping mit Node, Ruby und Python
Scraping mit Python
Scraping mit Selen in Python (Basic)
Kratzen mit Python und schöner Suppe
Schaben mit Selen
Einfaches Web-Scraping mit Python und Ruby
Erfolgreiches Schaben mit Selen
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Scraping mit Python + PhantomJS
Screenshot mit Selen (Python Edition)
Scraping mit Python + PyQuery
Scraping von RSS mit Python
Python Selen Chromedriver schöne Suppe
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
Versuchen Sie, Google Chrome mit Python und Selenium auszuführen
Ziehen Sie eine lokale Datei mit Selenium (Python) per Drag & Drop.
Programmieren mit Python und Tkinter
Ich habe versucht, mit Python zu kratzen
Ver- und Entschlüsselung mit Python
Web Scraping mit Python + JupyterLab
Python und Hardware-Verwenden von RS232C mit Python-
Festliches Scraping mit Python, Scrapy
Python: Arbeiten mit Firefox mit Selen
Scraping mit Tor in Python
Web Scraping mit Selenium (Python)
Kratzwettervorhersage mit Python
Python mit Pyenv und Venv
[Python + Selen] Tipps zum Scraping
Ich habe versucht, mit Python zu kratzen
Web Scraping Anfänger mit Python
Fordern Sie Python3 und Selenium Webdriver heraus
I-Town-Seite mit Selen abkratzen
Funktioniert mit Python und R.
Installieren Sie Selenium auf Ihrem Mac und probieren Sie es mit Python aus
Automatisches Folgen auf Twitter mit Python und Selen! (RPA)
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Automatisieren Sie Chrome mit Python und Selen auf Ihrem Chromebook
Übersetzen Sie DeepL automatisch mit Python und Selen ins Englische
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Versuchen Sie es mit Python + Beautiful Soup
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Web Scraping mit Python Erster Schritt
Ich habe versucht, WebScraping mit Python.
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python