[PYTHON] Verstehe in 10 Minuten Selen

Was ist Selen?

Selen ist ein Framework zur Automatisierung von Webbrowser-Vorgängen. Entwickelt im Jahr 2004 von ThoughtWorks, um das Testen der Benutzeroberfläche von Webanwendungen zu automatisieren. https://selenium.dev/history/

Ursprünglich zum Testen der Benutzeroberfläche und des JavaScript-Tests von Webanwendungen entwickelt, wird es für andere Zwecke als zum Testen verwendet, z. B. zum Automatisieren von Aufgaben und zum Crawlen von Websites.

Dieser Artikel beschreibt, wie Sie eine Umgebung erstellen und für den Betrieb von Chrome über Selenium in Python verwenden.

TL;DR

Umgebung

Um den Browser automatisch mit Selenium zu betreiben, müssen Sie Folgendes installieren.

--Webbrowser --Chrome, Firefox, IE, Opera usw.

Hier werden zwei Arten der Umgebungskonstruktion vorgestellt, wenn Selenium mit Python verwendet wird: Zum einen Docker und zum anderen eine Umgebung direkt auf dem lokalen PC.

(Methode 1) Erstellen Sie eine Umgebung mit Doceker

Die Einrichtung mit dem von Selenium offiziell veröffentlichten Docker-Image ist sehr einfach. https://github.com/SeleniumHQ/docker-selenium

Diese Methode hat eine solche Konfiguration.

Der Browser und Remote WebDriver werden auf dem Docker-Container ausgeführt, und Selenium stellt über das Netzwerk eine Verbindung zum Remote WebDriver von einem anderen Host her.

Persönlich ist diese Methode am einfachsten einzurichten und wird am meisten empfohlen.

Installieren Sie Chrome und WebDriver

Führen Sie einfach den folgenden Befehl aus, um die Chrome-Umgebung zu starten, die von Selenium aus betrieben werden kann.

$ docker run -d -p 4444:4444 -v /dev/shm:/dev/shm selenium/standalone-chrome:3.141.59-xenon

WebDriver hat ein etwas ärgerliches Problem, das nur funktioniert, wenn Sie die Version auswählen, die Ihrer Browserversion entspricht. Auf dem offiziellen Docker-Image sind jedoch sowohl der Browser als auch WebDriver installiert, sodass Sie es sofort verwenden können.

Installieren Sie Python Selenium-Bindungen

Installieren Sie die Bibliothek für die Verwendung von Selenium auf dem Computer, auf dem der Python-Code von Selenium ausgeführt wird. Pythons Selenium-Bindungen können mit pip installiert werden.

$ pip install selenium

Versuche dich zu bewegen

Sie können Selenium von Python aus mit folgendem Code ausführen:

from selenium import webdriver

#Legen Sie die Chrome-Optionen fest
options = webdriver.ChromeOptions()
options.add_argument('--headless')

#Stellen Sie eine Verbindung zum Selenium Server her
driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    desired_capabilities=options.to_capabilities(),
    options=options,
)

#Bedienen Sie den Browser über Selen
driver.get('https://qiita.com')
print(driver.current_url)

#Beenden Sie den Browser
driver.quit()

(Methode 2) Erstellen Sie eine lokale Umgebung

Als nächstes werde ich schreiben, wie eine Umgebung zum lokalen Ausführen von Selenium auf dem Mac erstellt wird.

Diese Methode hat eine solche Konfiguration.

Der Browser und der WebDriver werden alle lokal ausgeführt, und Selenium stellt eine Verbindung zum lokalen Treiber her.

Installieren Sie Chrome

Viele Benutzer haben Chrome möglicherweise bereits installiert, installieren Chrome jedoch normal.

Überprüfen Sie anschließend die installierte Version von Chrome, um festzustellen, welche Version von WebDirver installiert werden soll. In meiner Umgebung wurde 78.0.3904.108 installiert.

image.png

Installieren Sie WebDriver

Laden Sie die Chrome WebDriver-Binärdatei herunter. In Python gibt es eine Person, die eine praktische Bibliothek namens "chromedriver-binary" veröffentlicht hat, die die WebDriver-Binärdatei herunterlädt und den Pfad festlegt. Ich werde diese also verwenden.

https://github.com/danielkaiser/python-chromedriver-binary

Da der WebDriver entsprechend der Chrome-Version installiert werden muss, installieren Sie WebDriver, indem Sie wie unten gezeigt nur die Hauptversion mit pip angeben.

$ pip install chromedriver-binary==78.*

Installieren Sie Python Selenium-Bindungen

Pythons Selenium-Bindungen werden mit pip installiert.

$ pip install selenium

Versuche dich zu bewegen

