Scrapy verfügt über einen Shell-Modus, mit dem Sie interaktiv kratzen können. In Kombination mit Chrom ist es relativ einfach, von einer Webseite zu kratzen. Dies ist nützlich, um zu überlegen, welche Art von xpath geschrieben werden soll, bevor ein Programm geschrieben wird.
Geben Sie für Scrapy die Daten an, die Sie mit XPath auf der Webseite abrufen möchten. Es ist nicht schwierig, einen eigenen XPath auf eine Seite zu schreiben, die die Struktur von HTML kennt, aber es ist schwierig, den XPath der Daten, die Sie abrufen möchten, auf eine Seite zu schreiben, die Sie nicht erstellt haben. Hier kommt Chrom ins Spiel.
Angenommen, Sie möchten den Titel und den Link jedes Cartoons von der Seite "http: // toyokeizai.net / category / diary" extrahieren. Öffnen Sie diese Seite in Chrom, klicken Sie mit der rechten Maustaste auf den oberen Titel "Ingenieure können am Premium-Freitag nicht zurückkehren" und wählen Sie "Inspizieren" aus dem Menü. Die Entwicklertools werden wie in der folgenden Abbildung gezeigt geöffnet und das entsprechende Tag ausgewählt.
Klicken Sie mit der rechten Maustaste auf das Tag `<span>`
und wählen Sie im Menü "Kopieren" → "XPath kopieren", um den xpath dieses <span>
`Tags in die Zwischenablage zu kopieren. .. In diesem Beispiel ist XPath
//*[@id="latest-items"]/div/ul/li[1]/div[2]/a/span[2]
ist. Auf diese Weise können Sie den XPath ganz einfach mit Chrom erhalten. Informationen zu XPath finden Sie auf den folgenden Websites.
TECHSCORE-Standortpfad XML Path Language (XPath) Version 1.0
Installation von Scrapy
Scrapy Scrapy in Python Anaconda-Umgebung installieren
Bitte beziehen Sie sich auf.
Starten Sie zuerst die Scrapy Shell.
$ scrapy shell
2017-03-16 10:44:42 [scrapy] INFO: Scrapy 1.1.1 started (bot: scrapybot)
2017-03-16 10:44:42 [scrapy] INFO: Overridden settings: {'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter', 'LOGSTATS_INTERVAL': 0}
2017-03-16 10:44:42 [scrapy] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole']
2017-03-16 10:44:42 [scrapy] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2017-03-16 10:44:42 [scrapy] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2017-03-16 10:44:42 [scrapy] INFO: Enabled item pipelines:
[]
2017-03-16 10:44:42 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6024
2017-03-16 10:44:43 [traitlets] DEBUG: Using default logger
2017-03-16 10:44:43 [traitlets] DEBUG: Using default logger
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x1083d7668>
[s] item {}
[s] settings <scrapy.settings.Settings object at 0x108f2cb70>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
In [1]:
Laden Sie dann die Webseite mit dem Befehl `fetch ()`
.
In [1]: fetch('http://toyokeizai.net/category/diary')
2017-03-16 10:46:30 [scrapy] INFO: Spider opened
2017-03-16 10:46:31 [scrapy] DEBUG: Crawled (200) <GET http://toyokeizai.net/category/diary> (referer: None)
Sie können die URL auch beim Starten der Scrapy-Shell angeben und alles auf einmal laden.
$ scrapy shell http://toyokeizai.net/category/diary
Die geladene Seite wird im Objekt `` `response``` gespeichert. Ob die Zielseite geladen werden kann oder nicht, ist
In [3]: view(response)
Out[3]: True
Sie können mit Befehlen wie überprüfen. Verwenden Sie den Befehl view (), um die von Ihrem Standardbrowser geladene Webseite anzuzeigen.
Lassen Sie uns nun die gewünschten Daten abrufen. XPath verwendet die oben genannte.
In [4]: response.xpath('//*[@id="latest-items"]/div/ul/li[1]/div[2]/a/span[2]/text()').extract()
Out[4]: ['Ingenieure können am Premium-Freitag nicht nach Hause gehen']
Sie haben jetzt den Titel. Der dem in Chrome kopierten XPath hinzugefügte `text ()`
ruft alle untergeordneten Textknoten des ausgewählten Knotens ab. Außerdem extrahiert extract () Textdaten aus dem Knoten. Das Ergebnis wird als Array zurückgegeben.
Dann erhalten Sie alle Titel der auf der Seite aufgelisteten Cartoons. Der HTML-Code, der dem bisher verwendeten XPath entspricht, ist
Der HTML-Code dieses Teils lautet
<div id="latest-items">
<div class="article-list">
<ul class="business">
<li class="clearfix">
<div class="ico">…</div>
<div class="ttl">
<a href="/articles/-/161892" class="link-box">
<span class="column-ttl">Wird als Arbeitszeit berücksichtigt</span><br>
<span class="column-main-ttl">Ingenieure können am Premium-Freitag nicht nach Hause gehen</span>
<span class="date">12. März 2017</span>
<span class="summary">Ab dem 24. Februar gibt es einen "Premium-Freitag" am Freitag, an dem Sie das Büro einmal im Monat verlassen können ...</span>
</a>
</div>
</li>
<li class="clearfix">…</li>
<li class="clearfix">…</li>
<li class="clearfix">…</li>
<li class="clearfix">…</li>
<li class="clearfix">…</li>
</ul>
</div>
</div>
Die Struktur ist wie folgt und die Informationen eines Cartoons sind in `<li class =" clearfix ">… </ li>`
enthalten.
Der früher verwendete XPath
//*[@id="latest-items"]/div/ul/li[1]/div[2]/a/span[2]
`li [1]`
bezieht sich auf das erste `<li class =" clearfix ">… </ li>`
. Wenn Sie diese Reihenfolge also nicht angeben, werden alle ` Sie können <li class = "clearfix">… </ li>
`angeben. Das heißt, XPath ist
//*[@id="latest-items"]/div/ul/li/div[2]/a/span[2]
Mach einfach. Ich werde es tatsächlich versuchen.
In [5]: response.xpath('//*[@id="latest-items"]/div/ul/li/div[2]/a/span[2]/text()').extract()
Out[5]:
['Ingenieure können am Premium-Freitag nicht nach Hause gehen',
'Wenn Sie die Maschine nicht schlagen können, werden Sie eine Maschine!',
'Daten in der Cloud können verschwinden!',
'Was ist die unerwartet große Anzahl papierloser Motive?',
'Leider gemeinsame Punkte von unbeliebten männlichen Ingenieuren',
'Was Sie tun müssen, wenn Sie fortgeschrittene Programmierarbeiten in Frage stellen',
'Das neue Jahr 2017 war eine Sekunde länger als gewöhnlich',
'Die neueste Situation im Adventskalender des Ingenieurs',
'Es gibt "unerwartete Feinde" in der Amazonas-Cloud',
'Wann wird das Mizuho Bank System fertiggestellt?',
'Erinnerst du dich an das nostalgische "Konami-Kommando"?',
'"DV" hat im Ingenieurbereich eine andere Bedeutung',
'Erstaunliche Entwicklung des Spiels in den letzten 40 Jahren',
'"Fallstricke" versteckt in langen Herbstnachtprogrammen',
'Ehemalige Sony-Ingenieure sind bei der Arbeit beliebt']
Ich habe alle Titel bekommen. Wenn Sie den obigen HTML- und XPath-Titel vergleichen, wird das Titel-Tag angezeigt```…Es scheint, dass Sie nur direkt angeben können, aber diese Seite ist
<div id = "ranking-items" style = "display: none;"> <! - In der Reihenfolge der Beliebtheit->
<div class="article-list ranking category">
<ul class="ranked business">
<li class="clearfix">
...
<div id = "latest-items"> <! - Letzte Bestellung->
<div class="article-list">
<ul class="business">
<li class="clearfix">
Die Struktur entspricht fast der letzten Bestellung unter der Beliebtheitsreihenfolge. Wenn Sie also nicht vorsichtig sind, werden zusätzliche Daten gemischt. Wenn ich es tatsächlich versuche,
In [6]: response.xpath('//span[@class="column-main-ttl"]/text()').extract()
Out[6]:
['Ingenieure spielen nicht mit Pokemon GO! ',
"Wann wird das Mizuho Bank System fertiggestellt sein?",
"Unglückliche Gemeinsamkeit unbeliebter männlicher Ingenieure",
"Ingenieure können am Premium-Freitag nicht nach Hause gehen",
„Studenten, die Desktop-PCs nicht mehr kennen! ',
"Warum ehemalige Sony-Ingenieure bei der Arbeit beliebt sind",
'Cloud-Daten können verschwinden! ',
"Warum ich Yahoo 3 Tage die Woche nicht beneide",
"Der Speicher des ersten Computers, den ich gekauft habe, ist lebendig",
"Was ist die profitabelste Programmiersprache",
"Wer ist von" Famicom Mini "angezogen?",
'Programmieren ist zu einer sehr beliebten Lektion geworden! ',
"" Autonome Autos "fahren nicht automatisch",
"Die Wahrheit über die Kleidung von Ingenieurinnen und den Verdacht" ",
"Neue Mitarbeiter lernen die Grundlagen, indem sie" Protokolle erstellen "."
"Ingenieure können am Premium-Freitag nicht nach Hause gehen",
„Wenn du die Maschine nicht schlagen kannst, werde eine Maschine! ',
'Cloud-Daten können verschwinden! ',
'Was ist die unerwartet große Anzahl papierloser Motive? ',
"Unglückliche Gemeinsamkeit unbeliebter männlicher Ingenieure",
"Was Sie tun müssen, wenn Sie fortgeschrittene Programmierarbeiten in Frage stellen",
"Der Neujahrstag 2017 war eine Sekunde länger als gewöhnlich",
"Die neueste Situation im Adventskalender des Ingenieurs",
"Es gibt" unerwartete Feinde "in der Amazonas-Wolke",
"Wann wird das Mizuho Bank System fertiggestellt sein?",
"Erinnerst du dich an das nostalgische" Konami-Kommando "?",
"Im Ingenieurbereich hat" DV "eine andere Bedeutung",
"Erstaunliche Entwicklung des Spiels in den letzten 40 Jahren",
"Die" Fallstricke ", die in der langen Herbstnachtprogrammierung verborgen sind",
"Warum ehemalige Sony-Ingenieure bei der Arbeit beliebt sind"]
Die gleichen Daten wie zweimal aufgenommen. Mit anderen Worten, XPath muss eindeutig auf die benötigten Daten verweisen.
##Extrahieren Sie den Link
Die Link-URL zur Manga-Seite finden Sie im Titel des HTML.<span>
Übergeordnetes Tag<a>
Es ist in der href von geschrieben. Der XPath, der darauf zeigt, sieht folgendermaßen aus:
//*[@id="latest-items"]/div/ul/li/div[2]/a/@href
Letzte@href
Bezieht sich auf das href-Attribut des a-Tags. Dieses Mal möchte ich den Attributwert des a-Tags anstelle des Textknotens des untergeordneten a des a-Tags extrahieren, also gehe ich wie oben vor. Wenn Sie dies tatsächlich bewegen
In [7]: response.xpath('//*[@id="latest-items"]/div/ul/li/div[2]/a/@href').extract()
Out[7]:
['/articles/-/161892',
'/articles/-/159846',
'/articles/-/157777',
'/articles/-/153378',
'/articles/-/153367',
'/articles/-/152301',
'/articles/-/152167',
'/articles/-/149922',
'/articles/-/149911',
'/articles/-/146637',
'/articles/-/146559',
'/articles/-/144778',
'/articles/-/144756',
'/articles/-/142415',
'/articles/-/142342']
Es wird sein. Nachdem Sie nun einen XPath haben, um den Titel und den Link jedes Cartoons abzurufen, können Sie die erforderlichen Informationen abrufen, indem Sie ein darauf basierendes Scraping-Programm erstellen.
##Exportieren Sie die erfassten Daten Wenn Sie nur einmal kratzen, können Sie die erforderlichen Daten unverändert ausgeben. Speichern Sie zuerst die gescrapten Daten in einer Variablen und geben Sie sie dann in eine Datei aus.
In [8]: titles = response.xpath('//*[@id="latest-items"]/div/ul/li/div[2]/a/span[2]/text()').extract()
In [9]: links = response.xpath('//*[@id="latest-items"]/div/ul/li/div[2]/a/@href').extract()
In [10]: f = open('bohebohe.txt', 'w')
In [11]: for title, link in zip(titles, links):
...: f.write(title + ', ' + link + '\n')
In [12]: f.close()
mit diesembohebohe.txt
Das Ergebnis des Scrapings wurde in die Datei geschrieben.
$ cat bohebohe.txt
Ingenieure können am Premium-Freitag nicht nach Hause gehen, / articles / - / 161892
Wenn Sie die Maschine nicht schlagen können, werden Sie eine Maschine! , / articles / - / 159846
Daten in der Cloud können verschwinden! , / articles / - / 157777
Was ist die unerwartet große Anzahl papierloser Motive? , / articles / - / 153378
Leider gemeinsame Punkte von unbeliebten männlichen Ingenieuren, / articles / - / 1533767
Was Sie tun müssen, um fortgeschrittene Programmierarbeiten in Angriff zu nehmen, / articles / - / 152301
Das neue Jahr 2017 war eine Sekunde länger als gewöhnlich, / articles / - / 152167
Adventskalender des Ingenieurs Neueste Umstände, / articles / - / 149922
Es gibt "unerwartete Feinde" in der Amazon Cloud, / articles / - / 149911
Wann wird das Mizuho Bank-System fertiggestellt sein, / articles / - / 146637
Erinnern Sie sich an das nostalgische "Konami-Kommando", / articles / - / 146559
"DV" hat in der Ingenieurgemeinschaft eine andere Bedeutung, / articles / - / 144778
Erstaunliche Entwicklung des Spiels in den letzten 40 Jahren, / articles / - / 144756
"Fallstricke" in der langen Herbstnachtprogrammierung, / articles / - / 142415
Der ehemalige Sony-Ingenieur ist bei der Arbeit beliebt, / articles / - / 142342
#abschließend
Es ist ein bisschen mühsam, einen XPath zu debuggen, der Daten beim Erstellen eines Programms angibt, und manchmal ist es eine Verschwendung, ein Programm für etwas zu schreiben, das Sie nur einmal verwenden. In einem solchen Fall ist die Scrapy-Shell, mit der Sie verschiedene Dinge interaktiv ausprobieren und das Python-Skript so ausführen können, sehr praktisch. Sie ist nützlich für verschiedene Experimente, z. B. um nur ein paar Daten aus der in der Vergangenheit erstellten Seite zu extrahieren.
#Bonus XPath Ich werde kurz den in diesem Artikel verwendeten XPath erläutern. Als Beispiel für HTML
1: <div id="latest-items">
2: <div class="article-list">
3: <ul class="business">
4: <li class="clearfix">
5: <div class="ttl">
6: <a href="/articles/-/161892" class="link-box">
7: <span class = "column-ttl"> Als Arbeitszeit integriert </ span> <br>
8: <span class = "column-main-ttl"> Ingenieure können am Premium-Freitag </ span> nicht nach Hause gehen
9: <span class = "date"> 12. März 2017 </ span>
11: </a>
12: </div>
13: </li>
14: </ul>
15: </div>
16:</div>
Wird genutzt.
XPath | Funktion |
---|---|
//e | Alle Knoten, die dem im Tag e verwurzelten Pfad entsprechen.//div Dann beginnen alle Knoten mit dem div-Tag (1), 2,5. Zeile) wird herausgenommen. |
//e1/e2 | Alle Knoten, deren Tag e1 und seine untergeordneten Elemente mit dem Tag e2 übereinstimmen.//dev/ul Geben Sie dann den Knoten in der dritten Zeile an.//div/a/span Dann 7, 8,Nehmen Sie die 9. Zeile heraus. |
//e1/e2[1] | Der erste Knoten des untergeordneten Elements e2 des Tags e1.//li/div/a/span[1] Nimmt die 7. Zeile heraus |
//e[@name="value"] | Ein Knoten mit dem Tag e, dessen Attributname value ist.//div@[@class="article-list"] Nimmt die zweite Zeile heraus |
@name | Ruft das Namensattribut des ausgewählten Knotens ab.//div/a/@href Extrahiert den Wert von href in der 6. Zeile |
text() | Extrahiert die Textknoten aller untergeordneten Elemente des ausgewählten Knotens |
Recommended Posts