[PYTHON] Schaben mit kratzender Schale

Einführung

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.

Holen Sie sich XPath

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. Screenshot 2017-03-16 um 9.48.18 Uhr.png 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

Schaben mit Scrapy Shell

Installation von Scrapy

Scrapy Scrapy in Python Anaconda-Umgebung installieren

Bitte beziehen Sie sich auf.

Laden Sie eine Webseite mit Scrapy Shell

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.

Extraktion von Zieldaten

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.

Extrahieren Sie alle Titel

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@hrefBezieht 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.txtDas 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.//divDann 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/ulGeben Sie dann den Knoten in der dritten Zeile an.//div/a/spanDann 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/@hrefExtrahiert den Wert von href in der 6. Zeile
text() Extrahiert die Textknoten aller untergeordneten Elemente des ausgewählten Knotens

Recommended Posts

Schaben mit kratzender Schale
Festliches Scraping mit Python, Scrapy
Einfaches Web-Scraping mit Scrapy
Schaben mit Selen
Schaben mit Selen ~ 2 ~
Scraping mit Python
Scraping mit Python
Schaben mit Selen
Starten Sie mit Scrapy neu
Erfolgreiches Schaben mit Selen
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1.8
Scraping mit Python + PhantomJS
Probleme bei der Installation von Scrapy
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Kratzen mit schöner Suppe
Scraping von RSS mit Python
Ich habe versucht, mit Python zu kratzen
Laden Sie Bilder automatisch mit Scraping herunter
Web Scraping mit Python + JupyterLab
Schaben mit Selen + Python Teil 1
Schaben mit Chromedriver in Python
Versuchen Sie, mit einer Shell zu programmieren!
Speichern Sie Bilder mit Web Scraping
Scraping mit Selen in Python
Scraping mit Tor in Python
Kratzwettervorhersage mit Python
Schaben Nikkei Durchschnitt mit Dramatiker-Python
Schaben mit Selen + Python Teil 2
Ich habe versucht, mit Python zu kratzen
Web Scraping Anfänger mit Python
I-Town-Seite mit Selen abkratzen
Tischkratzen mit schöner Suppe
Laden Sie die Django-Shell mit ipython neu
Versuchen Sie es mit Python + Beautiful Soup
Mehrere Seiten mit Beautiful Soup verschrotten
Scraping mit Node, Ruby und Python
Scraping mit Selen in Python (Basic)
Scraping mit Python, Selen und Chromedriver
Scraping von Alexas Web Rank mit pyQuery
Web Scraping mit Python Erster Schritt
Ich habe versucht, WebScraping mit Python.
Kratzen mit Python und schöner Suppe
Sammle Anison-Texte mit Scrapy
Kratzen mit schöner Suppe in 10 Minuten
Wie fange ich mit Scrapy an?
Lassen Sie uns mit Python Image Scraping durchführen
Regelmäßiges Serverless Scraping mit AWS Lambda + Scrapy Teil 1
Holen Sie sich Qiita-Trends mit Python-Scraping
Automatisieren Sie die Umgebungserstellung mit ShellScript
Machen Sie Scrapy exe mit Pyinstaller
"Scraping & maschinelles Lernen mit Python" Lernnotiz
Website-Scraping mit Beautiful Soup in Python
Schaben 1
Holen Sie sich Wetterinformationen mit Python & Scraping
Abrufen von Eigenschaftsinformationen durch Scraping mit Python