In der lokalen Umgebung können Sie Selenium mit dem folgenden Code ausführen.

import chromedriver_binary # nopa
from selenium import webdriver

#Legen Sie die WebDriver-Optionen fest
options = webdriver.ChromeOptions()
options.add_argument('--headless')

print('connectiong to remote browser...')
driver = webdriver.Chrome(options=options)

driver.get('https://qiita.com')
print(driver.current_url)

#Beenden Sie den Browser
driver.quit()

Im Vergleich zum vorherigen Beispiel in Docker besteht der Unterschied darin, dass die Chrome-Klasse für WebDriver angegeben ist.

Wenn Sie den obigen Code ausführen, wird Chrome auf Ihrem PC gestartet. Wenn Sie den Teil options.add_argument ('--headless') auskommentieren, können Sie sehen, wie der Browserbildschirm angezeigt wird und sich bewegt.

Grundlegende Verwendung

Nachdem Sie eine Umgebung für die Verwendung von Selen erstellt haben, sehen wir uns an, wie Sie es tatsächlich verwenden.

Was du machen willst

Lassen Sie uns nun Chrome auf Selenium ausführen und die folgenden Vorgänge ausführen.

  1. Besuchen Sie die Chanmoro-Profilseite von Qiita https://qiita.com/Chanmoro

  2. Wechseln Sie zur zweiten Seite der Artikelliste, die unter "Letzte Artikel" angezeigt wird.

  3. Rufen Sie die URL ab und zeigen Sie den Titel des Artikels an, der ganz am Anfang der zweiten Seite angezeigt wird

Führen Sie Selenium in Python aus

Hier werden wir Selenium Server mit Docker verwenden, das zu Beginn in der Umgebungskonstruktion eingeführt wurde. Selbst in der lokalen Umgebung besteht der einzige Unterschied in dem Teil, der WebDrive einrichtet, und derselbe Code kann für nachfolgende Vorgänge verwendet werden.

Zunächst zeige ich Ihnen den gesamten Code.

from selenium import webdriver
from selenium.webdriver.common.by import By

# x.Legen Sie die Startoptionen für Chrome fest
options = webdriver.ChromeOptions()
options.add_argument('--headless')

# x.Öffnen Sie ein neues Browserfenster
print('connectiong to remote browser...')
driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    desired_capabilities=options.to_capabilities(),
    options=options,
)

# 1.Besuchen Sie die Chanmoro-Profilseite von Qiita
driver.get('https://qiita.com/Chanmoro')
print(driver.current_url)
# > https://qiita.com/Chanmoro

# 2.Gehen Sie zur zweiten Seite der Artikelliste, die unter "Aktuelle Artikel" angezeigt wird.
driver.find_element(By.XPATH, '//a[@rel="next" and text()="2"]').click()
print(driver.current_url)
# > https://qiita.com/Chanmoro?page=2

# 3.Rufen Sie die URL für den Titel des Artikels ab, der ganz am Anfang der zweiten Seite angezeigt wird
article_links = driver.find_elements(By.XPATH, '//div[@class="ItemLink__title"]/a')
print(article_links[0].text)
# > Python -Rufen Sie eine Funktion dynamisch aus einer Zeichenfolge auf
print(article_links[0].get_attribute('href'))
# > https://qiita.com/Chanmoro/items/9b0105e4c18bb76ed4e9

# x.Beenden Sie den Browser
driver.quit()

Lassen Sie uns Schritt für Schritt erklären.

x. Legen Sie die Chrome-Optionen fest

Legen Sie zunächst die Startoptionen für Chrome fest, bevor Sie Chrome starten. Optionale Klassen sind für jeden Browser separat, und es gibt browserkompatible Klassen wie "ChromeOptions" für Chrome und "FirefoxOptions" für Firefox.

In Chrome startet die Option "kopflos" den Browser, ohne den Bildschirm anzuzeigen. Grundsätzlich denke ich, dass es meistens im Headless-Modus betrieben wird, aber wenn Sie visuell überprüfen möchten, wie der Bildschirm während des Debuggens usw. betrieben wird, können Sie ihn auch verwenden, ohne diese Option anzugeben.

options = webdriver.ChromeOptions()
options.add_argument('--headless')

x. Öffnen Sie ein neues Browserfenster

Öffnen Sie dann ein neues Fenster von Selenium. Wenn der Browser zu diesem Zeitpunkt nicht ausgeführt wird, wird er gestartet.

Wenn Sie Selenium Server verwenden, wie es zu Beginn in der Umgebungskonstruktion eingeführt wurde, verwenden Sie die Klasse "Remote" und geben Sie den Browsertyp mit dem Argument "gewünschte_Fähigkeiten" an. In diesem Beispiel enthält "options" ein "ChromeOptions" -Objekt, daher wird Chrome angegeben.

