Python: Scraping Teil 2

HTML-Scraping

Kratzmethode

Im vorherigen Beitrag habe ich rllib und Anfragen verwendet, um die Elemente der Webseite abzurufen.

Hier werden wir daran arbeiten, nur die notwendigen Daten daraus zu extrahieren. Um genau zu sein, wird diese Extraktionsarbeit als Schaben bezeichnet.

Es gibt die folgenden Methoden zum Schaben.

Scraping mit regulären Ausdrücken

Betrachten Sie HTML oder XML als einfache Zeichenfolge und extrahieren Sie die erforderlichen Teile. Mit dem re-Modul der Python-Standardbibliothek können Sie beispielsweise beliebige Zeichenfolgen relativ flexibel abrufen.

Scraping mit einer Bibliothek eines Drittanbieters

Grundsätzlich wird diese Methode am häufigsten verwendet. Es gibt mehrere Bibliotheken, die das Scraping von HTML usw. durchführen. Sie können es einfach tun, indem Sie es verwenden.

Die typischen Module in der Python-Bibliothek sind wie folgt.

Elemente / Attribute

Wir werden die in XML und HTML verwendeten Begriffe anhand von in XML geschriebenen Seiten erläutern. XML ist dieselbe Auszeichnungssprache wie HTML und eine erweiterbarere Sprache. Lassen Sie uns den Code der XML-Seite von Yahoo! News als Beispiel erhalten.

import requests

r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml")
print(r.text)
>>>Ausgabeergebnis
<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" version="2.0">
<channel>
<title>Yahoo!Nachrichtenthemen-Haupt</title>
<link>https://news.yahoo.co.jp/</link>
<description>Yahoo!Wir bieten die neuesten Überschriften in den JAPAN News Topics.</description>
<language>ja</language>
<pubDate>Thu, 06 Dec 2018 19:42:33 +0900</pubDate>
<item>
<title>Maßnahmen gegen "Gehirnermüdung", die Sie nicht kennen</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>
......(Folgendes wird weggelassen)......

