Dieses Mal möchte ich Web-Scraping mit Python und Selen durchführen, die ich gerade studiere. Die Zielwebsite ist Google, das mit dem angegebenen Schlüsselwort sucht, die angegebene Anzahl von Elementen erfasst und die drei Elemente "Titel, URL, Zusammenfassung" in die Datenbank schreibt.
Holen Sie sich die folgenden Artikel. Das ultimative Ziel ist es, die Informationen in die SQLite-Datenbank zu schreiben.
Verwenden Sie Python 3.7.1. Die Entwicklungsumgebung ist Visual Studio 2019. Ich habe den Treiber für Firefox von [geckodriver] heruntergeladen (https://github.com/mozilla/geckodriver/releases).
Der Quellcode lautet wie folgt. ** Bitte beachten Sie, dass der folgende Code ab dem "23. April 2020" funktioniert, jedoch möglicherweise aufgrund von Änderungen in den Spezifikationen der Website in der Zukunft nicht funktioniert. ** ** **
google.py
import urllib.parse
import records
from selenium.webdriver import Firefox, FirefoxOptions
from sqlalchemy.exc import IntegrityError
#Suchen Sie mit den folgenden Schlüsselwörtern
keywd = ['Python','Maschinelles Lernen']
#Der Name der Datei, in der die abgerufenen Daten gespeichert werden
db = records.Database('sqlite:///google_search.db')
db.query('''CREATE TABLE IF NOT EXISTS items (
url text PRIMARY KEY,
title text,
summary text NULL)''')
def store_data(url, title, summary):
try:
db.query('''INSERT INTO items (url, title, summary)
VALUES (:url, :title, :summary)''',
url=url, title=title, summary=summary)
except IntegrityError:
#Überspringen Sie dieses Element, da es bereits vorhanden ist
print("it's already exist.")
return False
return True
def visit_next_page(driver, url):
driver.get(url)
items = driver.find_elements_by_css_selector('#rso > div.g')
for item in items:
tag = item.find_element_by_css_selector('div.r > a')
link = tag.get_attribute('href')
title = tag.find_element_by_tag_name('h3').text.strip()
summary = item.find_element_by_css_selector('div.s span.st').text.strip()
if store_data(link, title, summary):
print(title, link, sep='\n', end='\n\n')
def main():
#Zielwebsite und Anzahl der Suchvorgänge (Suche_unit * search_loop)
base_url = "https://www.google.co.jp/"
search_unit = 20 #Anzahl der auf einer Seite angezeigten Elemente (Es scheint unmöglich, 100 oder mehr anzugeben)
search_loop = 5
start = 0
#Kombinieren Sie Schlüsselwörter zu einer Zeichenfolge
target = ' '.join(keywd)
#URL-Codierung (Standardcodierung ist"utf-8")
target = urllib.parse.quote(target)
opt = FirefoxOptions()
#Wenn Sie das Verhalten des Browsers selbst beobachten möchten, kommentieren Sie dies bitte
opt.add_argument('-headless')
driver = Firefox(options=opt)
#Stellen Sie die Wartezeit ein
driver.implicitly_wait(10)
#Seite für Seite lesen
for i in range(search_loop):
url = "{0}search?num={1}&start={2}&q={3}".format(base_url, search_unit, start, target)
start += search_unit
print("\npage count: {0}...".format(i + 1), end='\n\n')
visit_next_page(driver, url)
driver.quit()
if __name__ == '__main__':
main()
Wie Sie den Kommentaren in der Quelle entnehmen können, werde ich den zentralen Teil des Scrapings erläutern.
Der Teil, der die Daten für einen Fall enthält, ist wie folgt. Holen Sie sich dies mit Code wie folgt:
items = driver.find_elements_by_css_selector('#rso > div.g')
Die URL des Titels und des Links lautet wie folgt. Der Gliederungsteil ist wie folgt.
Holen Sie sich dies mit Code wie folgt:
tag = item.find_element_by_css_selector('div.r > a')
link = tag.get_attribute('href')
title = tag.find_element_by_tag_name('h3').text.strip()
summary = item.find_element_by_css_selector('div.s span.st').text.strip()
Geben Sie bei der tatsächlichen Verwendung das Schlüsselwort an, nach dem Sie suchen möchten, und den Dateinamen, der am Anfang des Quellcodes gespeichert werden soll.
#Suchen Sie mit den folgenden Schlüsselwörtern
keywd = ['Python', 'Maschinelles Lernen']
#Der Name der Datei, in der die abgerufenen Daten gespeichert werden
db = records.Database('sqlite:///google_search.db')
Auch wenn dasselbe Programm mehrmals ausgeführt wird, wird dieselbe URL übersprungen, ohne registriert zu werden.
def store_data(url, title, summary):
try:
db.query('''INSERT INTO items (url, title, summary)
VALUES (:url, :title, :summary)''',
url=url, title=title, summary=summary)
except IntegrityError:
#Überspringen Sie dieses Element, da es bereits vorhanden ist
print("it's already exist.")
return False
return True
Zuerst dachte ich, ich würde ungefähr 1000 Artikel auf einer einzelnen Seitenanzeige erhalten, aber es scheint, dass das Limit gemäß den Spezifikationen von Google bei ungefähr 100 Artikeln pro Seite liegt. Deshalb kratz ich, während ich mit zwei Variablen, "search_unit" und "search_loop", zur nächsten Seite wechsle.
Warum nicht auch Beautiful Soup verwenden? Ich wollte jedoch die Verwendung von Selen üben, und da es heutzutage viele Websites gibt, die JavaScript verwenden, scheint es mehr Möglichkeiten zu geben, Selen zu verwenden, also diesmal mit dieser Methode Ich versuchte zu.
Es steht Ihnen frei, den diesmal eingeführten Quellcode zu verwenden, dies geschieht jedoch auf eigenes Risiko.
[Grundlagen und Praxis des Python-Scrapings / Seppe vanden Broucke et al.](Https://www.amazon.co.jp/Python%E3%82%B9%E3%82%AF%E3%83%AC%E3%82% A4% E3% 83% 94% E3% 83% B3% E3% 82% B0% E3% 81% AE% E5% 9F% BA% E6% 9C% AC% E3% 81% A8% E5% AE% 9F% E8% B7% B5-% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 82% B5% E3% 82% A4% E3% 82% A8% E3% 83% B3% E3 % 83% 86% E3% 82% A3% E3% 82% B9% E3% 83% 88% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AEWeb% E3% 83 % 87% E3% 83% BC% E3% 82% BF% E5% 8F% 8E% E9% 9B% 86% E8% A1% 93-Impress-Top-Gang / dp / 4295005282 / ref = tmm_pap_swatch_0? _Encoding = UTF8 & qid = 1587624962 & sr = 1-1)
Recommended Posts