Python Super Anfänger versucht zu kratzen

Was ist Schaben?

Wenn Sie das Wort "kratzen" sagen, gibt es ungefähr zwei Dinge: "kriechen" und "kratzen". Ich war verwirrt, also werde ich es einmal klären.

So werde ich zum Beispiel von der Seite der Shogi-Föderation den Titel meines Lieblingsschachmanns extrahieren. Toka ist eine Übersetzung von "Scraping".

scrapy

Lassen Sie es uns tatsächlich kratzen. Wenn ich darüber nachdenke, habe ich bisher nur PHP verwendet Ich habe mich bemüht, die gewünschten Informationen mit Goutte usw. von der Seite zu extrahieren.

Also habe ich erfahren, dass Python, das ich kürzlich eingeführt habe, eine Bibliothek (Framework?) Namens Scrapy hat, die das Scraping sehr einfach macht.

Dieses Mal werde ich dies verwenden, um Informationen über meine Lieblingsschachfiguren auf der Seite der Shogi-Föderation zu sammeln.

Installation

$ pip install scrapy

Komplett

Lernprogramm

Nun, ich bin ein super Anfänger, der Python überhaupt nicht versteht, also werde ich das Tutorial Schritt für Schritt ausprobieren, um ein Gefühl dafür zu bekommen.

In der Dokumentation gab es eine Tutorial-Ecke. https://docs.scrapy.org/en/latest/intro/tutorial.html

Es ist Englisch, aber es ist ganz so.

Die im Tutorial beschriebene Arbeitsreihenfolge

  1. Erstellen Sie ein neues Scrapy-Projekt
  2. Schreiben Sie eine Spinne, um Ihre Site zu crawlen und die benötigten Daten zu extrahieren
  3. Geben Sie die extrahierten Informationen über die Befehlszeile aus
  4. Wechseln wir die Spinne, um dem Link zu folgen (ich habe kein Englisch verstanden)
  5. Verwenden wir Spinnenargumente

Ich möchte etwas in dieser Reihenfolge tun.

1. Erstellen Sie ein neues Scrapy-Projekt

scrapy startproject tutorial

Das scheint gut zu sein.

[vagrant@localhost test]$ scrapy startproject tutorial
New Scrapy project 'tutorial', using template directory '/usr/lib64/python3.5/site-packages/scrapy/templates/project', created in:
    /home/vagrant/test/tutorial

You can start your first spider with:
    cd tutorial
    scrapy genspider example example.com
    
[vagrant@localhost test]$ ll
Insgesamt 0
drwxr-xr-x 3 Vagabund Vagabund 38 April 16 04:15 tutorial

Ein Verzeichnis namens Tutorial wurde erstellt!

Es gibt also verschiedene Dinge, aber laut Dokument hat jede Datei die folgenden Rollen.

tutorial/
    scrapy.cfg            #Bereitstellungskonfigurationsdatei

    tutorial/             # project's Python module, you'll import your code from here
        __init__.py

        items.py          # project items definition file

        pipelines.py      # project pipelines file

        settings.py       # project settings file

        spiders/          # a directory where you'll later put your spiders
            __init__.py

Ich habe nichts anderes als die Bereitstellungskonfigurationsdatei verstanden lol

2. Schreiben Sie eine Spinne, um Ihre Site zu crawlen und die benötigten Daten zu extrahieren

Erstellen Sie eine Datei mit dem Namen "quote_spider.py" unter "tutorial / spides /" und erstellen Sie sie, da etwas kopiert und eingefügt werden muss.

[vagrant@localhost tutorial]$ vi tutorial/spiders/quotes_spider.py
import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

3. Geben Sie die extrahierten Informationen über die Befehlszeile aus

scrapy crawl quotes

Es scheint, dass Sie damit gehen können.

Nachdem etwas herauskam, wurden "Quotes-1.html" und "Quotes-2.html" erstellt

[vagrant@localhost tutorial]$ ll
32 insgesamt
-rw-rw-r--1 Vagabund Vagabund 11053 16. April 04:27 quotes-1.html
-rw-rw-r--1 Vagabund Vagabund 13734 16. April 04:27 quotes-2.html
-rw-r--r--1 Vagabund Vagabund 260 16. April 04:15 scrapy.cfg
drwxr-xr-x 4 Vagabund Vagabund 129 16. April 04:15 tutorial

Ich schrieb hier "Lassen Sie uns die aus der Befehlszeile extrahierten Informationen ausgeben", Als ich mir den Inhalt der Analysemethode ansah, machte ich eigentlich nur so etwas wie ↓

Die Methode start_requests ist einfach zu schreiben

Immerhin gibt diese Methode am Ende nur das Objekt "Scrapy.Request" zurück, aber es scheint, dass dies durch einfaches Schreiben von "start_urls" realisiert werden kann.

    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
         'http://quotes.toscrape.com/page/2/',
    ]

Dies ist in Ordnung, ohne dass Sie sich die Mühe machen müssen, die Methode "start_requests" zu definieren

Versuchen Sie schließlich, die Daten zu extrahieren

Das Tutorial sagt: "Um zu erfahren, wie sich Scrapy tatsächlich herauszieht, verwenden Sie die" Scrapy Shell "."

Ich werde es sofort versuchen

[vagrant@localhost tutorial]$ scrapy shell 'http://quotes.toscrape.com/page/1/'

...Unterlassung...

2017-04-16 04:36:51 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x7fbb13dd0080>
[s]   item       {}
[s]   request    <GET http://quotes.toscrape.com/page/1/>
[s]   response   <200 http://quotes.toscrape.com/page/1/>
[s]   settings   <scrapy.settings.Settings object at 0x7fbb129308d0>
[s]   spider     <DefaultSpider 'default' at 0x7fbb11f14828>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser

Extrahieren Sie zuerst die Elemente mit CSS und sehen Sie

>>> response.css('title')
[<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]

Oh, es scheint, dass so etwas wie ein Titelelement extrahiert werden kann.

Diese reponse.css (xxx) gibt eine XML mit dem Namen [SelectorList] zurück (https://docs.scrapy.org/en/latest/topics/selectors.html#scrapy.selector.SelectorList). Oder ein Objekt, das HTML umschließt. Also werde ich mehr Daten von hier extrahieren. Das kann man auch sagen. Extrahieren Sie den Text des Titels als Testversion.

>>> response.css('title::text').extract()
['Quotes to Scrape']