Comme je l'ai déjà écrit dans Qiita, j'ai écrit Code pour gratter les sites Web en Java. Avec le recul maintenant, il est difficile de dire que le contenu du code est propre, bien qu'il réponde aux exigences. J'étais gêné de le voir, alors j'ai décidé de le réécrire en Python, alors prenez note.
Il y a beaucoup d'articles similaires dans Qiita, mais c'est un mémorandum.
J'utilisais une bibliothèque appelée jsoup lors du scraping avec Java. Cette fois, nous utiliserons ** Beautiful Soup **.
BeautifulSoup est une bibliothèque pour gratter Python. Puisque vous pouvez extraire les éléments de la page à l'aide du sélecteur CSS, il est pratique d'extraire uniquement les données souhaitées dans la page. Officiel: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
Puisqu'il s'agit d'une bibliothèque Python, elle est installée avec pip.
pip install beautifulsoup4
Comme l'article que j'ai écrit auparavant, je souhaite extraire la date, le titre et l'URL de "Notice" de la page suivante.
<body>
<div class="section">
<div class="block">
<dl>
<dt>2019.08.04</dt>
<dd>
<a href="http://www.example.com/notice/0003.html">Avis 3</a>
</dd>
<dt>2019.08.03</dt>
<dd>
<a href="http://www.example.com/notice/0002.html">Avis 2</a>
</dd>
<dt>2019.08.02</dt>
<dd>
<a href="http://www.example.com/notice/0001.html">Avis 1</a>
</dd>
</dl>
</div>
</div>
</body>
Extrayez la notification avec le code suivant et imprimez-la.
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")
#Envoyez une requête GET à l'URL spécifiée pour obtenir le contenu de la page
res=requests.get('http://www.example.com/news.html')
#Analyser la page HTML récupérée dans un objet BeautifulSoup
soup = BeautifulSoup(res.text, "html.parser")
#Extraire tout l'élément de classe de bloc dans la page
block = soup.find(class_="block")
#Extraire l'élément dt (date) et l'élément dd dans la classe de bloc
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()
Le résultat attendu lors de l'exécution du code ci-dessus est le suivant.
Scraping Program Start
Got a news. Date:2019.08.04, title:Avis 3, url:http://www.example.com/notice/0003.html
Got a news. Date:2019.08.03, title:Avis 2, url:http://www.example.com/notice/0002.html
Got a news. Date:2019.08.04, title:Avis 1, url:http://www.example.com/notice/0001.html
Scraping Program End
Par rapport à la dernière fois que j'ai écrit dans Spring Boot de Java, il est bon que la quantité de codage en Python soit extrêmement faible. Veuillez signaler toute erreur dans le contenu.
Recommended Posts