Nous avons décrit de manière facile à comprendre comment exécuter Scrapy, un framework qui permet le scraping Web. Je suis heureux que vous puissiez l'utiliser comme référence.
référence: Python --Créez un robot d'exploration à l'aide de Scrapy https://qiita.com/naka-j/items/4b2136b7b5a4e2432da8
Temps requis 15 minutes Contenu
Exécutez le pip suivant sur le terminal pour installer scrapy
pip install scrapy
Accédez ensuite au répertoire dans lequel vous souhaitez créer le projet scrapy et procédez comme suit
scrapy startproject sake
Après cela, je vais gratter le site Web lié au saké, j'ai donc changé le nom du projet en "saké". Ensuite, les dossiers suivants seront configurés sous le répertoire courant.
Le scraping Web n'est pas possible avec le fichier ci-dessus seul, alors entrez la commande suivante et entrez la commande suivante Créez des fichiers dans le répertoire spiders.
#scrapy genspider <nom de fichier> <URL Web que vous souhaitez extraire>
scrapy genspider scrapy_sake https://www.saketime.jp/ranking/
Ensuite, vous pouvez voir qu'un fichier appelé "scrapy_sake.py" est créé dans le répertoire spiders. Le contenu du fichier créé est le suivant.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
pass
Comme je l'expliquerai en détail plus tard, je coderai principalement cette partie "def parse". Avant de coder, assurez-vous que vous pouvez obtenir les informations Web avec précision. Ajoutez une instruction d'impression à la partie "def parse" pour voir les informations acquises.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
allowed_domains = ['https://www.saketime.jp/ranking/']
start_urls = ['http://https://www.saketime.jp/ranking/']
def parse(self, response):
#Supprimer le pass et ajouter un relevé d'impression
print(response)
Et si vous exécutez la commande suivante, une grande partie de la sortie sera renvoyée, mais vous pouvez confirmer que vous pouvez y intégrer fermement le HTML.
Commande d'exécution
#scrapy crawl <nom de fichier>
scrapy crawl scrapy_sake
Production
<li class="brand_review clearfix">
<div>
<p>
Iso's pride, livre spécial brassé saké cru
Cliquez ici pour le saké d'aujourd'hui, le saké cru brassé spécial Honjo dont Iso est fier!
Riz... <br>
<span class="brand_review_user">
by
<span>poursuivre en justice</span>
<span>
<span class="review-star">★</span>
<span>4.5</span>
</span>
<span class="reviewtime">
<span>23 mars 2020</span>
</span>
</span>
</p>
</div>
</li>
</ul>
</a>
</div>
:
:
:
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2020, 4, 9, 3, 23, 24, 461847)}
2020-04-09 12:23:26 [scrapy.core.engine] INFO: Spider closed (finished)
Ensuite, extrayons uniquement les informations nécessaires d'ici!
En gros, il n'y a que deux fichiers implémentés par scrapy:
Commençons par modifier à partir de item.py. Lorsque vous l'ouvrez pour la première fois, il ressemblera au fichier ci-dessous.
sake/items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
pass
Enregistrez arbitrairement les informations que vous souhaitez obtenir avec scrapy dans cette partie de classe.
sake/items.py
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy
class SakeItem(scrapy.Item):
#Nom de l'information que vous souhaitez obtenir(Tout) = scrapy.Field()
prefecture_maker = scrapy.Field()
prefecture = scrapy.Field()
maker = scrapy.Field()
brand = scrapy.Field()
pass
C'est la fin de la description de items.py. Ensuite, passons au codage scrapy_sake.py.
Le formulaire rempli est le suivant. Je pense que l'intérieur de def parse () est plus riche que celui vu au chapitre 2 ci-dessus.
sake/sake/spiders/scrapy_sake.py
# -*- coding: utf-8 -*-
import scrapy
#items.N'oubliez pas d'importer py
from sake.items import SakeItem
class ScrapySakeSpider(scrapy.Spider):
name = 'scrapy_sake'
#allowed_domains = ['ja.wikipedia.org']
start_urls = ['https://www.saketime.jp/ranking/']
def parse(self, response):
items = []
#tag html li.Les informations sur le saké japonais étaient stockées dans un endroit appelé clearfix.
sakes = response.css("li.clearfix")
#Plusieurs li dans la page.Regardons chaque clearfix
for sake in sakes:
#item.Déclarer un objet SakeItem défini dans py
item = SakeItem()
item["prefecture_maker"] = sake.css("div.col-center p.brand_info::text").extract_first()
#<div class="headline clearfix">Dans le cas d'une description comme,headline.Entre les deux comme clearfix.Mettre
item["brand"] = sake.css("div.headline.clearfix h2 a span::text").extract_first()
#Nettoyer les données acquises
if (item["prefecture_maker"] is not None) or (item["brand"] is not None):
#Supprimer \ n et espaces
item["prefecture_maker"] = item["prefecture_maker"].replace(' ','').replace('\n','')
#Séparation de la préfecture et du fabricant
item["prefecture"] = item["prefecture_maker"].split('|')[0]
item["maker"] = item["prefecture_maker"].split('|')[1]
items.append(item)
print(items)
#Refléter le changement de page avec un traitement récursif
#une balise rel="next"Obtenez les éléments de
next_page = response.css('a[rel="next"]::attr(href)').extract_first()
if next_page is not None:
#Convertir en chemin absolu si l'URL est un chemin relatif
next_page = response.urljoin(next_page)
#Demande de retour une fois avec yield, les sakés sont enregistrés sur la page après la demande, et l'instruction for ci-dessus est exécutée à nouveau
yield scrapy.Request(next_page, callback=self.parse)
Lorsque ceux-ci seront exécutés, ce sera comme suit.
:
:
:
2020-04-10 16:52:58 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (301) to <GET https://www.saketime.jp/ranking/page:110/> from <GET https://www.saketime.jp/ranking/page:110>
2020-04-10 16:52:59 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.saketime.jp/ranking/page:110/> (referer: https://www.saketime.jp/ranking/page:109/)
[{'brand': 'Langue d'Orochi',
'maker': 'Brasserie de saké Kiji',
'prefecture': 'Shimane',
'prefecture_maker': 'Shimane|Brasserie de saké Kiji'}, {'brand': '禱 et Minoru',
'maker': 'Fukumitsuya',
'prefecture': 'Ishikawa',
'prefecture_maker': 'Ishikawa|Fukumitsuya'}, {'brand': 'Beauté Kanazawa',
'maker': 'Fukumitsuya',
'prefecture': 'Ishikawa',
'prefecture_maker': 'Ishikawa|Fukumitsuya'}, {'brand': 'Jinkuro',
'maker': 'Brasserie de saké Kitayuki',
'prefecture': 'Niigata',
'prefecture_maker': 'Niigata|Brasserie de saké Kitayuki'}, {'brand': 'Kenroku Sakura',
'maker': 'Brasserie de saké Nakamura',
'prefecture': 'Ishikawa',
'prefecture_maker': 'Ishikawa|Brasserie de saké Nakamura'}, {'brand': 'naissance',
'maker': 'Tohoku Meijo',
'prefecture': 'Yamagata',
'prefecture_maker': 'Yamagata|Tohoku Meijo'}, {'brand': 'SUMMERGODDESS',
'maker': 'Brasserie de saké Mana Tsuru',
'prefecture': 'Fukui',
:
:
:
'scheduler/dequeued/memory': 221,
'scheduler/enqueued': 221,
'scheduler/enqueued/memory': 221,
'start_time': datetime.datetime(2020, 4, 10, 7, 51, 13, 756973)}
2020-04-10 16:53:00 [scrapy.core.engine] INFO: Spider closed (finished)
J'ai obtenu 110 pages d'informations sur le saké japonais au format JSON en 20 secondes environ. C'est pratique.
Essayez de gratter les sites qui vous intéressent pour obtenir des informations.
Bien qu'il s'agisse d'informations de base, il est possible d'afficher les informations html du site que vous souhaitez gratter avec cmd + option + i dans le cas du navigateur chrome et macOS. Vous pouvez également appuyer sur cmd + shift + c pour cliquer sur un élément du site pour voir où il représente dans le code html.
Recommended Posts