J'essaye de développer un simple grattoir Web. Je souhaite extraire du texte sans le code HTML. En fait, j'atteins cet objectif, mais j'ai vu que dans certaines pages où JavaScript est chargé, je n'obtenais pas de bons résultats.
Par exemple, si du code JavaScript ajoute du texte, je ne peux pas le voir, car lorsque j'appelle
response = urllib2.urlopen(request)
J'obtiens le texte original sans celui ajouté (car JavaScript est exécuté dans le client).
Donc, je cherche des idées pour résoudre ce problème.
python
web-scraping
python-2.x
urlopen
mocopera
la source
la source
Réponses:
EDIT 30 / Dec / 2017: Cette réponse apparaît dans les premiers résultats des recherches Google, j'ai donc décidé de la mettre à jour. La vieille réponse est toujours à la fin.
dryscape n'est plus maintenu et la bibliothèque que les développeurs de dryscape recommandent est uniquement Python 2. J'ai trouvé que l'utilisation de la bibliothèque python de Selenium avec Phantom JS en tant que pilote Web est assez rapide et facile pour faire le travail.
Une fois que vous avez installé Phantom JS , assurez-vous que le
phantomjs
binaire est disponible dans le chemin actuel:Exemple
Pour donner un exemple, j'ai créé une page d'exemple avec le code HTML suivant. ( lien ):
sans javascript il dit:
No javascript support
et avec javascript:Yay! Supports javascript
Grattage sans support JS:
Grattage avec support JS:
Vous pouvez également utiliser la bibliothèque Python dryscrape pour gratter les sites Web pilotés par JavaScript.
Grattage avec support JS:
la source
@Expenzor
Je travaille sur Windows. PhantomJS fonctionne très bien.Nous n'obtenons pas les bons résultats car tout contenu généré par JavaScript doit être rendu sur le DOM. Lorsque nous récupérons une page HTML, nous récupérons le DOM initial, non modifié par javascript.
Par conséquent, nous devons rendre le contenu javascript avant d'explorer la page.
Comme le sélénium est déjà mentionné à plusieurs reprises dans ce fil (et la lenteur avec laquelle il devient parfois a également été mentionné), je vais énumérer deux autres solutions possibles.
Solution 1: Ceci est un très bon tutoriel sur la façon d'utiliser Scrapy pour analyser le contenu généré par JavaScript et nous allons suivre exactement cela.
Ce dont nous aurons besoin:
Docker installé dans notre machine. C'est un plus par rapport aux autres solutions jusqu'à présent, car il utilise une plate-forme indépendante du système d'exploitation.
Installez Splash en suivant les instructions répertoriées pour notre système d'exploitation correspondant.
Citant de la documentation de démarrage:
Nous allons essentiellement utiliser Splash pour rendre le contenu généré par Javascript.
Exécutez le serveur Splash:
sudo docker run -p 8050:8050 scrapinghub/splash
.Installez le plugin scrapy-splash :
pip install scrapy-splash
En supposant que nous avons déjà créé un projet Scrapy (sinon, faisons-en un ), nous suivrons le guide et mettrons à jour le
settings.py
:Enfin, nous pouvons utiliser un
SplashRequest
:Solution 2: Appelons cela expérimental pour le moment (mai 2018) ...
Cette solution est pour la version 3.6 de Python uniquement (pour le moment).
Connaissez-vous le module des requêtes (enfin qui ne le sait pas)?
Maintenant, il a un petit frère qui explore le Web: requests-HTML :
Installez requests-html:
pipenv install requests-html
Faites une demande à l'url de la page:
Rendez la réponse pour obtenir les bits générés par Javascript:
Enfin, le module semble offrir des capacités de grattage .
Alternativement, nous pouvons essayer la manière bien documentée d'utiliser BeautifulSoup avec l'
r.html
objet que nous venons de rendre.la source
r.html.html
objet.Peut-être que le sélénium peut le faire.
la source
Si vous avez déjà utilisé le
Requests
module pour python auparavant, j'ai récemment découvert que le développeur avait créé un nouveau module appeléRequests-HTML
qui a maintenant également la capacité de rendre JavaScript.Vous pouvez également visiter https://html.python-requests.org/ pour en savoir plus sur ce module, ou si vous êtes uniquement intéressé par le rendu JavaScript, vous pouvez visiter https://html.python-requests.org/?#javascript -support pour apprendre directement à utiliser le module pour rendre JavaScript en utilisant Python.
Essentiellement, une fois que vous avez correctement installé le
Requests-HTML
module, l'exemple suivant, qui est affiché sur le lien ci-dessus , montre comment vous pouvez utiliser ce module pour gratter un site Web et rendre le JavaScript contenu dans le site Web:J'ai récemment appris cela à partir d'une vidéo YouTube. Cliquez ici! pour regarder la vidéo YouTube, qui montre le fonctionnement du module.
la source
Cela semble également être une bonne solution, tirée d'un excellent article de blog
la source
Il semble que les données que vous recherchez vraiment soient accessibles via une URL secondaire appelée par un javascript sur la page principale.
Bien que vous puissiez essayer d'exécuter javascript sur le serveur pour gérer cela, une approche plus simple pourrait être de charger la page à l'aide de Firefox et d'utiliser un outil comme Charles ou Firebug pour identifier exactement ce qu'est cette URL secondaire. Ensuite, vous pouvez simplement interroger cette URL directement pour les données qui vous intéressent.
la source
Le sélénium est le meilleur pour gratter le contenu JS et Ajax.
Consultez cet article pour extraire des données du Web à l'aide de Python
Ensuite, téléchargez le pilote Web Chrome.
Facile, non?
la source
Vous pouvez également exécuter du javascript à l'aide de webdriver.
ou stocker la valeur dans une variable
la source
driver.title
propriétéPersonnellement, je préfère utiliser la scrapy et le sélénium et docker les deux dans des conteneurs séparés. De cette façon, vous pouvez installer les deux avec un minimum de tracas et explorer des sites Web modernes qui contiennent presque tous du javascript sous une forme ou une autre. Voici un exemple:
Utilisez le
scrapy startproject
pour créer votre grattoir et écrire votre araignée, le squelette peut être aussi simple que ceci:La vraie magie se produit dans le middlewares.py. Remplacez deux méthodes dans le middleware du téléchargeur
__init__
etprocess_request
, de la manière suivante:N'oubliez pas d'activer cet intermédiaire en décommentant les lignes suivantes dans le fichier settings.py:
Ensuite pour l'ancrage. Créez votre à
Dockerfile
partir d'une image légère (j'utilise python Alpine ici), copiez-y le répertoire de votre projet, installez les exigences:Et enfin, rassemblez tout cela dans
docker-compose.yaml
:Courez
docker-compose up -d
. Si vous faites cela la première fois, cela prendra un certain temps pour récupérer le dernier sélénium / chrome autonome et créer votre image de grattoir.Une fois que c'est fait, vous pouvez vérifier que vos conteneurs fonctionnent avec
docker ps
et également vérifier que le nom du conteneur de sélénium correspond à celui de la variable d'environnement que nous avons passée à notre conteneur de racleur (ici, c'était le casSELENIUM_LOCATION=samplecrawler_selenium_1
).Entrez votre conteneur de grattoir avec
docker exec -ti YOUR_CONTAINER_NAME sh
, la commande pour moi étaitdocker exec -ti samplecrawler_my_scraper_1 sh
, cd dans le bon répertoire et exécutez votre grattoir avecscrapy crawl my_spider
.Le tout est sur ma page github et vous pouvez l'obtenir d' ici
la source
Un mélange de BeautifulSoup et de Selenium fonctionne très bien pour moi.
PS Vous pouvez trouver plus de conditions d'attente ici
la source
Vous voudrez utiliser urllib, requests, beautifulSoup et le pilote Web sélénium dans votre script pour différentes parties de la page (pour n'en nommer que quelques-unes).
Parfois, vous obtiendrez ce dont vous avez besoin avec un seul de ces modules.
Parfois, vous aurez besoin de deux, trois ou tous ces modules.
Parfois, vous devrez désactiver les js sur votre navigateur.
Parfois, vous aurez besoin d'informations d'en-tête dans votre script.
Aucun site Web ne peut être gratté de la même manière et aucun site Web ne peut être gratté de la même manière pour toujours sans avoir à modifier votre robot d'exploration, généralement après quelques mois. Mais ils peuvent tous être grattés! Là où il y a une volonté, il y a un moyen sûr.
Si vous avez besoin de données récupérées en continu dans le futur, il vous suffit de gratter tout ce dont vous avez besoin et de le stocker dans des fichiers .dat avec pickle.
Continuez simplement à chercher comment essayer quoi avec ces modules et copiez et collez vos erreurs dans Google.
la source
Utilisation de PyQt5
la source
J'essaye de trouver réponse à ces questions depuis deux jours. De nombreuses réponses vous orientent vers différents problèmes. Mais la réponse de Serpentr ci-dessus est vraiment pertinente . C'est la solution la plus courte et la plus simple. Juste un rappel, le dernier mot "var" représente le nom de la variable , il doit donc être utilisé comme:
la source
J'ai dû faire face à ce même problème sur certains projets de web scraping. La façon dont je l'ai géré était en utilisant la bibliothèque de requêtes python pour faire une requête http directement à l'API, au lieu d'avoir à charger le JS.
La bibliothèque de requêtes python fonctionne bien pour cela, et vous pouvez voir les requêtes http en utilisant l'élément inspect et en accédant à l'onglet réseau.
la source