Scraping ist eine Technik, mit der ** beliebige Informationen von Websites gesucht und extrahiert werden **. Neben dem Abrufen von Daten im Web können Sie auch die Struktur analysieren.
Bevor Sie mit dem Schaben beginnen, sollten Sie einige Dinge überprüfen und bei der Arbeit beachten.
Ob die API existiert Wenn es einen Dienst gibt, der API bereitstellt, verwenden Sie diesen, um die Daten abzurufen. Wenn Sie immer noch Probleme wie unzureichende Daten haben, sollten Sie das Scraping in Betracht ziehen.
In Bezug auf die Verwendung der erfassten Daten Seien Sie vorsichtig, wenn Sie die erfassten Daten verwenden. Dies liegt daran, dass die Daten aus der Erfassungsquelle eine andere als Ihre eigene Arbeit sind und Sie sie berücksichtigen müssen, damit sie nicht im Widerspruch zum Urheberrecht stehen.
Vervielfältigung für den privaten Gebrauch (Artikel 30) http://www.houko.com/00/01/S45/048.HTM#030
Vervielfältigung zur Informationsanalyse usw. (Artikel 47-7) http://www.houko.com/00/01/S45/048.HTM#047-6
Darüber hinaus sind im Folgenden drei besonders problematische Rechte aufgeführt.
Das Herstellungsrecht ist eines der im Urheberrecht enthaltenen Rechte und in Artikel 21 des Urheberrechtsgesetzes festgelegt. (Artikel 21 "Der Autor hat das ausschließliche Recht, das Werk zu kopieren.") Wiedergabe bedeutet Kopieren, Aufzeichnen / Aufzeichnen, Drucken / Fotografieren, Kopieren (Kopieren), elektronisches Lesen mit einem Scanner und Speichern. Referenz: https://www.jrrc.or.jp/guide/outline.html
Übersetzungs- und Anpassungsrechte sind Urheberrechte in Artikel 27 des Urheberrechtsgesetzes. Artikel 27 besagt, dass "der Autor das ausschließliche Recht hat, das Werk zu übersetzen, zu arrangieren, zu transformieren oder anzupassen, einen Film zu machen und auf andere Weise anzupassen" ("Copyright Information Center" http. (Von //www.cric.or.jp/db/article/a1.html#021) ist klar angegeben. Im Gegenteil, dies ohne die Erlaubnis des Autors zu tun, ist eine Urheberrechtsverletzung. Referenz: http://www.iprchitekizaisan.com/chosakuken/zaisan/honyaku_honan.html
Das öffentliche Übertragungsrecht ist ein Urheberrechtsrecht gemäß Artikel 23 des Urheberrechtsgesetzes. Gemäß Artikel 23 "hat der Autor das Recht, das Werk öffentlich zu übermitteln (einschließlich der Ermöglichung der Übertragung bei automatischer öffentlicher Übertragung)." Es hat das Recht, die mit dem Empfangsgerät an die Öffentlichkeit übertragenen Arbeiten öffentlich zu übermitteln. " Referenz: http://www.iprchitekizaisan.com/chosakuken/zaisan/kousyusoushin.html
Beachten Sie auch die obigen Punkte und stellen Sie sicher, dass der von Ihnen geschriebene Code den Server nicht überfordert, wenn Sie tatsächlich Scraping durchführen. Übermäßiger Zugriff stellt eine Belastung für den Server dar und wird als Angriff angesehen. Im schlimmsten Fall ist der Dienst möglicherweise für einen bestimmten Zeitraum nicht verfügbar. Darüber hinaus gibt es Fälle, in denen einer der Benutzer aufgrund eines Zugriffsfehlers im System festgenommen wurde. Verwenden Sie ihn daher im Rahmen des gesunden Menschenverstandes. https://ja.wikipedia.org/wiki/岡崎市立中央図書館事件
Lassen Sie uns in diesem Sinne weitermachen.
Es ist nützlich, die Grundlagen von HTML zu kennen, wenn Sie das Web-Scraping üben. Der Grund ist, dass ** die in HTML verwendeten Tags (\ , \
) angegeben werden, um die Daten zu erhalten **.
Lassen Sie mich Ihnen ein Beispiel geben.
sample.html
<html>
<head>
<title>neet-AI</title>
</head>
<body>
<div id="main">
<p>neet-Klicken Sie hier für den AI-Link</p>
<a href="https://neet-ai.com">neet-AI</a>
</div>
</body>
</html>
Wenn Sie sich den obigen Code in Ihrem Browser ansehen
Eine Seite wie diese wird angezeigt.
Lassen Sie uns die auf dieser Seite verwendeten HTML-Tags erläutern.
Verlinke den Namen | Erläuterung |
---|---|
<html></html> | Ein Tag, das explizit angibt, dass dies HTML-Code ist |
<head></head> | Repräsentiert grundlegende Seiteninformationen (Zeichencode und Seitentitel). |
<title></title> | Repräsentiert den Seitentitel. |
<body></body> | Repräsentiert den Hauptteil der Seite. |
<div></div> | Das Tag selbst hat keine Bedeutung, wird jedoch häufig verwendet, um es als einen Inhalt zu beschreiben. |
<p></p> | Der von diesem Tag eingeschlossene Satz wird jetzt als ein Absatz dargestellt. |
<a></a> | Stellt einen Link zu einer anderen Seite dar. |
Es gibt viele andere Typen als die oben beschriebenen Tags. Überprüfen Sie jedes Mal, wenn Sie herausfinden, welche Art von Tag Sie möchten.
Nachdem Sie die HTML-Tags verstanden haben, kratzen wir sie ab.
Das obige Verfahren ist das grundlegende Verfahren zum Schaben.
Beim Web-Scraping mit Python werden verschiedene Bibliotheken verwendet.
・ Anfragen Wird verwendet, um eine Webseite zu erhalten.
・ BeautifulSoup4 Analysieren Sie die erfasste Webseite, suchen Sie nach Tags und formatieren Sie die Daten.
Wir werden Web Scraping mit der oben genannten Bibliothek durchführen.
Bevor Sie kratzen können, müssen Sie den HTML-Code der Webseite in Python abrufen.
get_html.py
import requests
response = requests.get('http://test.neet-ai.com')
print(response.text)
Lassen Sie uns jede Zeile erklären.
response = requests.get('http://test.neet-ai.com')
Diese Zeile übernimmt den HTML-Code von http://test.neet-ai.com. Der abgerufene HTML-Code wird in die Antwortvariable übernommen.
print(response.text)
Die variable Antwort kann in Beautiful Soup nicht ohne Text verwendet werden.
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)
Sehen ist Glauben, schauen wir uns das Programm an. Bis zur 4. Zeile entspricht dies "Vorbereiten des Scrapings mit Python". Das Scraping-Programm beginnt in der 5. Zeile. Erklären wir also jede Zeile.
soup = BeautifulSoup(response.text,'lxml')
Hier wird eine Variable namens Suppe vorbereitet, damit die abgerufenen HTML-Daten gelöscht werden können. Die 'lxml'in Klammern bedeuten ** "Ich werde response.text mit einem Tool namens lxml konvertieren" **.
title = soup.title.string
Wenn Sie die abgerufenen HTML-Daten konvertieren können, können Sie die angegebenen Daten extrahieren, indem Sie sie mit einem festen Typ von BeautifulSoup angeben.
Lassen Sie uns Schritt für Schritt durch dieses Programm gehen. Es sieht so aus, als würde ** in der Suppenvariablen nach dem Tag-Titel gesucht und die Zeichenfolge im Titel-Tag im String-Format ausgegeben **. Dies ist programmatisch etwas schwierig zu verstehen, daher ist es möglicherweise besser, es intuitiv zu verstehen. Es ist schwer zu verstehen, wie es ist, also würde ich es begrüßen, wenn Sie es sich wie folgt vorstellen könnten.
Bitte beziehen Sie sich auf die folgende URL, da nicht genügend Zeit vorhanden ist, um hier detailliertere Formate einzuführen.
Wenn Sie mit diesem Programm die folgenden Ergebnisse erzielen, sind Sie erfolgreich.
neet-AI
Zunächst wird das Tag \ \ verwendet, um einen Link in HTML darzustellen. In diesem Fall können Sie das Zeichenfolgenformat nicht verwenden, da Sie die URL in einem a-Tag abrufen möchten.
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)
** Sie können die verknüpfte href mit einer Funktion namens get () abrufen. ** **. Denken Sie daran, dass die Funktion get () nützlich ist und in Zukunft häufig verwendet wird.
Die Seite, auf die ich mich bisher bezog, hatte nur eine Seite. Wie kratzt man eine Seite mit mehreren Tags? Lassen Sie uns zunächst das vorherige Programm auf einer Seite mit mehreren Tags ausführen. Lassen Sie uns die URL der Zeile ändern, die die Seite erhält.
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)
Wenn ich es starte, sehe ich nur den Need-AI-Link. Dies liegt daran, dass nur das erste Tag extrahiert wird, das inoup.a.get ('href') gefunden wurde. Wenn Sie alle Tags extrahieren möchten, ist dies wie folgt.
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'))
Lassen Sie uns jede Zeile erklären.
links = soup.findAll('a')
Hier ** werden alle Tags extrahiert und einmal in die Liste der Links eingefügt. ** **.
for link in links:
print(link.get('href'))
Da es sich um einen Listentyp handelt, können Sie ihn einzeln bedienen, indem Sie ihn mit for drehen. Sie können jede URL mithilfe der Funktion get () für die Linkvariable abrufen, die betrieben werden kann. ** Denken Sie an diese Methode, bei der Sie alle Tags einmal abrufen und mit drehen, damit Sie sie bedienen können **, da Sie sie in Zukunft häufig verwenden werden.
Bisher enthielten Tags keine ID oder Klasse. Auf einer typischen Site wird jedoch eine ID oder Klasse im Tag festgelegt, um das Webdesign zu vereinfachen oder die Lesbarkeit des Programms zu verbessern. Nur weil eine ID oder Klasse festgelegt ist, wird das Scraping nicht viel schwieriger. ** Im Gegenteil, es kann einfacher sein **, wenn Sie sagen "Ich möchte nur diesen Inhalt kratzen!".
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>
Angenommen, Sie haben eine Site wie die oben beschriebene. Wie Sie anhand des Tags a sehen können, wird allen eine ID zugewiesen. Wenn Sie zu diesem Zeitpunkt die Twitter-URL erhalten möchten, können Sie so schreiben.
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)
Sie können es leicht erhalten, indem Sie den ID-Namen als zweiten der Suche angeben.
Als nächstes machen wir es zu einer Klasse.
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)
Beachten Sie, dass Klasse _ **, nicht ** Klasse. Dies liegt daran, dass die Klasse im Voraus als reserviertes Wort (ein Wort, das in den Sprachspezifikationen eine besondere Bedeutung hat) in Python registriert wird. Um dies zu vermeiden, hätte der Ersteller der BeautifulSoup-Bibliothek einen Unterstrich hinzugefügt.
Die Grundlagen des Web-Scraping sind bisher HTML-Seiten, die das Web-Scraping erleichtern sollen. ** Allgemeine Websites sind jedoch nicht für das Scraping konzipiert, sodass sie eine sehr komplexe Struktur haben können **.
Da es so kompliziert ist, sind neben dem Scraping auch andere Kenntnisse als das Scraping erforderlich, beispielsweise die Eigenschaften von Webseiten.
In der erweiterten Version können Sie komplexe Websites bis zu einem gewissen Grad kratzen, wenn Sie den Dreh raus haben. Lassen Sie uns also das Know-how in der erweiterten Version erweitern.
Diese Technik ist praktisch. Nehmen wir als Beispiel nifty news.
Beispielsweise gibt es eine Seite, die von IT-Kategorie aufgerufen werden kann. Drücken wir die zweite Taste, um die Seite umzublättern.
Wenn Sie sich die URL noch einmal ansehen, https://news.nifty.com/technology/2 Es wird sein.
Als nächstes gehen wir zur dritten Seite.
Die URL auf der dritten Seite ist wie folgt. https://news.nifty.com/technology/3
Wie jeder weiß, der eine serverseitige Entwicklung durchgeführt hat, meistens beim Erstellen von seitenweisen Seiten ** Aktualisieren Sie die Seite, indem Sie die Anzahl der Seiten am Ende der URL und der Parameter eingeben. ** **.
Wenn Sie diesen Mechanismus verwenden, können Sie Seiten umblättern, indem Sie einfach die Zahlen in der ** URL ersetzen. ** **.
Versuchen Sie, das Ende auf Ihre Lieblingsnummer zu ändern. Ich denke, Sie können zu dieser Nummer springen. (Obwohl es Grenzen gibt)
Versuchen wir, ein Programm zu erstellen, das die Suchergebnisse von der 1. bis zur 10. Seite des Programms kratzt.
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)
Es sieht aus wie das. Diese Technik ist nützlich, wenn Sie Suchergebnisse oder serialisierte URLs löschen.
https://search.nifty.com/imagesearch/search? Dieses Mal werden wir die Suchergebnisse von Nifty Image Search kratzen und eine große Anzahl von Bildern herunterladen. In diesem Kapitel erfahren Sie, wie Sie Bilder herunterladen und die URL eines Bildes von Yahoo Image Search abrufen.
Vor dem Scraping von Bildern muss zunächst die Art des Bildes als Mechanismus zum Herunterladen des Bildes bekannt sein. Haben Sie jemals ein Bild mit einem Texteditor geöffnet? Wie jeder, der es geöffnet hat, weiß, ** bestehen Fotos und Daten aus Zahlen. ** **.
Diese Zahl wird von einem Bildbetrachter analysiert und in ein Bild umgewandelt.
Die Geschichte ist aus, aber wenn das Bild aus Zahlen besteht ** Wenn Sie alle Zahlen kopieren können, können Sie die Fotos herunterladen. ** **. Das detaillierte Programm wird im Abschnitt zum Herunterladen von Bildern erläutert.
Als grober Programmablauf (1) Verschrotten Sie den mit einem bestimmten Schlüsselwort erfassten Suchergebnisbildschirm, um die Bild-URL abzurufen. (2) Da sich am Ziel der Bild-URL Bilddaten (Zeichen) befinden, kopieren Sie diese. ③ Fügen Sie die kopierten Daten in Ihren Computer ein.
Wird sein.
Wie in der Vorbereitung erläutert, benötigen Sie zuerst die URL des Bildes, um das Bild herunterzuladen. Suchen Sie zunächst in der Nifty-Bildsuche nach "Katze" und sehen Sie sich den Suchergebnisbildschirm an. Wenn Sie sich die URL ansehen, sehen Sie "q = cat". "Q =" ist der Parameter des zu durchsuchenden Schlüsselworts.
Sie können 20 Fotos auf der Suchergebnisseite sehen. Nehmen wir diesmal diese 20 Bild-URLs.
Werfen wir einen Blick auf den Quellcode.
Die Fotos werden mit dem img-Tag eingefügt. Wenn Sie also nach img suchen, werden Sie ungefähr 140 Treffer finden. 20 von 140 sind die Bild-URLs, nach denen wir suchen. Wir werden immer mehr Bedingungen hinzufügen, um andere als die 20 anwendbaren Fälle auszuschließen.
Lassen Sie uns mit img src suchen.
Das allein ist ziemlich nah. Es gibt jedoch noch einige störende Elemente.
Werfen wir einen Blick auf die 20 entsprechenden Bild-URLs (src). Wie Sie sehen, beginnt alles mit der URL "https://msp.c.yimg.jp/".
Suchen wir nach "https://msp.c.yimg.jp/".
Es ist perfekt 20 Fälle!
Da wir die 20 anwendbaren Fälle eingrenzen konnten, werden wir diesbezüglich ein Programm erstellen.
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 = "Katze"
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'])
Das Herzstück dieses Programms ist
imgs = soup.find_all('img',src=re.compile('^https://msp.c.yimg.jp/yjimage'))
ist. Sie können auch ein Objekt mit regulären Ausdrücken im zweiten Argument von find_all übergeben. Hier suchen wir nach einem src, der mit "https://msp.c.yimg.jp/yjimage" beginnt.
Kopieren Sie beim Herunterladen des Bildes die Daten (Zeichen) des Seitenzielbilds. Um die Daten des Seitenzielbilds abzurufen, können Sie sie zunächst mit **. Content ** in Anfragen abrufen.
Dann können Sie als Datei mit ** open () ** und ** .write ** auf Ihren Computer schreiben. Wenn ich versuche, damit ein Programm zu erstellen, sieht es so aus.
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 = "Katze"
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)
Übrigens, um eine Datei zu generieren (zu öffnen)
with open(str('./picture/')+str(uuid.uuid4())+str('.jpeg'),'wb') as file:
Wir haben eine Bibliothek namens uuid erstellt, die eine ID in der Welt erstellt, damit der Dateiname nicht abgedeckt wird.
Schreiben Sie nach dem Erstellen der Datei die Bilddaten.
file.write(r.content)
Mit dem bisherigen Wissen werden wir 100 Bilder für jedes Keyword kratzen. Mit der Bildsuche von Nifty erhalten Sie 20 Fotos pro Seite des Suchergebnisbildschirms. Also, lasst uns 5 Seiten bekommen.
Aber wie navigieren Sie in Nifty Image Search zu Seiten? In Nifty News können Sie die Nummer am Ende der Seite ändern. Wenn Sie die Seite verschieben, können Sie sie verschieben, indem Sie bei der Nifty-Bildsuche die Nummer von "start =" ändern.
Verschieben wir eine weitere Seite. Weiter ist 40. ** Ich habe festgestellt, dass es möglich ist, Seiten zu verschieben, indem der Wert alle 20 geändert wird. ** **.
Lassen Sie uns ein Programm erstellen, das auf diesen Informationen basiert.
** Beispielprogramm **
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 = "Katze"
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