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 commencer à gratter, voici quelques éléments à vérifier et à garder à l'esprit lorsque vous travaillez.
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.
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.
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
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
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.
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
Une page comme celle-ci apparaîtra.
Expliquons les balises HTML utilisées sur cette page.
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.
Maintenant que vous comprenez les balises HTML, nous allons les gratter.
La procédure ci-dessus est la procédure de base pour le grattage.
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.
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.
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.
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.
Si vous obtenez les résultats suivants en exécutant ce programme, vous réussissez.
neet-AI
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.
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.
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. ** **
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.
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.
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.
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.
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.
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