python super débutant essaie de gratter

Qu'est-ce que le grattage?

Lorsque vous dites le mot «grattage», il y a à peu près deux choses, «ramper» et «gratter». J'étais confus, alors je vais régler le problème une fois.

Ainsi, par exemple, de la page de la Fédération Shogi, je vais extraire le titre de mon jeu d'échecs préféré. Toka est une traduction de «grattage».

scrapy

Essayons de le gratter. Quand j'y pense, je n'ai utilisé que PHP jusqu'à présent, donc J'ai essayé d'extraire les informations que je voulais de la page en utilisant Goutte et ainsi de suite.

Donc, j'ai appris que Python, que j'ai récemment introduit, a une bibliothèque (framework?) Appelée Scrapy, ce qui rend le scraping très facile.

Donc, cette fois, je vais utiliser cela pour collecter des informations sur mes échecs préférés sur la page de la Fédération Shogi.

Installation

$ pip install scrapy

Achevée

Didacticiel

Eh bien, je suis un super débutant qui ne comprend vraiment pas du tout Python, je vais donc essayer le tutoriel étape par étape pour en avoir une idée.

Il y avait un coin tutoriel dans la documentation. https://docs.scrapy.org/en/latest/intro/tutorial.html

C'est de l'anglais, mais c'est tout à fait vrai.

L'ordre de travail décrit dans le tutoriel

  1. Créez un nouveau projet Scrapy
  2. Écrivez une araignée pour explorer votre site et extraire les données dont vous avez besoin
  3. Sortez les informations extraites de la ligne de commande
  4. Changeons d'araignée pour suivre le lien (je ne comprenais pas l'anglais)
  5. Utilisons des arguments d'araignée

J'aimerais faire quelque chose dans cet ordre.

1. Créez un nouveau projet Scrapy

scrapy startproject tutorial

Cela semble être bon.

[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
Total 0
drwxr-xr-x 3 vagabonds vagabonds 38 16 avril 04:15 tutorial

Un répertoire appelé tutoriel a été créé!

Donc, il y a plusieurs choses là-dedans, mais selon le document, chaque fichier a les rôles suivants.

tutorial/
    scrapy.cfg            #Fichier de configuration de déploiement

    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

Je n'ai rien compris d'autre que le fichier de configuration du déploiement lol

2. Écrivez une araignée pour explorer votre site et extraire les données dont vous avez besoin

Créez un fichier appelé quotes_spider.py sous tutorial / spides / et créez-le car il y a quelque chose à copier et coller.

[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. Sortez les informations extraites de la ligne de commande

scrapy crawl quotes

Il semble que vous puissiez y aller.

Après que quelque chose soit sorti, quotes-1.html et quotes-2.html ont été créés.

[vagrant@localhost tutorial]$ ll
32 au total
-rw-rw-r--1 vagabond vagabond 11053 16 avril 04:27 quotes-1.html
-rw-rw-r--1 vagabond errant 13734 16 avril 04:27 quotes-2.html
-rw-r--r--1 vagabond vagabond 260 16 avril 04:15 scrapy.cfg
drwxr-xr-x 4 vagabonds vagabonds 129 16 avril 04:15 tutorial

J'ai écrit ici "Sortons les informations extraites de la ligne de commande", En fait, quand j'ai regardé le contenu de la méthode d'analyse, je faisais juste quelque chose comme ↓

La méthode start_requests est facile à écrire

Après tout, cette méthode ne retourne que l'objet de scrapy.Request à la fin, mais il semble que cela puisse être réalisé en écrivant simplement start_urls.

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

C'est OK sans avoir à se soucier de définir la méthode start_requests

Essayez enfin d'extraire les données

Le didacticiel dit: "Pour savoir comment la scrapy se retire, utilisez la" coquille de scrapy "."

Je vais l'essayer immédiatement

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

...Omission...

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

Tout d'abord, extrayez les éléments en utilisant css et voyez

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

Oh, il semble que quelque chose comme un élément de titre puisse être extrait.

Lorsque cette reponse.css (xxx) est terminée, le XML appelé SelectorList est renvoyé. Ou un objet qui enveloppe le HTML. Donc, je vais extraire plus de données d'ici. Vous pouvez aussi le dire. Extrayez le texte du titre à titre d'essai.

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