Faisons du scraping d'images avec Python

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.

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.

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.

Pratique de scraping Web

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.

Connaissance préalable

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.

Capture d'URL d'image

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. スクリーンショット 2017-08-11 19.09.13.png

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. スクリーンショット 2017-08-11 19.11.33.png

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. スクリーンショット 2017-08-11 19.12.41.png

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/". スクリーンショット 2017-08-11 19.15.14.png

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".

Téléchargement d'image

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)

Résumé

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

Faisons du scraping d'images avec Python
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)
Grattage avec Python
Grattage avec Python
Faisons la manipulation des données MySQL avec Python
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
Faites Houdini avec Python3! !! !!
Traitement d'image avec Python
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Scraping RSS avec Python
Traitement d'image avec Python (partie 2)
J'ai essayé de gratter avec Python
Faites Django avec CodeStar (Python3.6.8, Django2.2.9)
Web scraping avec python + JupyterLab
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
Grattage avec chromedriver en python
Édition d'image avec python OpenCV
Tri des fichiers image avec Python (2)
Grattage avec du sélénium en Python
Tri des fichiers image avec Python (3)
Traitement d'image avec Python (partie 1)
Tweet avec image en Python
Tri des fichiers image avec Python
Écrivons python avec cinema4d.
Traitement d'image avec Python (3)
Scraping prévisions météorologiques avec python
Faisons R-CNN avec Sklearn-theano
Grattage avec Selenium + Python Partie 2
J'ai essayé de gratter avec du python
Web scraping débutant avec python
Construisons git-cat avec Python
[Python] Traitement d'image avec scicit-image
Essayez de gratter avec Python + Beautiful Soup
Découpez une image avec python
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Scraping avec Node, Ruby et Python
Scraping avec Selenium en Python (Basic)
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Faisons une interface graphique avec python.
Grattage avec Python, Selenium et Chromedriver
Traitement d'image avec la binarisation Python 100 knocks # 3
Jouons avec Excel avec Python [Débutant]
Pour faire une récursion avec Python2
[Scraping] Scraping Python
Exploration Web, scraping Web, acquisition de caractères et sauvegarde d'image avec python
Que faire avec la sortie de PYTHON?
[Jouons avec Python] Traitement d'image en monochrome et points
Obtenez les tendances Qiita avec le scraping Python
Faisons un graphe avec python! !!
Trouver la similitude d'image avec Python + OpenCV
100 traitement d'image par Python Knock # 2 Échelle de gris
Mémo d'apprentissage "Scraping & Machine Learning avec Python"
Analysons la voix avec Python # 1 FFT
Envoyer l'image avec python et enregistrer avec php