Je voudrais utiliser ** Scrapy **, un framework d'exploration et de scraping pour Python, pour récupérer de manière récursive le titre et l'URL d'une page Web et le sortir au format csv. (Est-ce une image qui répertorie des éléments tels que des plans de site?) ※ Image complète result.csv
URL | Titre |
---|---|
http://www.example.com |
Haut |
http://www.example.com/news |
nouvelles |
http://www.example.com/news/2015 |
Actualités 2015 |
… | … |
Quant à Python, la série 2.7 est installée en standard sur CentOS 7, alors utilisez-la.
Introduisez Scrapy à partir de pip à l'aide de la commande suivante.
$ sudo pip install Scrapy
Créez un projet pour Scrapy à l'aide de la commande suivante.
$ scrapy startproject HelloScrapy
Je pense que le contenu du projet créé est le suivant.
Parmi ceux-ci, les fichiers suivants sont utilisés cette fois.
Scrapy utilise également une classe appelée ** Spider ** pour définir comment explorer et gratter le site cible. Pour définir ce Spider, créez un fichier appelé "hellospider.py" dans le répertoire spiders ci-dessus.
Jusqu'à présent, la structure du projet est la suivante.
items.py Tout d'abord, modifiez items.py. Cette fois, nous obtiendrons le titre et l'URL de la page Web, définissez donc la classe suivante.
items.py
from scrapy.item import Item, Field
class PageInfoItem(Item):
URL = Field()
title = Field()
pass
settings.py Ensuite, modifiez settings.py. J'ai ajouté les options suivantes:
settings.py
DOWNLOAD_DELAY = 3
ROBOTSTXT_OBEY = True
DEPTH_LIMIT = 5
L'intention du paramètre ci-dessus est que je voulais définir un intervalle d'exploration d'environ 3 secondes afin de ne pas charger le serveur de l'autre partie et de rechercher selon le fichier robots.txt. (Il semble qu'un ajustement automatique par AutoThrottle soit également possible, donc si vous voulez en savoir plus, veuillez consulter le document officiel) De plus, si l'exploration est trop profonde, cela prendra du temps, nous avons donc fixé une limite cette fois.
hellospider.py Enfin, définissez votre propre Spider pour votre hellospider préféré.
hellospider.py
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.selector import Selector
from HelloScrapy.items import PageInfoItem
class HelloSpider(CrawlSpider):
#Identifiant lors de l'exécution de scrapy à partir de la CLI
name = 'hello'
#Domaines qui permettent aux araignées d'explorer
allowed_domains = ["www.example.com"]
#Point de départ(Commencer l'exploration)URL
start_urls = ["http://www.example.com"]
#Règle spécifique avec l'argument LinkExtractor(Par exemple, ne grattez que les pages qui incluent des nouveautés dans l'URL)Peut être spécifié, mais cette fois il n'y a pas d'argument car il cible toutes les pages
#Lorsque vous téléchargez une page qui correspond à la règle, la fonction spécifiée dans le rappel est appelée.
#Si follow est défini sur True, la recherche sera effectuée de manière récursive.
rules = [Rule(LinkExtractor(), callback='parse_pageinfo', follow=True)]
def parse_pageinfo(self, response):
sel = Selector(response)
item = PageInfoItem()
item['URL'] = response.url
#Spécifiez la partie de la page à gratter
#En plus de spécifier au format xPath, il est également possible de spécifier au format CSS
item['title'] = sel.xpath('/html/head/title/text()').extract()
return item
terminé.
Après cela, si vous exécutez la commande suivante, crawl & scrape sera exécuté de manière récursive à partir de l'URL de point de départ spécifiée, et le résultat sera affiché sous forme de csv.
$ scrapy crawl hello -o result.csv
(Notez que l'argument n'est pas hellospider.py, mais l'identifiant qui y est défini)
En passant, le résultat peut également être sorti au format json ou xml. Je l'ai essayé sur mon propre site Web, mais je pense qu'il peut être sorti en fonction de l'image terminée.
** * Si vous l'exécutez pour un site Web sur Internet, veuillez le faire à vos propres risques. ** **
référence: http://doc.scrapy.org/en/latest/ http://orangain.hatenablog.com/entry/scrapy http://akiniwa.hatenablog.jp/entry/2013/04/15/001411
Recommended Posts