[PYTHON] Grattage avec coquille tremblante

introduction

scrapy a un mode shell qui vous permet de gratter de manière interactive. Lorsqu'il est utilisé en combinaison avec chrome, il est relativement facile de gratter une page Web. Ceci est utile pour considérer quel type de xpath écrire avant d'écrire un programme.

Obtenez XPath

Pour scrapy, spécifiez les données que vous souhaitez récupérer dans la page Web avec XPath. Il n'est pas difficile d'écrire votre propre XPath sur une page qui connaît la structure du HTML, mais il est difficile d'écrire le XPath des données que vous souhaitez récupérer sur une page que vous n'avez pas créée. C'est là que le chrome entre en jeu.

Par exemple, supposons que vous souhaitiez extraire le titre et le lien de chaque dessin animé de la page http: // toyokeizai.net / category / diary ''. Ouvrez cette page dans chrome, faites un clic droit sur le titre supérieur "Les ingénieurs ne peuvent pas revenir sur Premium Friday" et sélectionnez "inspecter" dans le menu. Les outils de développement s'ouvriront comme indiqué dans la figure ci-dessous et la balise correspondante sera sélectionnée. ![Capture d'écran 16/03/2017 à 9h48,18.png](https://qiita-image-store.s3.amazonaws.com/0/38304/d4cdab3b-57f8-93f2-473d-a1e100416e2e.png) Faites un clic droit sur la balise <span> et sélectionnez "Copier" → "Copier XPath" dans le menu pour copier le xpath de cette balise` `` `dans le presse-papiers. .. Dans cet exemple, XPath est

//*[@id="latest-items"]/div/ul/li[1]/div[2]/a/span[2]

est. De cette façon, vous pouvez facilement obtenir le XPath avec juste chrome. Veuillez consulter les sites suivants pour XPath.

Chemin de l'emplacement TECHSCORE XML Path Language (XPath) Version 1.0

Grattage avec Scrapy Shell

Installation de scrapy

Scrapy Installer scrapy dans l'environnement python anaconda

Prière de se référer à.

Charger une page Web avec scrapy shell

Commencez par lancer la coquille tremblante.

$ 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]:

Ensuite, chargez la page Web avec la commande `` 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)

Vous pouvez également spécifier l'URL lors du démarrage de scrapy shell et tout charger en même temps.

$ scrapy shell http://toyokeizai.net/category/diary

La page chargée est stockée dans l'objet response```. Le chargement ou non de la page cible est

In [3]: view(response)
Out[3]: True

Vous pouvez vérifier avec des commandes telles que. Utilisez la commande view () pour afficher la page Web chargée par votre navigateur par défaut.

Extraction des données cibles

Récupérons maintenant les données souhaitées. XPath utilise celui ci-dessus.

In [4]: response.xpath('//*[@id="latest-items"]/div/ul/li[1]/div[2]/a/span[2]/text()').extract()
Out[4]: ['Les ingénieurs ne peuvent pas rentrer chez eux le vendredi premium']

Vous avez maintenant le titre. Le text () '' ajouté au XPath copié dans chrome récupère tous les nœuds de texte enfants du nœud sélectionné. En outre, extract () extrait les données texte du nœud. Le résultat est renvoyé sous forme de tableau.

Extraire tous les titres

Ensuite, récupérez tous les titres des dessins animés répertoriés sur la page. Le HTML correspondant au XPath utilisé jusqu'à présent est

Le HTML de cette partie est

<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">Sera incorporé comme temps de travail</span><br>
            <span class="column-main-ttl">Les ingénieurs ne peuvent pas rentrer chez eux le vendredi premium</span>
            <span class="date">12 mars 2017</span>
            <span class="summary">A partir du 24 février, il y aura un vendredi "Premium Friday" où vous pourrez quitter le bureau une fois par mois ...</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>

