[PYTHON] Obtenez le titre et l'URL du site Web de manière récursive avec Scrapy

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

environnement

Introduction de Scrapy

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éation de projet

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. Scrapy_skeleton_half.png

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. Scrapy_skeleton2_half.png

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é.

Courir

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

Obtenez le titre et l'URL du site Web de manière récursive avec Scrapy
Obtenir la date et l'heure au format spécifié
Obtenir les informations de localisation actuelles et l'agent utilisateur en Python
Obtenez les cours des actions et créez des graphiques en bougies avec Python
Recherche récursive de fichiers et de répertoires en Python et sortie
Obtenez l'ID utilisateur et le nom d'écran du participant dans Slack
Modifier le répertoire de stockage de fichiers statiques et l'URL dans Flask
Comment obtenir des histogrammes RVB et HSV avec OpenCV
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.