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.
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
Installation de scrapy
Scrapy Installer scrapy dans l'environnement python anaconda
Prière de se référer à.
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.
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.
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
.
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@href
Fait 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.txt
Le 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.//div Puis 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/ul Spécifiez ensuite le nœud sur la troisième ligne.//div/a/span Puis 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/@href Extrait 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