# NOTE:Geben Sie den Remote-WebDriver wie folgt an, um Selenium remote auszuführen:
driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    desired_capabilities=options.to_capabilities(),
    options=options,
)

1. Besuchen Sie die Chanmoro-Profilseite von Qiita

Greifen Sie auf die angegebene URL zu, indem Sie die Methode "get ()" des WebDriver-Objekts aufrufen.

driver.get('https://qiita.com/Chanmoro')

Sie können auf die aktuell im Fenster angezeigte URL mit "current_url" und den mit "page_source" angezeigten HTML-Code zugreifen.

print(driver.current_url)
print(driver.page_source)

2. Wechseln Sie zur zweiten Seite der Artikelliste, die unter "Letzte Artikel" angezeigt wird.

Gehen Sie zur zweiten Seite am Ende von "Letzte Artikel" in Ihrem Profilbildschirm. Klicken Sie auf den Link, um zur Seite zu gelangen.

image.png

Holen Sie sich in Selen das Zielelement mit "find_element" wie unten gezeigt und klicken Sie, indem Sie "click ()" für dieses Element aufrufen. Hier wird das a-Tag angegeben und angeklickt, das das Attribut "rel =" next "" hat und die Zeichenfolge "2" enthält.

driver.find_element(By.XPATH, '//a[@rel="next" and text()="2"]').click()

Zusätzlich zu XPath können Sie in Selenium das Zielelement auf verschiedene Arten angeben, z. B. als CSS-Selektor, ID-Spezifikation, Namensattributspezifikation und Klassenspezifikation. Persönlich mag ich XPath am meisten, weil es jedes Element auf einmal töten kann. Es ist für den ersten Moment etwas schwierig, bis ich mich an das Schreiben gewöhnt habe.

In diesem Beispiel wird XPath durch Angabe von "By.XPATH" in "find_element ()" geschrieben. Das Gleiche geschieht jedoch durch Angabe von XPath mit "find_element_by_xpath ()".

In diesem Dokument finden Sie weitere Informationen zu Methoden zum Angeben von Elementen. https://selenium-python.readthedocs.io/locating-elements.html

3. Rufen Sie die URL für den Titel des Artikels ab, der ganz am Anfang der zweiten Seite angezeigt wird

Dieses Mal erhalten wir mehrere Elemente, die durch "find_elements ()" angegeben werden. Das zum Zeitpunkt des Klicks verwendete find_element () gibt nur das erste Element zurück, das der angegebenen Bedingung entspricht, aber find_elements () gibt ein Array von Elementen zurück, selbst wenn mehrere Übereinstimmungen vorliegen.

Auf der Profilseite wird "ItemLink__title" der Klasse des Elements des Artikeltitels in der Liste zugewiesen, daher habe ich mich darauf verlassen, um die Liste der Artikeltitel zu erhalten.

article_links = driver.find_elements(By.XPATH, '//div[@class="ItemLink__title"]/a')

Sie können "text" verwenden, um den in das Tag für das abgerufene Element geschriebenen Text abzurufen, und Sie können Attribute wie "href" mit "get_attribute ()" abrufen.

print(article_links[0].text)
print(article_links[0].get_attribute('href'))

x. Beenden Sie den Browser

Wenn der Vorgang abgeschlossen ist, rufen Sie "quit ()" auf, um den Browser zu beenden.

driver.quit()

Wenn Sie vergessen, "quit ()" aufzurufen, wenn während der Selenium-Verarbeitung ein Fehler auftritt, läuft der Browser weiter und es kommt zu einem Fehler, dass der Speicherverbrauch stetig zunimmt. Stellen Sie sicher, dass Sie den Fehler mit catch usw. behandeln, und rufen Sie am Ende des Programms immer "quit ()" auf.

(Tipps) Machen Sie einen Crawler mit Selen

Selen kann auch für Crawler-Anwendungen verwendet werden. Verwenden Sie Selenium, um JavaScript-Zeichen- und Schaltflächenklickvorgänge auszuführen, und verwenden Sie einen HTML-Parser, um die Elemente für die angezeigte Seite abzurufen.

Sie können den von Selenium selbst bereitgestellten HTML-Parser zum Parsen verwenden. Es wird jedoch empfohlen, eine Bibliothek wie BeautifulSoup zu verwenden, da diese nützliche Funktionen zum Parsen bietet und flexibler implementiert werden kann.

Insbesondere wird der von "driver.page_source" erhaltene HTML-Code analysiert und die Daten werden wie im folgenden Code gezeigt abgerufen.

from bs4 import BeautifulSoup
from selenium import webdriver


options = webdriver.ChromeOptions()
options.add_argument('--headless')

driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    desired_capabilities=options.to_capabilities(),
    options=options,
)

driver.get('https://qiita.com/Chanmoro')

#Erstellen Sie ein BeautifulSoup-Objekt aus dem im Browser angezeigten HTML-Code und analysieren Sie es
soup = BeautifulSoup(driver.page_source, 'html.parser')

articles = soup.select('.ItemLink')
for article in soup.select('.ItemLink'):
    #Eine Liste der Artikeltitel wird auf Ihrer Profilseite angezeigt
    print(article.select_one('.ItemLink__title a').get_text())

driver.quit()

Weitere Informationen zur Verwendung von Beautiful Soup finden Sie in dem wunderbaren Artikel "Beautiful Soup in 10 Minuten"! (nervig) https://qiita.com/Chanmoro/items/db51658b073acddea4ac

Zusammenfassung

Übrigens habe ich in diesem Artikel die Umgebungseinstellung und die grundlegende Verwendung von Selen vorgestellt. Es ist sehr einfach, eine Umgebung mit Docker zu erstellen, aber es ist nicht allzu schwierig, eine Umgebung auf Ihrem lokalen PC zu erstellen, sodass Sie beide Methoden sofort ausprobieren können.

Selenium kann nicht nur zum Automatisieren von UI-Tests und Browser-Vorgängen verwendet werden, sondern auch zum Crawlen von Websites wie SPA, das mit JavaScript gerendert wird, wie ich am Ende erwähnt habe.

Für UI-Testzwecke gibt es außerdem einen sehr nützlichen Mechanismus namens Selenium Grid, mit dem Sie Tests auf mehreren Browsertypen gleichzeitig ausführen können. Selenium Grid ist ein großartiger Mechanismus, mit dem Sie mehrere Browsertypen wie Chrome, Firefox, IE und mehrere Browserversionen zusammenfassen und denselben Test über Hub auf diesen mehreren Browsern parallel ausführen können. ist.

Selenium Grid erleichtert auch das Erstellen einer Umgebung mit Docker. Weitere Informationen finden Sie in der Selenium Grid-Dokumentation und in der Docker-Selen-README-Datei. https://selenium.dev/documentation/en/grid/ https://github.com/SeleniumHQ/docker-selenium

Beim Schreiben dieses Artikels habe ich Geschichte von Selen gelesen und erfahren, dass die ThoughtWorks-Ingenieure zuerst das Konzept und die Kernfunktionen von Selen entwickelt haben. Persönlich finde ich, dass es plötzlich cool ist, nur weil es von einer Person aus ThoughtWorks gemacht wurde.

Es gibt auch eine sehr nützliche Browser-Erweiterung namens Selenium IDE, mit der Sie den Browser manuell bewegen können, um seine Vorgänge aufzuzeichnen und wiederzugeben, nämlich Japan. Es scheint, dass eine Person Shinya Kasatani (@shinya) entwickelt wurde.

Selen sollte einen revolutionären Einfluss auf die Entwicklung von Webanwendungen haben, und es ist wirklich erstaunlich, dass solche Software als OSS erstellt und veröffentlicht wurde und auf der ganzen Welt weit verbreitet ist.

Lassen Sie uns jetzt alle verstehen, wie man Selen verwendet, auf den Schultern von Riesen steht und heute ein lustiges Leben in der Browser-Automatisierung hat!

Recommended Posts

Verstehe in 10 Minuten Selen
Selen läuft in 15 Minuten
[Python] Pandas in 10 Minuten vollständig zu verstehen
Lerne Pandas in 10 Minuten
Schaben mit Selen in Python
Scraping mit Selen in Python
Ich verstehe Python auf Japanisch!
Starten Sie in 5 Minuten GIMP Python-Fu
Scraping mit Selen in Python (Basic)
Lassen Sie uns BERT in etwa 30 Minuten erleben.
Kratzen mit schöner Suppe in 10 Minuten
Schreiben Sie Selentestcode in Python
Verstehen Sie Kullback-Leibler, der im Generationsmodell gesprochen wird
Machen Sie matplotlib in 3 Minuten mit Japanisch kompatibel
Verstehen Sie Zahnräder und Erweiterungen in discord.py
Stellen Sie Django in 3 Minuten mit Docker-Compose bereit
[Verständnis in 3 Minuten] Der Beginn von Linux
Implementieren und verstehen Sie den Union-Find-Baum in Go
Ich kann das Element in Selen nicht bekommen!
Djangos External Key Tutorial in 10 Minuten
Screenshots des Webfischens mit Selen und Chrom.
Holen Sie sich die Cloud-Protokollierung in Python in 10 Minuten
[Python] Verstehen Sie die Slice-Operation der Liste in Sekunden