Web scraping avec Python (cours de l'action)

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 acquises sont une œuvre autre que la vôtre et vous devez la prendre en compte afin qu'elle ne soit 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 la 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. Recherche et extraction par programme de 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 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 la précédente "Préparation au scraping avec 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 soup 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'un seul tag. 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. C'est parce qu'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.

Raclage par raclage

Si tu y vas facilement ** Capture d'URL dans la page → demande la destination de l'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 :: Grattons //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 l'étiquette 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'identifiant 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 grattage telles que les caractéristiques des pages Web sont nécessaires en plus du grattage.

Dans la version avancée, vous serez en mesure de gratter dans une certaine mesure des sites compliqués si vous comprenez bien, cultivons donc 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 à 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 je grattais 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 les limites de page manuellement ou automatiquement à l'avance 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.

Obtenons le cours moyen de l'action Nikkei pendant 10 ans sur le site qui distribue les données sur le cours de l'action et écrivons-le dans le fichier CSV. URL de base http://k-db.com/indices/I101/1d/

Exemple de programme

import csv
import requests
import time
from bs4 import BeautifulSoup

f = open('stock.csv','w')
writer = csv.writer(f)
for year in range(2007,2017+1):
        r = requests.get("http://k-db.com/indices/I101/1d/%s"%year)
        soup = BeautifulSoup(r.text)
        trs = soup.tbody.findAll('tr')
        for tr in trs:
                row = []
                for td in tr.findAll('td'):
                        row.append(td.text)
                writer.writerow(row)
        time.sleep(1)
f.close()

10 ans de grattage pour toutes les marques

import csv 
import requests
import time
from bs4 import BeautifulSoup


r = requests.get("http://k-db.com/indices/")
soup = BeautifulSoup(r.text)
tickers = soup.tbody.findAll('td',class_='l')

for t in tickers:
        f = open('%s.csv'%t.text,'w')
        writer = csv.writer(f)
        #print(t.a.get('href'))
        for year in range(2007,2008+1):
                r = requests.get("http://k-db.com/%s/1d/%s"%(t.a.get('href'),year))
                print("http://k-db.com%s/1d/%s"%(t.a.get('href'),year))
                soup = BeautifulSoup(r.text)
                trs = soup.tbody.findAll('tr')
                for tr in trs:
                        row = []
                        for td in tr.findAll('td'):
                                row.append(td.text)
                        writer.writerow(row)
                time.sleep(1)
        f.close()

Recommended Posts

Web scraping avec Python (cours de l'action)
Web scraping avec Python (prévisions météo)
Faisons du scraping d'images avec Python
Web scraping avec python + JupyterLab
Obtenez des stocks avec Python
Web scraping débutant avec python
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Grattage avec Python
Grattage avec Python
Premiers pas avec Python Web Scraping Practice
Téléchargez les données de cours des actions japonaises avec Python
[Note personnelle] Scraping de pages Web en python3
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)
Pratiquer le web scraping avec Python et Selenium
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.
Grattage avec Python + PhantomJS
Obtenez des données sur le cours de l'action avec l'API Quandl [Python]
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Scraping RSS avec Python
Analysez les informations de prix bas du chèque-cadeau Amazon avec Web scraping & R 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
[Série chronologique avec plotly] Visualisation dynamique avec plotly [python, cours boursier]
J'ai essayé de gratter avec Python
Faites Django avec CodeStar (Python3.6.8, Django2.2.9)
Grattage avec Selenium + Python Partie 1
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
Prévision du cours de l'action avec tensorflow
Grattage avec Tor en Python
API Web avec Python + Falcon
Écrivons python avec cinema4d.
Web scraping avec Selenium (Python)
Python: prévision du cours de l'action, partie 2
Faisons R-CNN avec Sklearn-theano
Grattage avec Selenium + Python Partie 2
Construisons git-cat avec Python
Rationalisez la recherche Web avec Python
Application Web avec Python + Flask ④
Python: prévision du cours de l'action partie 1