Der erhaltene Code enthält eine Beschreibung wie (text) </ title>. Ein in diesem HTML-Tag enthaltener Satz wird als Element bezeichnet.</p> <p>Titel heißt Elementname</p> <title> ist das Start-Tag und </ title> ist das End-Tag. Außerdem werden häufig Beschreibungen wie <html lang = "ja"> angezeigt. Dies bedeutet, dass das lang-Attribut ja ist, was darauf hinweist, dass die Sprache Japanisch ist. <h2>Kratzen mit schöner Suppe (1)</h2> <p>BeautifulSoup ist eine einfache und leicht zu merkende Scraping-Bibliothek. Wir werden weiterhin erklären, wie Sie es auf der XML-Seite von Yahoo! News einfach verwenden können.</p> <pre><code class="language-python">#Bibliotheken und Module importieren from bs4 import BeautifulSoup import requests # yahoo!Erhalten Sie wichtige Nachrichtendaten r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml") # BeautifulSoup()Sie können den Dateinamen oder die URL für nicht direkt angeben soup = BeautifulSoup(r.text, "xml") </code></pre> <p>Die BeautifulSoup-Methode ruft die angegebene Webseite ab. Geben Sie im ersten Argument die HTML-Zeichenfolge als Str-Typ oder Byte-Typ an. Geben Sie den Parser im zweiten Argument an. Ein Parser ist ein Programm, das eine Syntaxanalyse durchführt. In diesem Fall wird die HTML-Zeichenfolge Element für Element analysiert und zur Vereinfachung der Verwendung konvertiert.</p> <p>Die Parser, die mit Beautiful Soup verwendet werden können, sind wie folgt. Wählen Sie den richtigen Parser für Ihren Zweck.</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>Schaben mit schöner Suppe (2)</h2> <p>Nachdem Sie den entsprechenden Parser angegeben haben, können Sie die Webseite analysieren. Lassen Sie uns jetzt einen Teil bekommen.</p> <p>Es gibt verschiedene Möglichkeiten, ein Element für die Erfassung anzugeben. Hier werden jedoch die folgenden beiden verwendet.</p> <h3>Tag-Name (+ Attribut)</h3> <p>Wenn Sie den Tag-Namen, das Attribut oder beides in der Suchmethode für die analysierten Daten angeben Holen Sie sich nur das erste erscheinende Element, das es erfüllt. Außerdem findet die find_all-Methode auch alle angegebenen Elemente in einer Liste.</p> <h3>CSS-Auswahl</h3> <p>Wenn Sie einen CSS-Selektor mit der Methode select_one für analysierte Daten angeben Holen Sie sich nur das erste erscheinende Element, das es erfüllt. Außerdem ruft die select-Methode auch alle angegebenen Elemente in der Liste ab.</p> <pre><code class="language-python">import requests from bs4 import BeautifulSoup # yahoo!Erhalten Sie wichtige Nachrichtendaten r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml") #Mit XML analysieren soup = BeautifulSoup(r.text, "xml") #Extrahieren Sie nur das erste Element des Titel-Tags print(soup.find("title")) print() #Extrahieren Sie alle Elemente des Titel-Tags print(soup.find_all("title")) >>>Ausgabeergebnis <title>Yahoo!Nachrichtenthemen-Haupt</title> [<title>Yahoo!Nachrichtenthemen-Haupt</title>, <title>Go Iyama gewinnt die 43. Amtszeit und stellt einen neuen Rekord auf</title>, <title>Werden Mitsuki Takahata und Sakaguchi weiterhin miteinander ausgehen?</title>, <title>Mieko Hanada heiratete erneut unter 13 Jahren</title>, ....(Folgendes wird weggelassen) </code></pre> <p>Der CSS-Selektor ist eine Ausdrucksmethode, die Elemente angibt, die dekoriert werden sollen, z. B. Zeichenfolgen mit CSS. Wenn Sie beispielsweise "body> h1" angeben, erhalten Sie das Element h1, bei dem es sich um die direkte untergeordnete Beziehung des body-Elements handelt.</p> <pre><code class="language-python">#(Erste Hälfte weggelassen) #Extrahiert nur das allererste h1-Element im body-Element print(soup.select_one("body > h1")) print() #Extrahiert alle h1-Elemente im body-Element print(soup.select("body > h1")) </code></pre> <h2>Schaben mit schöner Suppe (3)</h2> <p>Das h3-Tag blieb wie in den im vorherigen Abschnitt erfassten Informationen. Dies liegt daran, dass das Tag ebenfalls zur Liste hinzugefügt wurde. Mit Text können Sie nur den Text in jedem der abgerufenen Elemente abrufen.</p> <pre><code class="language-python">import requests from bs4 import BeautifulSoup # yahoo!Erhalten Sie wichtige Nachrichtendaten r = requests.get("https://news.yahoo.co.jp/pickup/rss.xml") #Mit XML analysieren soup = BeautifulSoup(r.text, "xml") #Extrahieren Sie das Element des Titel-Tags titles = soup.find_all("title") #Rufen Sie die Elemente einzeln mit der for-Anweisung aus der Liste ab #Sie können Text verwenden, um Tags zu entfernen und nur Text auszugeben for title in titles: print(title.text) >>>Ausgabeergebnis Yahoo!Nachrichtenthemen-Haupt Auf Explosion, grobe Fahrlässigkeit usw. untersuchen. NEWS Koyama News jeden.Verschwinde Mieko Hanada heiratete erneut unter 13 Jahren ... </code></pre> <h1>Holen Sie sich den Titel des Fotos</h1> <h2>Holen Sie sich den Titel des Fotos (1)</h2> <p>Bisher habe ich nur eine Webseite abgekratzt In Wirklichkeit denke ich, dass Sie oft mehrere Seiten wie "nächste Seite" abkratzen.</p> <p>Um mehrere Seiten zu kratzen, müssen Sie alle URLs der Seiten abrufen, die Sie kratzen möchten.</p> <p>Die Übungswebseite hat unten eine Seitenzahl Da das Verbindungsziel für jedes festgelegt ist, scheint es gut, es zu erhalten. Die verknüpfte URL wird im href-Attribut des <a> -Elements beschrieben.</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 #Holen Sie sich die Übungswebseite von Aidemy authority = "http://scraping.aidemy.net" r = requests.get(authority) #Mit lxml analysieren soup = BeautifulSoup(r.text, "lxml") #Links für Seitenübergänge finden<a>Holen Sie sich das Element urls = soup.find_all("a") # -----Die URL, die Sie kratzen möchten_Holen Sie sich zur Liste----- url_list = [] # url_Fügen Sie die URL jeder Seite zur Liste hinzu for url in urls: url = authority + url.get("href") url_list.append(url) #Ausgabeliste print(url_list) </code></pre> <h2>Holen Sie sich den Titel des Fotos (2)</h2> <p>Im vorherigen Abschnitt konnten wir die URLs auflisten, die wir erhalten wollten.</p> <p>Wiederholen Sie das Scraping für jede der erfassten URLs Sie können verschiedene Informationen wie Fotoname und Alter erhalten.</p> <p>Wenn Sie die erfassten Informationen in die Datenbank schreiben oder in eine Datei schreiben Es steht für die Datenverarbeitung zur Verfügung.</p> <pre><code class="language-python">import urllib.request import requests from bs4 import BeautifulSoup #Holen Sie sich die Übungswebseite von Aidemy authority = "http://scraping.aidemy.net" r = requests.get(authority) #Mit lxml analysieren soup = BeautifulSoup(r.text, "lxml") #Links für Seitenübergänge finden<a>Holen Sie sich das Element urls = soup.find_all("a") # -----Die URL, die Sie kratzen möchten_Holen Sie sich zur Liste----- url_list = [] # url_Fügen Sie die URL jeder Seite zur Liste hinzu for url in urls: url = authority + url.get("href") url_list.append(url) # -----Den Titel eines Fotos kratzen----- #Erstellen Sie eine Scraping-Funktion def scraping(url): html = urllib.request.urlopen(url) soup = BeautifulSoup(html, "lxml") #Antworte hier photos = soup.find_all("h3") photos_list = [] #Bitte vervollständigen Sie die folgenden Angaben 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="/de/a8d3f16ec0e4c3c50b7c">Python: Scraping Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/fa7941ba5586d95398d7">Python: Scraping Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/8706bdb77eb75d09fd76">[Scraping] Python-Scraping</a> </div> <div style="margin-top: 10px;"> <a href="/de/225f38c23a652459962f">Schaben mit Selen + Python Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/bcbc5b09170be2903ce9">Schaben mit Selen + Python Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/06d15232beb3de9b3f00">QGIS + Python Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/0944d989e72fa8ac8f3a">Python-Scraping-Memo</a> </div> <div style="margin-top: 10px;"> <a href="/de/0cb9b41f32f99e2bc2a5">Python Scraping get_ranker_categories</a> </div> <div style="margin-top: 10px;"> <a href="/de/136297ed22df0317bd89">Scraping mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/36cd0292b327fee417dc">Scraping mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/3ce49cfa6dfaaf488da7">QGIS + Python Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/66fa6ceea66dc5a4d3a3">Python Scraping eBay</a> </div> <div style="margin-top: 10px;"> <a href="/de/91f9232ae28e4b30a73d">Python Scraping get_title</a> </div> <div style="margin-top: 10px;"> <a href="/de/e3dd905fa536b69329ad">Scraping mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/408665802a3d5221e026">Automatisieren Sie einfache Aufgaben mit Python Part1 Scraping</a> </div> <div style="margin-top: 10px;"> <a href="/de/b9f38a4413e424e3e585">[Teil1] Scraping mit Python → Organisieren Sie bis zu CSV!</a> </div> <div style="margin-top: 10px;"> <a href="/de/0989a2daf169c19adada">Scraping in Python (Vorbereitung)</a> </div> <div style="margin-top: 10px;"> <a href="/de/0e41870de5f84b327d59">Versuchen Sie es mit Python.</a> </div> <div style="margin-top: 10px;"> <a href="/de/350773b741ea87c32c20">UnicodeEncodeError: 'cp932' während des Python-Scrapings</a> </div> <div style="margin-top: 10px;"> <a href="/de/42b947a77bba75ea6ce3">Grundlagen der Python-Scraping-Grundlagen</a> </div> <div style="margin-top: 10px;"> <a href="/de/4655a954e8e7e7c557a4">Scraping mit Python + PhantomJS</a> </div> <div style="margin-top: 10px;"> <a href="/de/85fedb9d97c66be0c354">Python Basic Memorandum Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/96aebe73539a3d6e8e59">Python-Grundnotiz - Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/c161462844aef87e0f0d">Schaben mit Selen [Python]</a> </div> <div style="margin-top: 10px;"> <a href="/de/cd51a00de026ef92080a">Scraping mit Python + PyQuery</a> </div> <div style="margin-top: 10px;"> <a href="/de/e2321be29d4660194bab">Python-Grundnotiz - Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/ef0ed3273907ea56e5cd">Scraping von RSS mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/03229bfa161e6dc2ea61">Scraping mit Python 3.5 async / await</a> </div> <div style="margin-top: 10px;"> <a href="/de/0888dff584666d948dd4">Ich habe versucht, mit Python zu kratzen</a> </div> <div style="margin-top: 10px;"> <a href="/de/0f5dbcdd77b5b10cce96">Python mit freeCodeCamp Teil1 studieren</a> </div> <div style="margin-top: 10px;"> <a href="/de/1592ffb4e65744b73a58">Angrenzende Bilder mit Python Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/15b87653ed656f6cf7d5">Python-Anwendung: Pandas Teil 1: Basic</a> </div> <div style="margin-top: 10px;"> <a href="/de/1911252d97321c1f9d9b">Web Scraping mit Python + JupyterLab</a> </div> <div style="margin-top: 10px;"> <a href="/de/248f050a867a9ef53b7a">Python: Schiffsüberlebensvorhersage Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/2714bcd6a56836cc9134">[Python] Scraping in AWS Lambda</a> </div> <div style="margin-top: 10px;"> <a href="/de/272d485e8a249d0d1bd7">Python Super Anfänger versucht zu kratzen</a> </div> <div style="margin-top: 10px;"> <a href="/de/2c2d615040a9adaa6d33">Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/3088148a31f625bff095">Schaben mit Chromedriver in Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/35905779504016085801">Festliches Scraping mit Python, Scrapy</a> </div> <div style="margin-top: 10px;"> <a href="/de/3fc23b2071fafebb2c1f">Python: Überwachtes Lernen: Hyperparameter Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/64153dd78699c7b0a563">Python-Grammatik-Grundnotiz (1)</a> </div> <div style="margin-top: 10px;"> <a href="/de/68e0ce1db7677cfebf63">Scraping mit Selen in Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/6de518f5a242b73180f3">Python: Schiffsüberlebensvorhersage Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/73a566580b229c119675">Python studieren mit freeCodeCamp part2</a> </div> <div style="margin-top: 10px;"> <a href="/de/81f4b893bb1406162ab3">Scraping mit Tor in Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/8e4f8922df083e0c4cf9">Nampre mit Python lösen (Teil 2)</a> </div> <div style="margin-top: 10px;"> <a href="/de/9d6d1169093f8db705df">Web Scraping mit Selenium (Python)</a> </div> <div style="margin-top: 10px;"> <a href="/de/a06b8b00c7d7f6d9e666">Python: Schiffsüberlebensvorhersage Teil 3</a> </div> <div style="margin-top: 10px;"> <a href="/de/a0ffe6aac9790cd1b551">Python: Aktienkursprognose Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/a89b9e44b6b058ebb1ad">Python: Überwachtes Lernen: Hyperparameter Teil 2</a> </div> <div style="margin-top: 10px;"> <a href="/de/ca7a4d0525d6ea32ebe7">[Python + Selen] Tipps zum Scraping</a> </div> <div style="margin-top: 10px;"> <a href="/de/d0c36bd3e5d1c998d3cd">Web Scraping Anfänger mit Python</a> </div> <div style="margin-top: 10px;"> <a href="/de/e72706d4e2e58773a494">Schaben 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/ef86f89218865eb8bd4f">Python x GIS-Grundlagen (1)</a> </div> <div style="margin-top: 10px;"> <a href="/de/fa781f3eac2c0fa8f225">Python: Aktienkursprognose Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/fdecfce2692461687016">Python Crawling & Scraping Kapitel 4 Zusammenfassung</a> </div> <div style="margin-top: 10px;"> <a href="/de/029b6c880ea56ddd0033">Verschieben von CSV-Dateien mit Python Teil 1</a> </div> <div style="margin-top: 10px;"> <a href="/de/0dea7bef7c0b4f76a3dc">Versuchen Sie es mit 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="da95c06173d0b9a56e9c8b5d-|49" defer></script>