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.
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.
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.
https://search.nifty.com/imagesearch/search? Cette fois, nous allons gratter les résultats de la recherche par Nifty Image Search et télécharger un grand nombre d'images. Dans ce chapitre, vous apprendrez comment télécharger des images et comment obtenir l'URL d'une image à partir de Yahoo Image Search.
Avant le grattage d'image, il faut d'abord connaître la nature de l'image en tant que mécanisme de téléchargement de l'image. Avez-vous déjà ouvert une image avec un éditeur de texte? Comme le savent tous ceux qui l'ont ouvert, ** Les photos et les données sont toutes composées de chiffres. ** **
Ce nombre est analysé par une visionneuse d'images et converti en une image.
L'histoire est désactivée, mais si l'image est composée de nombres ** Si vous pouvez copier tous les nombres, vous pourrez télécharger les photos. ** ** Le programme détaillé sera expliqué dans la section de téléchargement d'images.
En tant que programme approximatif (1) Supprimez l'écran des résultats de recherche acquis avec un certain mot-clé pour acquérir l'URL de l'image. (2) Puisqu'il y a des données d'image (caractères) à la destination de l'URL d'image, copiez-la. ③ Collez les données copiées sur votre ordinateur.
Sera.
Comme expliqué dans la préparation, vous avez d'abord besoin de l'URL de l'image pour télécharger l'image. Tout d'abord, recherchez "chat" dans la recherche d'images Nifty et regardez l'écran des résultats de la recherche. En regardant l'URL, il y a "q = cat". "Q =" est le paramètre du mot-clé à rechercher.
Vous pouvez voir 20 photos sur la page de résultats de recherche. Prenons cette fois ces 20 URL d'image.
Jetons un coup d'œil au code source.
Les photos sont collées avec la balise img, donc si vous recherchez img, vous trouverez environ 140 résultats. 20 sur 140 sont les URL d'images que nous recherchons. Nous ajouterons de plus en plus de conditions à exclure autres que les 20 cas applicables.
Cherchons avec img src.
Cela seul est assez proche. Cependant, il reste des éléments inquiétants.
Jetons un coup d'œil aux 20 URL d'image correspondantes (src). Comme vous pouvez le voir, tout commence par l'URL "https://msp.c.yimg.jp/".
Cherchons "https://msp.c.yimg.jp/".
C'est parfait 20 cas!
Puisque nous avons pu réduire les 20 cas applicables, nous allons créer un programme en ce sens.
pic_url_scra.py
import requests
import re
from bs4 import BeautifulSoup
url = "https://search.nifty.com/imagesearch/search?select=1&q=%s&ss=up"
keyword = "Chat"
r = requests.get(url%(keyword))
soup = BeautifulSoup(r.text,'lxml')
imgs = soup.find_all('img',src=re.compile('^https://msp.c.yimg.jp/yjimage'))
for img in imgs:
print(img['src'])
Le cœur de ce programme est
imgs = soup.find_all('img',src=re.compile('^https://msp.c.yimg.jp/yjimage'))
est. Vous pouvez également passer un objet d'expression régulière dans le deuxième argument de find_all. Ici, nous recherchons un src commençant par "https://msp.c.yimg.jp/yjimage".
Lors du téléchargement de l'image, copiez les données (caractères) de l'image de destination de la page. Tout d'abord, pour obtenir les données de l'image de destination de la page, vous pouvez l'obtenir avec **. Content ** dans les requêtes.
Ensuite, vous pouvez écrire sur votre ordinateur sous forme de fichier avec ** open () ** et ** .write **. Quand j'essaye de construire un programme avec ça, ça ressemble à ça.
pic_download.py
import requests
import re
import uuid
from bs4 import BeautifulSoup
url = "https://search.nifty.com/imagesearch/search?select=1&q=%s&ss=up"
keyword = "Chat"
r = requests.get(url%(keyword))
soup = BeautifulSoup(r.text,'lxml')
imgs = soup.find_all('img',src=re.compile('^https://msp.c.yimg.jp/yjimage'))
for img in imgs:
print(img['src'])
r = requests.get(img['src'])
with open(str('./picture/')+str(uuid.uuid4())+str('.jpeg'),'wb') as file:
file.write(r.content)
En passant pour générer (ouvrir) un fichier
with open(str('./picture/')+str(uuid.uuid4())+str('.jpeg'),'wb') as file:
Nous avons créé une bibliothèque appelée uuid qui crée un identifiant dans le monde afin que le nom du fichier ne soit pas couvert.
Après avoir créé le fichier, écrivez les données d'image.
file.write(r.content)
En utilisant les connaissances jusqu'à présent, nous allons gratter 100 images pour chaque mot-clé. Avec la recherche d'images de Nifty, vous pouvez obtenir 20 photos par page de l'écran des résultats de la recherche. Alors, obtenons 5 pages.
Mais comment naviguez-vous dans les pages dans Nifty Image Search? Dans Nifty News, vous pouvez changer le numéro à la fin de la page, mais lorsque vous déplacez la page, vous pouvez la déplacer en changeant le nombre de "start =" dans le cas de la recherche d'images Nifty.
Déplaçons une autre page. Le prochain est 40. ** J'ai trouvé qu'il est possible de déplacer des pages en changeant la valeur toutes les 20. ** **
Créons un programme basé sur ces informations.
** Exemple de programme **
picture_scraping.py
import requests
import re
import uuid
from bs4 import BeautifulSoup
url = "https://search.nifty.com/imagesearch/search?select=1&chartype=&q=%s&xargs=2&img.fmt=all&img.imtype=color&img.filteradult=no&img.type=all&img.dimensions=large&start=%s&num=20"
keyword = "Chat"
pages = [1,20,40,60,80,100]
for p in pages:
r = requests.get(url%(keyword,p))
soup = BeautifulSoup(r.text,'lxml')
imgs = soup.find_all('img',src=re.compile('^https://msp.c.yimg.jp/yjimage'))
for img in imgs:
r = requests.get(img['src'])
with open(str('./picture/')+str(uuid.uuid4())+str('.jpeg'),'wb') as file:
file.write(r.content)
Recommended Posts