Wie ich bereits in Qiita geschrieben habe, habe ich [Code zum Scraping von Websites in Java] geschrieben (https://qiita.com/hiro0236/items/26414f5bee1999ff9199). Rückblickend ist es schwer zu sagen, dass der Code-Inhalt sauber ist, obwohl er die Anforderungen erfüllt. Es war mir peinlich, es zu sehen, also beschloss ich, es in Python umzuschreiben, also mach dir eine Notiz.
Es gibt viele ähnliche Artikel in Qiita, aber es ist ein Memorandum.
Ich habe beim Scraping mit Java eine Bibliothek namens jsoup verwendet. Dieses Mal werden wir ** Schöne Suppe ** verwenden.
BeautifulSoup ist eine Bibliothek zum Scraping von Python. Da Sie die Elemente auf der Seite mit der CSS-Auswahl extrahieren können, ist es praktisch, nur die gewünschten Daten auf der Seite zu extrahieren. Offiziell: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
Da es sich um eine Python-Bibliothek handelt, wird sie mit pip installiert.
pip install beautifulsoup4
Wie in dem Artikel, den ich zuvor geschrieben habe, möchte ich das Datum, den Titel und die URL von "Notice" von der folgenden Seite extrahieren.
<body>
<div class="section">
<div class="block">
<dl>
<dt>2019.08.04</dt>
<dd>
<a href="http://www.example.com/notice/0003.html">Hinweis 3</a>
</dd>
<dt>2019.08.03</dt>
<dd>
<a href="http://www.example.com/notice/0002.html">Hinweis 2</a>
</dd>
<dt>2019.08.02</dt>
<dd>
<a href="http://www.example.com/notice/0001.html">Hinweis 1</a>
</dd>
</dl>
</div>
</div>
</body>
Extrahieren Sie die Benachrichtigung mit dem folgenden Code und drucken Sie sie aus.
scraping.py
# -*- coding: utf-8 -*-
import requests
import sys
from bs4 import BeautifulSoup
from datetime import datetime as d
def main():
print("Scraping Program Start")
#Senden Sie eine GET-Anfrage an die angegebene URL, um den Inhalt der Seite abzurufen
res=requests.get('http://www.example.com/news.html')
#Analysieren Sie die abgerufene HTML-Seite in ein BeautifulSoup-Objekt
soup = BeautifulSoup(res.text, "html.parser")
#Extrahieren Sie das gesamte Blockklassenelement auf der Seite
block = soup.find(class_="block")
#Extrahieren Sie das dt-Element (Datum) und das dd-Element in der Blockklasse
dt = block.find_all("dt")
dd = block.find_all("dd")
if(len(dt) != len(dd)):
print("ERROR! The number of DTs and DDs didn't match up.")
print("Scraping Program Abend")
sys.exit(1)
newsList = []
for i in range(len(dt)):
try:
date = dt[i].text
title = dd[i].find("a")
url = dd[i].find("a").attrs['href']
print("Got a news. Date:" + date +", title:" + title.string + ", url:" + url)
except:
print("ERROR! Couldn't get a news.")
pass
print("Scraping Program End")
if __name__ == "__main__":
main()
Das erwartete Ergebnis bei der Ausführung des obigen Codes ist wie folgt.
Scraping Program Start
Got a news. Date:2019.08.04, title:Hinweis 3, url:http://www.example.com/notice/0003.html
Got a news. Date:2019.08.03, title:Hinweis 2, url:http://www.example.com/notice/0002.html
Got a news. Date:2019.08.04, title:Hinweis 1, url:http://www.example.com/notice/0001.html
Scraping Program End
Verglichen mit dem letzten Mal, als ich in Javas Spring Boot geschrieben habe, ist es gut, dass die Codierungsmenge in Python überwältigend gering ist. Bitte weisen Sie auf inhaltliche Fehler hin.
Recommended Posts