La structure est la suivante, et les informations d'un dessin animé sont contenues dans

  • … </ li> . Le XPath utilisé plus tôt

    //*[@id="latest-items"]/div/ul/li[1]/div[2]/a/span[2]
    

    `li [1]` fait référence au premier `<li class =" clearfix "> ... </ li>` , donc si vous ne spécifiez pas cet ordre, tous Vous pouvez spécifier <li class = "clearfix">… </ li>. Autrement dit, XPath est

    //*[@id="latest-items"]/div/ul/li/div[2]/a/span[2]
    

    Fais juste. Je vais vraiment l'essayer.

    In [5]: response.xpath('//*[@id="latest-items"]/div/ul/li/div[2]/a/span[2]/text()').extract()
    Out[5]:
    ['Les ingénieurs ne peuvent pas rentrer chez eux le vendredi premium',
     'Si vous ne pouvez pas battre la machine, devenez une machine!',
     'Les données dans le cloud peuvent disparaître!',
     'Quel est le nombre étonnamment élevé de motifs sans papier?',
     'Malheureusement les points communs des ingénieurs masculins impopulaires',
     'Ce que vous devez faire lorsque vous remettez en question le travail de programmation avancé',
     'Le Nouvel An 2017 a duré une seconde de plus que d'habitude',
     'La dernière situation du calendrier de l'avent de l'ingénieur',
     'Il y a des "ennemis inattendus" dans le cloud Amazon',
     'Quand le système Mizuho Bank sera-t-il terminé?',
     'Vous souvenez-vous du nostalgique "Konami Command"?',
     '"DV" a une signification différente dans la zone ingénieur',
     'Incroyable évolution du jeu au cours des 40 dernières années',
     '"Pièges" cachés dans la longue programmation de la nuit d'automne',
     'Les anciens ingénieurs Sony sont populaires au travail']
    

    J'ai tous les titres. Si vous comparez le HTML et XPath ci-dessus, la balise de titre```Il semble que vous puissiez simplement spécifier directement, mais cette page est

     <div id = "ranking-items" style = "display: none;"> <! - Par ordre de popularité->
      <div class="article-list ranking category">
        <ul class="ranked business">
          <li class="clearfix">
           ...
     <div id = "latest-items"> <! - Dernière commande->
      <div class="article-list">
        <ul class="business">
          <li class="clearfix">
    

    La structure est presque la même que la dernière commande sous l'ordre de popularité, donc si vous ne faites pas attention, des données supplémentaires seront mélangées. Quand je l'essaye,

    In [6]: response.xpath('//span[@class="column-main-ttl"]/text()').extract()
    Out[6]:
     ['Les ingénieurs ne jouent pas avec Pokemon GO! ',
     "Quand le système de la Mizuho Bank sera-t-il achevé?",
     `` Tristesse commune d'ingénieurs masculins impopulaires '',
     `` Les ingénieurs ne peuvent pas rentrer chez eux le vendredi premium '',
     «Des étudiants qui ne connaissent plus les ordinateurs de bureau! ',
     «Pourquoi les anciens ingénieurs de Sony sont populaires au travail»,
     «Les données du cloud peuvent disparaître! ',
     "Pourquoi je n'envie pas Yahoo 3 jours par semaine",
     "La mémoire du premier ordinateur que j'ai acheté est vivante",
     «Quel est le langage de programmation le plus rentable»,
     "Qui est attiré par" Famicom Mini "?",
     «La programmation est devenue une leçon très populaire! ',
     "Les voitures autonomes" ne fonctionnent pas automatiquement ",
     "La vérité sur les mêmes vêtements des filles ingénieur et sur les soupçons",
     "Les nouveaux employés apprendront les bases en" créant des minutes "",
     `` Les ingénieurs ne peuvent pas rentrer chez eux le vendredi premium '',
     «Si vous ne pouvez pas battre la machine, devenez une machine! ',
     «Les données du cloud peuvent disparaître! ',
     «Quel est le nombre étonnamment élevé de motifs sans papier? ',
     `` Tristesse commune d'ingénieurs masculins impopulaires '',
     «Ce que vous devez faire lorsque vous remettez en question le travail de programmation avancé»,
     `` Le jour de l'an 2017 a duré une seconde de plus que d'habitude '',
     'La dernière situation du calendrier de l'avent de l'ingénieur',
     "Il y a des" ennemis inattendus "dans le cloud Amazon",
     "Quand le système de la Mizuho Bank sera-t-il achevé?",
     "Vous souvenez-vous du nostalgique" Konami Command "?",
     "Dans la zone ingénieur," DV "a une signification différente",
     'Incroyable évolution du jeu au cours des 40 dernières années',
     "Les" pièges "cachés dans les longues soirées d'automne",
     «Pourquoi les anciens ingénieurs Sony sont-ils populaires au travail»]
    

    Les mêmes données que celles prises deux fois. Autrement dit, XPath doit pointer uniquement vers les données dont il a besoin.

    ##Extraire le lien L'URL du lien vers la page du manga se trouve dans le titre du HTML.<span>Balise parent<a>Il est écrit dans le href de. Le XPath pointant vers ceci ressemble à ceci:

    //*[@id="latest-items"]/div/ul/li/div[2]/a/@href
    

    Dernier@hrefFait référence à l'attribut href de la balise a. Cette fois, je veux extraire la valeur d'attribut de la balise a au lieu du nœud de texte de l'enfant de la balise a, donc je fais comme ci-dessus. Quand tu bouges ça

    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']
    

    Ce sera. Maintenant que vous avez un XPath pour obtenir le titre et le lien de chaque dessin animé, vous pouvez récupérer les informations nécessaires en créant un programme de grattage basé sur cela.

    ##Exporter les données acquises Si vous ne grattez qu'une seule fois, vous pouvez générer les données requises telles quelles. Tout d'abord, enregistrez les données récupérées dans une variable, puis exportez-les dans un fichier.

    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()
    

    avec çabohebohe.txtLe résultat du grattage a été écrit dans le fichier.

    $ cat bohebohe.txt
     Les ingénieurs ne peuvent pas rentrer chez eux le vendredi premium, / articles / - / 161892
     Si vous ne pouvez pas battre la machine, devenez une machine! , / articles / - / 159846
     Les données dans le cloud peuvent disparaître! , / articles / - / 157777
     Quel est le nombre étonnamment élevé de motifs sans papier? , / articles / - / 153378
     Malheureusement les points communs des ingénieurs masculins impopulaires, / articles / - / 1533767
     Ce que vous devez faire pour vous attaquer au travail de programmation avancée, / articles / - / 152301
     La nouvelle année 2017 a duré une seconde de plus que d'habitude, / articles / - / 152167
     Dernières circonstances du calendrier de l'Avent de l'ingénieur, / articles / - / 149922
     Il y a des "ennemis inattendus" dans le cloud Amazon, / articles / - / 149911
     Quand le système Mizuho Bank sera-t-il terminé, / articles / - / 146637
     Vous souvenez-vous du nostalgique "Konami Command", / articles / - / 146559
     "DV" a une signification différente dans la communauté des ingénieurs, / articles / - / 144778
     Incroyable évolution du jeu au cours des 40 dernières années, / articles / - / 144756
     "Pièges" dans la longue programmation de la nuit d'automne, / articles / - / 142415
     L'ancien ingénieur Sony est populaire au travail, / articles / - / 142342
    

    #en conclusion

    C'est un peu compliqué de déboguer un XPath qui spécifie des données lors de la création d'un programme, et parfois c'est un gaspillage d'écrire un programme pour quelque chose que vous n'utilisez qu'une seule fois. Dans un tel cas, le scrapy shell, qui vous permet d'expérimenter de manière interactive et d'exécuter le script python tel quel, est assez pratique, et il est utile pour diverses expériences telles que vouloir simplement extraire un peu de données de la page créée dans le passé.

    #Bonus XPath Je vais expliquer brièvement le XPath utilisé dans cet article. Comme exemple de 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"> Incorporé comme temps de travail </ span> <br>
     8: <span class = "column-main-ttl"> Les ingénieurs ne peuvent pas rentrer chez eux le vendredi Premium </ span>
     9: <span class = "date"> 12 mars 2017 </ span>
    11:          </a>
    12:        </div>
    13:      </li>
    14:    </ul>
    15:  </div>
    16:</div>
    

    Est utilisé.

    XPath une fonction
    //e Tous les nœuds qui correspondent au chemin enraciné dans la balise e.//divPuis tous les nœuds commençant par la balise div (1), 2,5ème ligne) est supprimée.
    //e1/e2 Tous les nœuds dont la balise e1 et ses éléments enfants correspondent à la balise e2.//dev/ulSpécifiez ensuite le nœud sur la troisième ligne.//div/a/spanPuis 7, 8,Sortez la 9ème ligne.
    //e1/e2[1] Le premier nœud de l'élément enfant e2 de la balise e1.//li/div/a/span[1]Sort la 7ème ligne
    //e[@name="value"] Un nœud avec la balise e dont le nom d'attribut est value.//div@[@class="article-list"]Sort la deuxième ligne
    @name Récupère l'attribut de nom du nœud sélectionné.//div/a/@hrefExtrait la valeur de href sur la 6ème ligne
    text() Extrait les nœuds de texte de tous les éléments enfants du nœud sélectionné

    Recommended Posts

    Grattage avec coquille tremblante
    Grattage festif avec Python, scrapy
    Grattage Web facile avec Scrapy
    Grattage au sélénium
    Grattage au sélénium ~ 2 ~
    Grattage avec Python
    Grattage avec Python
    Grattage avec du sélénium
    Redémarrez avec Scrapy
    Grattage réussi avec Selenium
    Grattage en Python (préparation)
    Essayez de gratter avec Python.
    Grattage sans serveur régulier avec AWS lambda + scrapy Part 1.8
    Grattage avec Python + PhantomJS
    Problèmes lors de l'installation de Scrapy
    Grattage avec du sélénium [Python]
    Scraping avec Python + PyQuery
    Gratter avec une belle soupe
    Scraping RSS avec Python
    J'ai essayé de gratter avec Python
    Télécharger automatiquement des images avec grattage
    Web scraping avec python + JupyterLab
    Grattage avec Selenium + Python Partie 1
    Grattage avec chromedriver en python
    Essayez de programmer avec un shell!
    Enregistrez des images avec le web scraping
    Grattage avec du sélénium en Python
    Grattage avec Tor en Python
    Scraping prévisions météorologiques avec python
    Gratter la moyenne du Nikkei avec le dramaturge-python
    Grattage avec Selenium + Python Partie 2
    J'ai essayé de gratter avec du python
    Web scraping débutant avec python
    Gratter la page i-town avec du sélénium
    Grattage de table avec belle soupe
    recharger dans le shell django avec ipython
    Essayez de gratter avec Python + Beautiful Soup
    Racler plusieurs pages avec Beautiful Soup
    Scraping avec Node, Ruby et Python
    Scraping avec Selenium en Python (Basic)
    Grattage WEB avec BeautifulSoup4 (page en couches)
    Grattage avec Python, Selenium et Chromedriver
    Gratter le classement Web d'Alexa avec pyQuery
    Web scraping avec Python Première étape
    J'ai essayé webScraping avec python.
    Grattage avec Python et belle soupe
    Collectionne les paroles d'Anison avec Scrapy
    Gratter avec une belle soupe en 10 minutes
    Comment démarrer avec Scrapy
    Faisons du scraping d'images avec Python
    Grattage sans serveur régulier avec AWS lambda + scrapy, partie 1
    Obtenez les tendances Qiita avec le scraping Python
    Automatisez la construction d'environnement avec ShellScript
    Créer un exe Scrapy avec Pyinstaller
    Mémo d'apprentissage "Scraping & Machine Learning avec Python"
    Grattage de site Web avec Beautiful Soup en Python
    Grattage 1
    Obtenez des informations météorologiques avec Python et le grattage
    Obtenez des informations sur la propriété en grattant avec python