Web scraping avec Python (prévisions météo)

Qu'est-ce que le Web scraping?

Le grattage est une technique qui ** recherche et extrait des informations arbitraires de sites Web **. En plus de récupérer des données sur le Web, vous pouvez également analyser la structure.

Avant de faire du web scraping

Avant de commencer à gratter, voici quelques éléments à vérifier et à garder à l'esprit lorsque vous travaillez.

  1. Si l'API existe S'il existe un service qui fournit une API, utilisez-le pour obtenir les données. Si vous rencontrez toujours des problèmes tels que des données insuffisantes, envisagez de gratter.

  2. Concernant l'utilisation des données acquises Soyez prudent lorsque vous utilisez les données acquises. En effet, les données de la source d'acquisition sont une œuvre autre que la vôtre et vous devez la prendre en compte afin qu'elle n'entre pas en conflit avec la loi sur les droits d'auteur.

Reproduction pour usage privé (article 30) http://www.houko.com/00/01/S45/048.HTM#030

Reproduction pour analyse d'informations, etc. (article 47-7) http://www.houko.com/00/01/S45/048.HTM#047-6

En outre, voici trois droits particulièrement problématiques.

  1. Copier à droite:

Le droit de fabrication est l'un des droits inclus dans le droit d'auteur et est stipulé à l'article 21 de la loi sur le droit d'auteur. (Article 21 "L'auteur a le droit exclusif de copier l'œuvre.") La reproduction signifie la copie, l'enregistrement / l'enregistrement, l'impression / la photographie, la copie (copie), la lecture électronique avec un scanner et le stockage. Référence: https://www.jrrc.or.jp/guide/outline.html

  1. Droit d'adaptation:

Les droits de traduction et les droits d'adaptation sont des droits de propriété du droit d'auteur stipulés à l'article 27 de la loi sur le droit d'auteur. L'article 27 stipule que "l'auteur a le droit exclusif de traduire, d'organiser, de transformer ou d'adapter, de faire un film et d'adapter l'œuvre d'une autre manière" ("Copyright Information Center" http. (De //www.cric.or.jp/db/article/a1.html#021) est clairement indiqué. Au contraire, le faire sans l'autorisation de l'auteur est une violation du droit d'auteur. Référence: http://www.iprchitekizaisan.com/chosakuken/zaisan/honyaku_honan.html

  1. Droit de transmission publique:

