Python: grattage, partie 2

Grattage HTML

Méthode de grattage

Dans le post précédent, j'ai utilisé rllib et les requêtes pour obtenir les éléments de la page Web.

Ici, nous allons travailler pour en extraire uniquement les données nécessaires. Pour être précis, ce travail d'extraction est appelé grattage.

Il existe les méthodes suivantes pour le grattage.

Scraping avec des expressions régulières

Considérez HTML ou XML comme une simple chaîne de caractères et extrayez les parties nécessaires. Par exemple, vous pouvez utiliser le module re de la bibliothèque standard Python pour récupérer des chaînes de caractères arbitraires avec une relative flexibilité.

Scraping avec une bibliothèque tierce

Fondamentalement, cette méthode est la plus utilisée. Il existe plusieurs bibliothèques qui effectuent du scraping à partir de HTML, etc. Vous pouvez facilement le faire en l'utilisant.

Les modules typiques inclus dans la bibliothèque Python sont les suivants.

Éléments / attributs

Nous expliquerons les termes utilisés en XML et HTML à l'aide de pages écrites en XML. XML est le même langage de balisage que HTML et est un langage plus extensible. Prenons le code de la page XML de Yahoo! News comme exemple.

import requests

r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
print(r.text)
>>>Résultat de sortie
<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" version="2.0">
<channel>
<title>Yahoo!Sujets d'actualité-Majeur</title>
<link>https://news.yahoo.co.jp/</link>
<description>Yahoo!Nous fournissons les dernières rubriques présentées dans JAPAN News Topics.</description>
<language>ja</language>
<pubDate>Thu, 06 Dec 2018 19:42:33 +0900</pubDate>
<item>
<title>Mesures contre la «fatigue cérébrale» dont vous n'êtes pas conscient</title>
<link>https://news.yahoo.co.jp/pickup/6305814</link>
<pubDate>Thu, 06 Dec 2018 19:35:20 +0900</pubDate>
<enclosure length="133" url="https://s.yimg.jp/images/icon/photo.gif" type="image/gif">
</enclosure>
<guid isPermaLink="false">yahoo/news/topics/6305814</guid>
</item>
......(Ce qui suit est omis)......

