Scraping de sites Web à l'aide de JavaScript en Python

Aperçu

J'ai utilisé Python pour gratter un site qui crée un DOM avec JavaScript, alors notez la procédure.

En gros, j'ai fait une combinaison de Scrapy et Selenium.

Scrapy

Scrapy est un framework pour implémenter des robots d'exploration.

Implémentez le robot en tant que classe qui satisfait l'interface déterminée par le framework, comme le robot en tant que sous-classe de * Spider *, les informations récupérées en tant que sous-classe de * Item * et le traitement des informations récupérées en tant que sous-classe de * Pipeline *.

Une commande appelée * scrapy * est fournie qui vous permet de voir une liste de vos robots d'exploration et de les lancer.

Selenium

Selenium est un outil (est-ce que ça va?) Pour contrôler le navigateur par programmation. Il peut être utilisé dans divers langages, y compris Python. Il apparaît souvent dans le contexte des tests automatisés des sites Web / applications. Vous pouvez l'utiliser pour exécuter JavaScript et extraire des sources HTML, y compris un DOM généré dynamiquement.

À l'origine, il semblait contrôler le navigateur via JavaScript, mais maintenant il envoie un message directement au navigateur pour contrôler le navigateur.

Lorsque je l'ai essayé dans mon environnement (OSX), je ne pouvais pas l'utiliser dans Safari et Chrome sans installer quelque chose comme une extension. Vous pouvez l'utiliser tel quel avec Firefox. Si vous incluez PhantomJS, vous pouvez gratter sans fenêtre, afin de pouvoir l'utiliser sur le serveur.

Pourquoi utiliser Scrapy

Vous pouvez gratter avec du sélénium seul sans utiliser Scrapy,

Le mérite d'utiliser Scrapy qui me vient à l'esprit est le suivant.

Au début, étudier le framework était un problème, j'ai donc implémenté le robot uniquement avec Selenium et PyQuery, mais si j'écrivais des journaux et la gestion des erreurs , La sensation de réinvention de la roue est devenue plus forte et je me suis arrêté.

Avant l'implémentation, j'ai lu Scrapy Documentation depuis le début jusqu'à la page Paramètres, et autour de * Présentation de l'architecture * et * Downloader Middleware *.

Utilisez Scrapy et Selenium en combinaison

L'histoire originale est ce débordement de pile.

L'architecture de Scrapy ressemble à ceci (extrait de la documentation de Scrapy).

Scrapy architecture overview

Personnalisez * les middlewares de téléchargement * pour permettre à Scrapy's Spider de gratter avec Selenium.

Implémentation du middleware de téléchargement

Downloader Middleware est implémenté comme une classe ordinaire qui implémente * process_request *.

selenium_middleware.py


# -*- coding: utf-8 -*-
import os.path

from urlparse import urlparse

import arrow

from scrapy.http import HtmlResponse
from selenium.webdriver import Firefox


driver = Firefox()


class SeleniumMiddleware(object):
    
    def process_request(self, request, spider):
        
        driver.get(request.url)

        return HtmlResponse(driver.current_url,
            body = driver.page_source,
            encoding = 'utf-8',
            request = request)


def close_driver():
    driver.close()

Si vous enregistrez ce middleware de téléchargement, * Spider * appellera * process_request * avant de gratter la page. Pour plus d'informations, cliquez ici (http://doc.scrapy.org/en/1.0/topics/downloader-middleware.html).

Puisqu'il renvoie une instance de * HtmlResponse *, Download Middleware ne sera pas appelé après cela. En fonction du paramètre de priorité, Default Donwload Middleware (comme l'analyse du fichier robots.txt) Notez qu'il ne sera pas appelé.

Ci-dessus, j'utilise Firefox, mais si je veux utiliser PhantomJS, réécrivez la variable * driver *.

Télécharger l'enregistrement du middleware

Enregistrez * Selenium Middleware * dans la classe * Spider * que vous souhaitez utiliser.

some_spider.py


# -*- coding: utf-8 -*-
import scrapy

from ..selenium_middleware import close_driver


class SomeSpider(scrapy.Spider):
    name = "some_spider"
    allowed_domains = ["somedomain"]
    start_urls = (
        'http://somedomain/',
    )
    custom_settings = {
        "DOWNLOADER_MIDDLEWARES": {
            "some_crawler.selenium_middleware.SeleniumMiddleware": 0,
        },
        "DOWNLOAD_DELAY": 0.5,
    }
    

    def parse(self, response):
        #Traitement du robot d'exploration

    def closed(self, reason):
        close_driver()

Recommended Posts

Scraping de sites Web à l'aide de JavaScript en Python
Scraping à l'aide de Python
[Python] Gratter une table avec Beautiful Soup
Dessinez une structure arborescente en Python 3 à l'aide de graphviz
Créer un fichier GIF en utilisant Pillow en Python
Afficher les avis sur les médicaments à l'aide de listes en Python
Créez un fichier MIDI en Python en utilisant pretty_midi
Scraping à l'aide de Python 3.5 async / await
Prendre une capture d'écran en Python
Créer un bot de collecte de données en Python à l'aide de Selenium
Grattage au sélénium en Python
Créer une fonction en Python
Créer un dictionnaire en Python
[Python] Scraping dans AWS Lambda
Grattage avec chromedriver en python
Connectez-vous au site Web en Python
Scraping à l'aide de la syntaxe Python 3.5 Async
Surveillance des changements de site Web à l'aide de python
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Créer un bookmarklet en Python
Web scraping avec Selenium (Python)
Dessinez un cœur en Python
Comment exécuter une commande à l'aide d'un sous-processus en Python
Traduit à l'aide de googletrans en Python
Utilisation du mode Python dans le traitement
J'ai créé un lecteur de flux rapide en utilisant feedparser en Python
Une note lors de la création d'un graphe dirigé à l'aide de Graphviz en Python
Pour renvoyer char * dans une fonction de rappel à l'aide de ctypes en Python
Essayez de créer un réseau de neurones en Python sans utiliser de bibliothèque
Un mémo que j'ai écrit une fonction de base en Python en utilisant la récurrence
J'ai fait un chronomètre en utilisant tkinter avec python
Essayez d'exécuter une fonction écrite en Python à l'aide de Fn Project
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
Ecrire une dichotomie en Python
Programmation GUI en Python avec Appjar
[python] Gérer les fonctions dans une liste
Appuyez sur une commande en Python (Windows)
J'ai fait un Line-bot avec Python!
Créer une interface graphique python à l'aide de tkinter
Créer un conteneur DI avec Python
Dessiner une courbe Silverstone en utilisant Python
Dessinez une matrice de diagramme de dispersion avec python
ABC166 en Python A ~ C problème
Ecrire des algorithmes A * (A-star) en Python
Essayez d'utiliser LevelDB avec Python (plyvel)
Créer un fichier binaire en Python
Utilisation de variables globales dans les fonctions python
Résoudre ABC036 A ~ C avec Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Voyons voir l'utilisation de l'entrée en python
Puissance totale en Python (en utilisant functools)
[Python] Mémo de création de l'outil de grattage
Implémentation d'un algorithme simple en Python 2