Le droit de transmission publique est un droit de propriété du droit d'auteur stipulé à l'article 23 de la loi sur le droit d'auteur. Dans cet article 23, "L'auteur occupe le droit de transmettre publiquement (y compris permettre la transmission dans le cas d'une transmission publique automatique) pour l'œuvre." "L'auteur occupe le droit." Il occupe le droit de transmettre publiquement l'œuvre transmise au public à l'aide de l'appareil récepteur. " Référence: http://www.iprchitekizaisan.com/chosakuken/zaisan/kousyusoushin.html

Faites également attention à ce qui précède et assurez-vous que le code que vous écrivez ne submerge pas le serveur lorsque vous effectuez un scraping. Un accès excessif met le serveur à rude épreuve et est considéré comme une attaque, et dans le pire des cas, le service peut ne pas être disponible pendant un certain temps. De plus, il y a des cas où l'un des utilisateurs a été arrêté en raison d'un échec d'accès dans le système, veuillez donc l'utiliser dans les limites du bon sens. https://ja.wikipedia.org/wiki/岡崎市立中央図書館事件

Avec ce qui précède à l'esprit, passons à autre chose.

Bases du HTML

Il est utile de connaître les bases du HTML lors de la pratique du web scraping. La raison en est que ** les balises utilisées en HTML (\ , \

, \

) sont spécifiées pour obtenir les données **.

Laisse moi te donner un exemple.

sample.html


<html>
<head>
  <title>neet-AI</title>
</head>
<body>
<div id="main">
  <p>neet-Cliquez ici pour le lien AI</p>
  <a href="https://neet-ai.com">neet-AI</a>
</div>
</body>
</html>

Si vous regardez le code ci-dessus sur votre navigateur

スクリーンショット 2017-06-17 20.24.26.png

Une page comme celle-ci apparaîtra.

Expliquons les balises HTML utilisées sur cette page.

Liste de balises HTML

Nom de la balise La description
<html></html> Une balise qui indique explicitement qu'il s'agit de code HTML
<head></head> Représente les informations de base sur la page (code de caractère et titre de page).
<title></title> Représente le titre de la page.
<body></body> Représente le corps de la page.
<div></div> La balise elle-même n'a aucune signification, mais elle est souvent utilisée pour la décrire comme un contenu unique.
<p></p> La phrase entourée par cette balise est désormais représentée sous forme d'un paragraphe.
<a></a> Représente un lien vers une autre page.

Il existe de nombreux types autres que les balises décrites ci-dessus. Vérifiez chaque fois que vous découvrez quel type de tag vous souhaitez.

Principes de base du scraping Web

Maintenant que vous comprenez les balises HTML, nous allons les gratter.

Étapes de base du scraping Web

  1. Obtenez une page Web
  2. Rechercher et extraire par programme la balise spécifiée (grattage)
  3. Formater et enregistrer ou afficher les données obtenues par grattage

La procédure ci-dessus est la procédure de base pour le grattage.

Bibliothèque à utiliser

Lors du scraping Web avec Python, nous utiliserons diverses bibliothèques.

Demandes Utilisé pour obtenir une page Web.

BeautifulSoup4 Analysez la page Web acquise, recherchez des balises et formatez les données.

Nous ferons du web scraping en utilisant la bibliothèque ci-dessus.

Prêt à gratter en Python

Avant de pouvoir gratter, vous devez récupérer le HTML de la page Web en Python.

get_html.py


import requests

response = requests.get('http://test.neet-ai.com')
print(response.text)

Expliquons chaque ligne.

response = requests.get('http://test.neet-ai.com')

Cette ligne prend le HTML de http://test.neet-ai.com. Le code HTML récupéré entre dans la variable de réponse.

print(response.text)

La réponse variable ne peut pas être utilisée dans Beautiful Soup sans texte.

Titre de la page de grattage

title_scraping.py


import requests
from bs4 import BeautifulSoup

response = requests.get('http://test.neet-ai.com')
soup = BeautifulSoup(response.text,'lxml')
title = soup.title.string
print(title)

Voir c'est croire, jetons un œil au programme. Jusqu'à la 4ème ligne, c'est la même chose que "Preparing for scraping with Python". Le programme de grattage commence à partir de la 5ème ligne, expliquons donc chaque ligne.

soup = BeautifulSoup(response.text,'lxml')

Ici, une variable appelée soupe est préparée afin que les données HTML récupérées puissent être récupérées. Le 'lxml' entre parenthèses signifie ** "Je vais convertir response.text avec un outil appelé lxml" **.

title = soup.title.string

Si vous pouvez convertir les données HTML récupérées, vous pouvez extraire les données spécifiées en les spécifiant avec un type fixe de BeautifulSoup.

Parcourons ce programme étape par étape. Cela ressemble à ** rechercher le titre de la balise dans la variable soupe et afficher la chaîne de caractères dans la balise de titre au format chaîne **. C'est un peu difficile à comprendre par programme, il peut donc être préférable de le comprendre intuitivement. Il est difficile à comprendre tel quel, alors je vous serais reconnaissant si vous pouviez l'imaginer comme suit.

スクリーンショット 2017-06-07 20.08.13.png

Veuillez vous référer à l'URL suivante car il n'y a pas assez de temps pour introduire des formats plus détaillés ici.

Beau document de soupe

Si vous obtenez les résultats suivants en exécutant ce programme, vous réussissez.

neet-AI

Gratter des liens

Tout d'abord, la balise \ \ est utilisée pour représenter un lien en HTML. Dans ce cas, vous ne pouvez pas utiliser le format de chaîne car vous souhaitez obtenir l'URL dans la balise a.

get_link.py


import requests
from bs4 import BeautifulSoup

response = requests.get('http://test.neet-ai.com')
soup = BeautifulSoup(response.text,'lxml')
link = soup.a.get('href')
print(link)

** Vous pouvez obtenir le href lié en utilisant une fonction appelée get (). ** ** Gardez à l'esprit que la fonction get () est utile et sera fréquemment utilisée à l'avenir.

Gratter plusieurs liens

La page à laquelle je faisais référence jusqu'à présent n'avait qu'une seule balise. Alors, comment gratter une page avec plusieurs balises? Tout d'abord, exécutons le programme précédent sur une page avec plusieurs balises a. Modifions l'URL de la ligne qui obtient la page.

link_get.py


import requests
from bs4 import BeautifulSoup

response = requests.get('http://test.neet-ai.com/index2.html')
soup = BeautifulSoup(response.text,'lxml')
link = soup.a.get('href')
print(link)

Lorsque je l'exécute, je ne vois que le lien need-AI. En effet, il extrait uniquement la première balise trouvée dans soup.a.get ('href'). Si vous souhaitez extraire toutes les balises, ce sera comme suit.

link_all_get.py


import requests
from bs4 import BeautifulSoup

response = requests.get('http://test.neet-ai.com/index2.html')
soup = BeautifulSoup(response.text,'lxml')
links = soup.findAll('a')
for link in links:
   print(link.get('href'))

Expliquons chaque ligne.

links = soup.findAll('a')

Ici ** toutes les balises sont extraites et une fois mises dans la liste appelée liens. ** **

for link in links:
   print(link.get('href'))

Puisqu'il s'agit d'un type de liste, vous pouvez l'actionner un par un en le tournant avec for. Vous pouvez obtenir chaque URL en utilisant la fonction get () sur la variable de lien qui peut être utilisée. ** N'oubliez pas cette méthode pour obtenir toutes les balises une fois et les tourner avec pour que vous puissiez les utiliser ** car vous les utiliserez souvent à l'avenir.

Grattage par grattage

Si tu y vas facilement ** Capture d'URL dans la page → demande la destination URL obtenue → raclage à nouveau ** C'est comme ça. C'est facile tant que vous avez la grammaire de base de Python. Ensuite, récupérez l'URL en grattant à partir de https://test.neet-ai.com/index3.html, et c'est l'URL https :: Grattez //test.neet-ai.com/index4.html pour obtenir les liens Twitter et Facebook.

python:scraping_to_scraping.py:


import requests
from bs4 import BeautifulSoup

#Premier grattage
response = requests.get('http://test.neet-ai.com/index3.html')
soup = BeautifulSoup(response.text,'lxml')
link = soup.a.get('href') 

#Deuxième grattage
response = requests.get(link)
soup = BeautifulSoup(response.text,'lxml')
sns = soup.findAll('a')
twitter = sns[0].get('href')
facebook = sns[1].get('href')

print(twitter)
print(facebook)

En effectuant plusieurs demandes et en grattant **, vous pouvez parcourir des sites et des pages. ** **

Grattage avec identifiant ou classe

Auparavant, les tags n'incluaient pas d'identifiant ou de classe. Cependant, sur un site typique, l'identifiant ou la classe est défini dans la balise pour faciliter la conception Web ou pour améliorer la lisibilité du programme. Ce n'est pas parce qu'un identifiant ou une classe est défini que le scraping est beaucoup plus difficile. ** Au contraire, cela peut être plus facile ** lorsque vous dites "Je ne veux gratter que ce contenu!".

index5.html


<html>
<head>
<title>neet-AI</title>
</head>
<body>
<div id="main">
  <a id="neet-ai" href="https://neet-ai.com">neet-AI</a>
  <a id="twitter" href="https://twitter.com/neetAI_official">Twitter</a>
  <a id="facebook" href="https://www.facebook.com/Neet-AI-1116273381774200/">Facebook</a>
</div>
</body>
</html>

Par exemple, supposons que vous ayez un site comme celui ci-dessus. Comme vous pouvez le voir en regardant la balise de a, id est donné à tous. Si vous souhaitez obtenir l'URL de Twitter à ce moment, vous pouvez écrire comme ceci.

twitter_scra.py


import requests
from bs4 import BeautifulSoup

response = requests.get('http://test.neet-ai.com/index5.html')
soup = BeautifulSoup(response.text,'lxml')
twitter = soup.find('a',id='twitter').get('href')

print(twitter)

Vous pouvez facilement l'obtenir en spécifiant le nom de l'id comme deuxième de find.

Ensuite, faisons-en une classe.

index6.html


<html>
<head>
<title>neet-AI</title>
</head>
<body>
<div id="main">
  <a class="neet-ai" href="https://neet-ai.com">neet-AI</a>
  <a class="twitter" href="https://twitter.com/neetAI_official">Twitter</a>
  <a class="facebook" href="https://www.facebook.com/Neet-AI-1116273381774200/">Facebook</a>
</div>
</body>
</html>

twitter_scra_clas.py


import requests
from bs4 import BeautifulSoup

response = requests.get('http://test.neet-ai.com/index6.html')
soup = BeautifulSoup(response.text,'lxml')
twitter = soup.find('a',class_='twitter').get('href')

print(twitter)

Notez que la classe _ **, pas ** la classe. C'est parce que la classe est enregistrée à l'avance comme un mot réservé (un mot qui a une signification particulière dans les spécifications du langage) en python. Pour éviter cela, le créateur de la bibliothèque BeautifulSoup aurait ajouté un trait de soulignement.

Application de scraping Web

Jusqu'à présent, les bases du scraping Web sont des pages HTML conçues pour faciliter le scraping Web. Cependant, ** les sites Web généraux ne sont pas conçus pour le scraping, ils peuvent donc avoir une structure très complexe **.

Comme il est si compliqué, des connaissances autres que le scraping telles que les caractéristiques des pages Web sont nécessaires en plus du scraping.

Dans la version avancée, vous serez en mesure de gratter des sites complexes dans une certaine mesure si vous comprenez bien, alors cultivons le savoir-faire dans la version avancée.

Déboguer à chaque fois

Lors du scraping, il existe de nombreuses situations où l'URL est récupérée et la destination de l'URL est à nouveau récupérée. Dans ce cas, ** n'essayez pas de programmer en même temps, mais déboguez chaque fois que vous créez un programme de scraping **. Si vous déboguez et que toutes les URL sont affichées, c'est comme créer un programme de scraping après cela. Cela peut être vrai pour la programmation en général.

Utilisez les caractéristiques de communication de la page Web

Cette technique est pratique. Prenons nifty news comme exemple.

Par exemple, il existe une page qui peut être paginée par Catégorie informatique. Appuyons en fait sur la seconde ci-dessous pour tourner la page.

En regardant à nouveau l'URL, https://news.nifty.com/technology/2 Ce sera.

Ensuite, passons à la troisième page.

L'URL sur la troisième page est comme ça. https://news.nifty.com/technology/3

Comme le sait tous ceux qui ont fait du développement côté serveur, la plupart du temps lors de la création de pages page par page ** Mettez à jour la page en saisissant le nombre de pages à la fin de l'URL et des paramètres. ** **

Si vous utilisez ce mécanisme, vous pouvez tourner les pages en remplaçant simplement les nombres dans l'URL **. ** **

Essayez de remplacer la fin par votre numéro préféré. Je pense que vous pouvez passer à ce nombre. (Bien qu'il y ait des limites)

Essayons de créer un programme qui gratte les résultats de la recherche de la 1ère page à la 10ème page du programme.

paging_scraping.py


import requests
from bs4 import BeautifulSoup

for page in range(1,11):
           r = requests.get("https://news.nifty.com/technology/"+str(page))
           r.encoding = r.apparent_encoding
           print(r.text)

Ça ressemble à ça. Cette technique est utile lors de la récupération des résultats de recherche ou des URL sérialisées.

Connaître les limites

Je pense que j'ai gratté en jouant avec l'URL dans "Utilisation des caractéristiques de communication de la page Web" plus tôt, mais si j'ai gratté sans connaître la limite, ** Le résultat du dépassement de la limite sera Aucun ou 404 données. Ce sera **. Pour éviter cela, connaissez manuellement les limites de page et intégrez-les dans votre programme.

Pratique de scraping Web

Maintenant que vous avez les bases et les astuces, récupérons automatiquement une grande quantité de données sur le site Web.

Défi: Passons aux données météorologiques du site Web de l'Agence météorologique du 1er janvier 2000 au 31 décembre 2003. http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&block_no=47662&year=2000&month=06&day=1&view=a2

SampleOutput

>python ●●●●.py
29
1013.8
1018.2
1012.5
19:27
--
--
--
--
--
8.1
13.8
16:24
2.6
07:16
4.9
46
28
16:24

30
1013.6
1018.0
1013.2
00:05
--
--
--
--
--
9.0
13.1
12:16
5.3
02:51
4.6
41
27
21:50

Exemple de programme

Le grattage est aussi long que vous pouvez obtenir les données souhaitées. Le programme n'a donc pas à être le même pour tout le monde. Ici, je posterai le programme que j'ai créé.

weather_scraping.py


import requests
from bs4 import BeautifulSoup

#Puisque vous pouvez définir l'année et le mois avec l'URL%Vous permet d'incorporer les caractères alphanumériques spécifiés par s.
base_url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&block_no=47662&year=%s&month=%s&day=1&view=a2"

#2000 dans la déclaration~Tournez 3 fois jusqu'en 2003.
for year in range(2000,2004):

                 #Janvier avec imbriqué pour~Tournez 12 fois en décembre.
        for month in range(1,13):

                #Janvier 2000 avec pour déclaration...février...Il peut être tourné en mars, je vais donc l'intégrer.
                r = requests.get(base_url%(year,month))
                r.encoding = r.apparent_encoding

                #Nous allons gratter la table cible.
                soup = BeautifulSoup(r.text,'lxml')
                rows = soup.findAll('tr',class_='mtx')
                i = 1

                #Les première à troisième lignes du tableau sont des informations de colonne, elles sont donc découpées en tranches.
                rows = rows[4:]

                #Obtenez une ligne du 1er au dernier jour avec l'instruction for.
                for row in rows:
                        data = row.findAll('td')

                                                 #Puisqu'il y a plusieurs données dans une ligne, je vais toutes les récupérer.
                        for d in data:
                                print(d.text)
                        print("")

J'apprécierais si vous pouviez faire un don! Monnaie virtuelle BTC 18c58m54Lf5AKFqSqhEDU548heoTcUJZk ETH 0x291d860d920c68fb5387d8949a138ee95c8d3f03 ZEC t1KtTRKy9w1Sv5zqi3MYnxZ3zugo54G4gXn REP 0x291d860d920c68fb5387d8949a138ee95c8d3f03

Recommended Posts

Web scraping avec Python (prévisions météo)
Scraping prévisions météorologiques avec python
Web scraping avec Python (cours de l'action)
Faisons du scraping d'images avec Python
Web scraping débutant avec python
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Obtenez des informations météorologiques avec Python et le grattage
Grattage WEB avec Python (pour mémo personnel)
Premiers pas avec Python Web Scraping Practice
Site de courses de chevaux Web scraping avec Python
Premiers pas avec Python Web Scraping Practice
Faisons la manipulation des données MySQL avec Python
Créez un framework Web avec Python! (1)
Scraping Web facile avec Python et Ruby
Créez un framework Web avec Python! (2)
[Pour les débutants] Essayez le web scraping avec Python
Grattage en Python (préparation)
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
Essayez de gratter avec Python.
J'ai fait une prévision météo de type bot avec Python.
Grattage avec Python + PhantomJS
Faites Houdini avec Python3! !! !!
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Scraping RSS avec Python
Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~
Scrapage Web rapide avec Python (tout en prenant en charge le chargement JavaScript)
Les débutants en Python sont bloqués dans leur premier scraping Web
J'ai essayé de gratter avec Python
Faites Django avec CodeStar (Python3.6.8, Django2.2.9)
Grattage au sélénium en Python
Grattage avec chromedriver en python
Grattage festif avec Python, scrapy
Faites Django avec CodeStar (Python3.8, Django2.1.15)
Enregistrez des images avec le web scraping
Grattage avec du sélénium en Python
Grattage Web facile avec Scrapy
Grattage avec Tor en Python
API Web avec Python + Falcon
Écrivons python avec cinema4d.
Web scraping avec Selenium (Python)
Faisons R-CNN avec Sklearn-theano
Grattage avec Selenium + Python Partie 2
Application Web avec Python + Flask ② ③
J'ai essayé de gratter avec du python
Construisons git-cat avec Python
Rationalisez la recherche Web avec Python
Application Web avec Python + Flask ④
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
Exploration Web, scraping Web, acquisition de caractères et sauvegarde d'image avec python
Essayez de gratter avec Python + Beautiful Soup
Scraping avec Selenium en Python (Basic)
Grattage WEB avec BeautifulSoup4 (page en couches)
Faisons une interface graphique avec python.
Grattage avec Python, Selenium et Chromedriver