Il y a une description comme (texte) </ title> dans le code obtenu. Une phrase incluse dans cette balise HTML est appelée un élément.</p> <p>le titre s'appelle le nom de l'élément</p> <title> est la balise de début et </ title> est la balise de fin. De plus, des descriptions telles que <html lang = "ja"> apparaissent souvent. Cela signifie que l'attribut lang est ja, indiquant que la langue est le japonais. <h2>Gratter avec une belle soupe (1)</h2> <p>BeautifulSoup est une bibliothèque de scraping simple et facile à retenir. Je vais continuer à vous expliquer comment l'utiliser facilement en utilisant la page XML de Yahoo! News.</p> <pre><code class="language-python">#Importer des bibliothèques et des modules from bs4 import BeautifulSoup import requests # yahoo!Obtenez des données d'actualité clés r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml") # BeautifulSoup()Vous ne pouvez pas spécifier directement le nom de fichier ou l'URL pour soup = BeautifulSoup(r.text, "xml") </code></pre> <p>La méthode BeautifulSoup obtient la page Web spécifiée. Dans le premier argument, spécifiez la chaîne de caractères HTML comme type str ou type octets. Spécifiez l'analyseur dans le deuxième argument. Un analyseur est un programme qui effectue une analyse de syntaxe. Dans ce cas, la chaîne de caractères HTML est analysée élément par élément et convertie pour en faciliter l'utilisation.</p> <p>Les analyseurs qui peuvent être utilisés avec Beautiful Soup sont les suivants. Choisissez le bon analyseur pour vos besoins.</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430767/ba06a91b-49fd-b27d-9385-56e1fe94ab4c.png" alt="image.png" /></p> <h2>Gratter avec une belle soupe (2)</h2> <p>Maintenant que vous avez spécifié l'analyseur approprié, vous êtes prêt à analyser la page Web. Maintenant, obtenons n'importe quelle partie.</p> <p>Il existe plusieurs façons de spécifier un élément pour l'acquisition, mais ici nous utiliserons les deux suivantes.</p> <h3>Nom de la balise (+ attribut)</h3> <p>Si vous spécifiez le nom de la balise, l'attribut ou les deux dans la méthode de recherche pour les données analysées Obtenez uniquement le premier élément apparaissant qui le satisfait. De plus, la méthode find_all obtient également tous les éléments spécifiés dans une liste.</p> <h3>Sélecteur CSS</h3> <p>Si vous spécifiez un sélecteur CSS avec la méthode select_one pour les données analysées Obtenez uniquement le premier élément apparaissant qui le satisfait. En outre, la méthode de sélection obtient également tous les éléments spécifiés dans la liste.</p> <pre><code class="language-python">import requests from bs4 import BeautifulSoup # yahoo!Obtenez des données d'actualité clés r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml") #Analyser avec xml soup = BeautifulSoup(r.text, "xml") #Extraire uniquement le premier élément de la balise de titre print(soup.find("title")) print() #Extraire tous les éléments de la balise de titre print(soup.find_all("title")) >>>Résultat de sortie <title>Yahoo!Sujets d'actualité-Majeur</title> [<title>Yahoo!Sujets d'actualité-Majeur</title>, <title>Go Iyama remporte le 43e mandat et établit un nouveau record</title>, <title>Est-ce que Mitsuki Takahata et Sakaguchi continueront à sortir ensemble?</title>, <title>Mieko Hanada s'est remariée à moins de 13 ans</title>, ....(Ce qui suit est omis) </code></pre> <p>Le sélecteur CSS est une méthode d'expression qui spécifie les éléments à décorer tels que les chaînes de caractères avec CSS. Par exemple, si vous spécifiez "body> h1", vous obtiendrez l'élément h1, qui est la relation enfant directe de l'élément body.</p> <pre><code class="language-python">#(Première moitié omise) #Extrait uniquement le tout premier élément h1 de l'élément body print(soup.select_one("body > h1")) print() #Extrait tous les éléments h1 de l'élément body print(soup.select("body > h1")) </code></pre> <h2>Gratter avec une belle soupe (3)</h2> <p>La balise h3 est restée telle qu'elle était dans les informations acquises dans la section précédente. En effet, la balise a également été ajoutée à la liste. Avec le texte, vous ne pouvez récupérer que le texte de chacun des éléments récupérés.</p> <pre><code class="language-python">import requests from bs4 import BeautifulSoup # yahoo!Obtenez des données d'actualité clés r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml") #Analyser avec xml soup = BeautifulSoup(r.text, "xml") #Extraire l'élément de la balise de titre titles = soup.find_all("title") #Obtenez les éléments un par un de la liste à l'aide de l'instruction for #Vous pouvez utiliser du texte pour supprimer des balises et afficher uniquement du texte for title in titles: print(title.text) >>>Résultat de sortie Yahoo!Sujets d'actualité-Majeur Rechercher une explosion, une négligence grave, etc. ACTUALITÉS Koyama news chaque.Descendez Mieko Hanada s'est remariée à moins de 13 ans ... </code></pre> <h1>Obtenez le titre de la photo</h1> <h2>Obtenez le titre de la photo (1)</h2> <p>Jusqu'à présent, je n'ai gratté qu'une seule page Web En réalité, je pense que vous grattez souvent plusieurs pages telles que "page suivante".</p> <p>Pour gratter plusieurs pages, vous devez obtenir toutes les URL des pages que vous souhaitez gratter.</p> <p>La page Web de l'exercice a un numéro de page en bas Étant donné que la destination du lien est définie pour chacun, il semble bon de l'obtenir. L'URL liée est décrite dans l'attribut href de l'élément <a>.</p> <pre><code class="language-python">for url in soup.find_all("a"): print(url.get("href")) </code></pre> <pre><code class="language-python">import requests from bs4 import BeautifulSoup #Obtenez la page Web de la pratique d'Aidemy authority = "http://scraping.aidemy.net" r = requests.get(authority) #Analyser avec lxml soup = BeautifulSoup(r.text, "lxml") #Pour rechercher des liens pour les transitions de page<a>Obtenez l'élément urls = soup.find_all("a") # -----L'URL que vous souhaitez supprimer_Accéder à la liste----- url_list = [] # url_Ajoutez l'URL de chaque page à la liste for url in urls: url = authority + url.get("href") url_list.append(url) #Liste de sortie print(url_list) </code></pre> <h2>Obtenez le titre de la photo (2)</h2> <p>Dans la section précédente, nous avons pu lister les URL que nous voulions obtenir.</p> <p>Répéter le scraping pour chacune des URL acquises Vous pouvez obtenir diverses informations telles que le nom et l'âge de la photo.</p> <p>De plus, si vous écrivez les informations acquises dans la base de données ou si vous les écrivez dans un fichier Il sera disponible pour le traitement des données.</p> <pre><code class="language-python">import urllib.request import requests from bs4 import BeautifulSoup #Obtenez la page Web de la pratique d'Aidemy authority = "http://scraping.aidemy.net" r = requests.get(authority) #Analyser avec lxml soup = BeautifulSoup(r.text, "lxml") #Pour rechercher des liens pour les transitions de page<a>Obtenez l'élément urls = soup.find_all("a") # -----L'URL que vous souhaitez supprimer_Accéder à la liste----- url_list = [] # url_Ajouter l'URL de chaque page à la liste for url in urls: url = authority + url.get("href") url_list.append(url) # -----Gratter le titre d'une photo----- #Créer une fonction de grattage def scraping(url): html = urllib.request.urlopen(url) soup = BeautifulSoup(html, "lxml") #Répondez ici photos = soup.find_all("h3") photos_list = [] #Veuillez compléter ce qui suit pour la déclaration for photo in photos: photo = photo.text photos_list.append(photo) return photos_list for url in url_list: print(scraping(url)) </code></pre> <!-- ENDDDDDDDDDDDDDDDDDDDDDDDDDDDDD --> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- post_new_ui_horiz --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5469278205356604" data-ad-slot="4209814965" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <div style="margin-top: 30px;"> <div class="link-top" style="margin-top: 1px;"></div> <p> <font size="4">Recommended Posts</font> <!-- BEGIN LINK ************************* --> <div style="margin-top: 10px;"> <a href="/fr/a8d3f16ec0e4c3c50b7c">Python: grattage partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/fa7941ba5586d95398d7">Python: grattage, partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/8706bdb77eb75d09fd76">[Scraping] Scraping Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/225f38c23a652459962f">Grattage avec Selenium + Python Partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/bcbc5b09170be2903ce9">Grattage avec Selenium + Python Partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/06d15232beb3de9b3f00">QGIS + Python Partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0944d989e72fa8ac8f3a">Mémo de raclage Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0cb9b41f32f99e2bc2a5">Scraping Python get_ranker_categories</a> </div> <div style="margin-top: 10px;"> <a href="/fr/136297ed22df0317bd89">Grattage avec Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/36cd0292b327fee417dc">Grattage avec Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/3ce49cfa6dfaaf488da7">QGIS + Python Partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/66fa6ceea66dc5a4d3a3">Python racle eBay</a> </div> <div style="margin-top: 10px;"> <a href="/fr/91f9232ae28e4b30a73d">Grattage Python get_title</a> </div> <div style="margin-top: 10px;"> <a href="/fr/e3dd905fa536b69329ad">Scraping à l'aide de Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/408665802a3d5221e026">Automatisez des tâches simples avec Python Part1 Scraping</a> </div> <div style="margin-top: 10px;"> <a href="/fr/b9f38a4413e424e3e585">[Part1] Scraping avec Python → Organisez jusqu'à csv!</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0989a2daf169c19adada">Grattage en Python (préparation)</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0e41870de5f84b327d59">Essayez de gratter avec Python.</a> </div> <div style="margin-top: 10px;"> <a href="/fr/350773b741ea87c32c20">UnicodeEncodeError: 'cp932' pendant le scraping Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/42b947a77bba75ea6ce3">Principes de base du grattage Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/4655a954e8e7e7c557a4">Grattage avec Python + PhantomJS</a> </div> <div style="margin-top: 10px;"> <a href="/fr/85fedb9d97c66be0c354">Mémorandum de base Python partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/96aebe73539a3d6e8e59">Mémo de base Python - Partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/c161462844aef87e0f0d">Grattage avec du sélénium [Python]</a> </div> <div style="margin-top: 10px;"> <a href="/fr/cd51a00de026ef92080a">Scraping avec Python + PyQuery</a> </div> <div style="margin-top: 10px;"> <a href="/fr/e2321be29d4660194bab">Mémo de base Python - Partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/ef0ed3273907ea56e5cd">Scraping RSS avec Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/03229bfa161e6dc2ea61">Scraping à l'aide de Python 3.5 async / await</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0888dff584666d948dd4">J'ai essayé de gratter avec Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0f5dbcdd77b5b10cce96">Etudier Python avec freeCodeCamp part1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/1592ffb4e65744b73a58">Images en bordure avec python Partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/15b87653ed656f6cf7d5">Application Python: Pandas Partie 1: Basique</a> </div> <div style="margin-top: 10px;"> <a href="/fr/1911252d97321c1f9d9b">Web scraping avec python + JupyterLab</a> </div> <div style="margin-top: 10px;"> <a href="/fr/248f050a867a9ef53b7a">Python: prévision de survie de navire, partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/2714bcd6a56836cc9134">[Python] Scraping dans AWS Lambda</a> </div> <div style="margin-top: 10px;"> <a href="/fr/272d485e8a249d0d1bd7">python super débutant essaie de gratter</a> </div> <div style="margin-top: 10px;"> <a href="/fr/2c2d615040a9adaa6d33">Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/3088148a31f625bff095">Grattage avec chromedriver en python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/35905779504016085801">Grattage festif avec Python, scrapy</a> </div> <div style="margin-top: 10px;"> <a href="/fr/3fc23b2071fafebb2c1f">Python: Apprentissage supervisé: Hyper Paramètres Partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/64153dd78699c7b0a563">Mémo de grammaire de base Python (1)</a> </div> <div style="margin-top: 10px;"> <a href="/fr/68e0ce1db7677cfebf63">Grattage avec du sélénium en Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/6de518f5a242b73180f3">Python: prévision de survie des navires, partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/73a566580b229c119675">Etudier Python avec freeCodeCamp part2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/81f4b893bb1406162ab3">Grattage avec Tor en Python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/8e4f8922df083e0c4cf9">Résolution de Nampre avec Python (partie 2)</a> </div> <div style="margin-top: 10px;"> <a href="/fr/9d6d1169093f8db705df">Web scraping avec Selenium (Python)</a> </div> <div style="margin-top: 10px;"> <a href="/fr/a06b8b00c7d7f6d9e666">Python: prévision de survie des navires, partie 3</a> </div> <div style="margin-top: 10px;"> <a href="/fr/a0ffe6aac9790cd1b551">Python: prévision du cours de l'action, partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/a89b9e44b6b058ebb1ad">Python: apprentissage supervisé: Hyper Paramètre partie 2</a> </div> <div style="margin-top: 10px;"> <a href="/fr/ca7a4d0525d6ea32ebe7">[Python + Selenium] Conseils pour le grattage</a> </div> <div style="margin-top: 10px;"> <a href="/fr/d0c36bd3e5d1c998d3cd">Web scraping débutant avec python</a> </div> <div style="margin-top: 10px;"> <a href="/fr/e72706d4e2e58773a494">Grattage 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/ef86f89218865eb8bd4f">Principes de base de Python x SIG (1)</a> </div> <div style="margin-top: 10px;"> <a href="/fr/fa781f3eac2c0fa8f225">Python: prévision du cours de l'action partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/fdecfce2692461687016">Python Crawling & Scraping Chapitre 4 Résumé</a> </div> <div style="margin-top: 10px;"> <a href="/fr/029b6c880ea56ddd0033">Translocation de fichiers CSV avec Python Partie 1</a> </div> <div style="margin-top: 10px;"> <a href="/fr/0dea7bef7c0b4f76a3dc">Essayez de gratter avec Python + Beautiful Soup</a> </div> <!-- END LINK ************************* --> </p> </div> </div> </div> <div class="footer text-center" style="margin-top: 40px;"> <!-- <p> Licensed under cc by-sa 3.0 with attribution required. </p> --> </div> <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@10.1.2/build/highlight.min.js"></script> <script> $(document).ready(function() { var cfg_post_height = 60; var cfg_per = 0.51; var ads_obj = $('<ins class="adsbygoogle" style="display:block; text-align:center;" data-ad-layout="in-article" data-ad-format="fluid" data-ad-client="ca-pub-5469278205356604" data-ad-slot="7950405964"></ins>'); $('pre code').each(function(i, e) {hljs.highlightBlock(e)}); function getDocumentOffsetPosition( el ) { var _x = 0; var _y = 0; while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) { _x += el.offsetLeft - el.scrollLeft; _y += el.offsetTop - el.scrollTop; el = el.offsetParent; } return { top: _y, left: _x }; } if ( $( "#article202011" ).length ) { var h1_pos = getDocumentOffsetPosition($('h1')[0]); var footer_pos = getDocumentOffsetPosition($('.link-top')[0]); var post_distance = footer_pos.top - h1_pos.top; // console.log('h1_pos: '+ h1_pos.top); // console.log(cfg_post_height) if((post_distance/h1_pos.top)>=cfg_post_height) { // console.log('tesssssssssssssssssssssssssssssssss'); $( ".container p" ).each(function( index ) { var p_tag_pos = $(this).position().top; var dis = p_tag_pos - h1_pos.top; var per = dis/post_distance; if(per>cfg_per) { ads_obj.insertAfter($(this)); (adsbygoogle = window.adsbygoogle || []).push({}); console.log( index + ": " + $( this ).text() ); return false; } }); } } }); </script> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> <!-- ads --> <script data-ad-client="ca-pub-5469278205356604" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js" type="d7540fe192d881abe59fcf57-text/javascript"></script> <!-- end ads --> </body> </html><script src="/cdn-cgi/scripts/7d0fa10a/cloudflare-static/rocket-loader.min.js" data-cf-settings="4e391eed6aa392e0b762a22d-|49" defer></script>