[PYTHON] Observation en virgule fixe de données spécifiques sur le Web en exécutant automatiquement un navigateur Web sur le serveur (Ubuntu16.04) (2) -Web scraping-

Contexte

Il y avait des données sur le WEB dont les valeurs changeaient en temps réel. J'ai décidé de créer un programme pour vérifier régulièrement la valeur, mais il était difficile d'écrire le code de scraping car je devais me connecter à la page. En guise de contre-mesure, j'ai décidé d'utiliser du sélénium pour faire fonctionner un navigateur Web et gratter. Je vais résumer le processus dans un mémorandum.

De plus, il était normal d'utiliser le PC à portée de main et d'exécuter automatiquement le navigateur Web par traitement par lots, mais c'était un obstacle pour lancer le navigateur Web sur mon propre PC que j'utilise habituellement. Exécutons-le sur le serveur de location (Ubuntu16.04) sans autorisation.

Plus précisément, ce sera l'image suivante. (1) Lancer un navigateur Web via python → Expliqué dans Part1 (2) Utiliser un navigateur Web avec du sélénium pour traiter les données WEB → Part2 (this post) (3) Stocker les données traitées dans mongoDB → Expliqué dans Partie3 (4) Exécuter automatiquement le programme py qui exécute (1) à (3) avec cron → Expliqué dans Part3 (5) S'il y a une certaine fluctuation de la valeur, notifier par e-mail → Bonus

Dernière fois a écrit pour lancer un navigateur Web (PhantomJS) à partir de python sur Ubuntu. Cette fois, j'aimerais obtenir les informations que je veux vraiment que vous récupériez.

Étape 1) Connectez-vous automatiquement à la page Web avec connexion avec sélénium

Comme je l'ai écrit dans le précédent «Objectif», mon objectif initial est d'acquérir périodiquement les données après la connexion et de les stocker dans la base de données sur la page Web où se trouve la connexion. La page qui acquiert automatiquement les données ne peut pas être écrite ici, donc le programme python qui se connecte automatiquement à Qiita est montré ci-dessous à titre d'exemple.

Connexion automatique à Qiita avec PhantomJS


import time
from selenium import webdriver

URL = "https://qiita.com/"
USERID = "<YOUR_USER_ID>"
PASS = "<YOUR_PASSWORD>"

#Démarrage automatique de PhantomJS et accès à Qiita
browser = webdriver.PhantomJS(executable_path='<path/to/phantomjs>')
browser.get(URL)
time.sleep(3)

#Page de connexion
browser.find_element_by_id("identity").send_keys(USERID)
browser.find_element_by_id("password").send_keys(PASS)
browser.find_element_by_xpath('//input[@name="commit"]').click()
time.sleep(5)

print(browser.title)

browser.close()
display.stop()

Après avoir exécuté ce qui précède, "Home --Qiita" est affiché. Vous pouvez voir que vous pouvez accéder à l'écran supérieur de votre compte après vous être connecté.

Étape 2) Installez BeautifulSoup4

Comme c'est un gros problème, je vais gratter la page consultée par PhantomJS. Il existe plusieurs façons de gratter avec python, mais cette fois avec BeautifulSoup4. L'installation elle-même est facile,

pip3 install bs4

Est OK.

Étape 3) Gratter l'écran après la connexion

Grattons l'écran supérieur après la connexion à Qiita.

Après vous être connecté à Qiita, la dernière liste de publications s'affiche dans l'onglet Flux sur l'écran supérieur. Jusqu'à 20 titres seront affichés, mais créons un programme qui acquiert automatiquement ces 20 titres. (Il n'y a pas beaucoup de signification pratique, juste un exemple.)

▼ Plus précisément, obtenez le nom du message dans le flux sur l'écran ci-dessous.

スクリーンショット 2016-08-31 22.43.58.png

▼ Le code de programme est le suivant.

import time
from selenium import webdriver
from bs4 import BeautifulSoup

URL = "https://qiita.com/"
USERID = "<YOUR_USER_ID>"
PASS = "<YOUR_PASSWORD>"

#Démarrage automatique de PhantomJS et accès à Qiita
browser = webdriver.PhantomJS(executable_path='<path/to/phantomjs>')
browser.get(URL)
time.sleep(3)

#Page de connexion
browser.find_element_by_id("identity").send_keys(USERID)
browser.find_element_by_id("password").send_keys(PASS)
browser.find_element_by_xpath('//input[@name="commit"]').click()
time.sleep(5)

#Obtenez une liste de publications sur l'écran d'accueil
html = browser.page_source.encode('utf-8')
soup = BeautifulSoup(html, "lxml")
posts_source = soup.select(".item-box-title > h1 > a")

#Sortie du nom du message
i = 1
for post in posts_source:
 print(str(i) + ":" + post.text.strip())
 i += 1

browser.close()
display.stop()

▼ C'est OK si le résultat de l'exécution du programme est affiché comme suit.

1:babel-Parlez de la publication dans le référentiel npm avec babe to light avec juste cli
2:Utiliser UX302NC avec Raspberry Pi
3:N dans Rails et MySQL-Implémenter la recherche en texte intégral avec FULL TEXT INDEX à l'aide de données grammaticales
4:J'ai fait un module pour faire des fonctions d'accessibilité avec Atom
5:N'utilisez pas d'emoji sur la feuille de triche sur GitHub
....

Comme vous pouvez le voir dans le code du programme ci-dessus, lorsque vous utilisez le navigateur via le sélénium, la source de la page actuellement ouverte est

browser.page_source

Je l'ai fait. Si nécessaire, encodez-le avec la méthode d'encodage comme indiqué dans l'exemple.

Le code HTML obtenu est remplacé par un objet BeautifulSoup afin que la valeur de la balise spécifiée soit récupérée. Dans l'échantillon

posts_source = soup.select(".item-box-title > h1 > a")

Nous récupérons donc l'élément enfant a de la balise h1 de l'élément enfant de div.item-box-title. Veuillez vous référer aux 2 sites suivants pour savoir comment gratter Beautiful Soup.

J'ai pris un exemple de programme qui acquiert automatiquement des informations à partir de l'écran d'accueil de Qiita, mais vous pouvez voir que ce code a une large gamme d'applications simplement en exécutant le code ci-dessus.

Jusqu'à présent, nous avons même exécuté le navigateur automatiquement pour obtenir des données spécifiques. Tout ce que vous avez à faire est d'exécuter le programme régulièrement avec CRON, etc. Les détails continuent à La prochaine fois.

Recommended Posts

Observation en virgule fixe de données spécifiques sur le Web en exécutant automatiquement un navigateur Web sur le serveur (Ubuntu16.04) (2) -Web scraping-
Observation en virgule fixe de données spécifiques sur le Web en exécutant automatiquement le navigateur Web sur le serveur (Ubuntu16.04) (1) -Installation du navigateur Web-
Ne collectez que des images faciales d'une personne spécifique grâce au grattage Web
Sauvegardez les données vocales acquises par le navigateur au format wav sur le serveur
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
Observation en virgule fixe de données spécifiques sur le Web en exécutant automatiquement un navigateur Web sur le serveur (Ubuntu16.04) (2) -Web scraping-
Observation en virgule fixe de données spécifiques sur le Web en exécutant automatiquement le navigateur Web sur le serveur (Ubuntu16.04) (1) -Installation du navigateur Web-
Sauvegardez les données vocales acquises par le navigateur au format wav sur le serveur
J'ai essayé de récupérer les données de l'ordinateur portable en le démarrant sur Ubuntu
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
[Introduction à AWS] Mémorandum de création d'un serveur Web sur AWS
Envoie le résultat de l'analyse morphologique avec Mecab vers un navigateur WEB compatible avec le serveur Sakura / UTF-8
Ne collectez que des images faciales d'une personne spécifique grâce au grattage Web
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
Un briefing sur la colère provoquée par le grattage
[Introduction à AWS] Mémorandum de création d'un serveur Web sur AWS
Envoie le résultat de l'analyse morphologique avec Mecab vers un navigateur WEB compatible avec le serveur Sakura / UTF-8
[Mémo personnel] Obtenez des données sur le Web et faites-en un DataFrame
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
[Python] J'ai créé un code de scraping web qui acquiert automatiquement le titre de l'actualité et l'URL de Nihon Keizai Shimbun.
Configurons un serveur WEB avec Chromebook
Publier le répertoire actuel sur le serveur Web
Essayez de tracer la concentration environnementale des composés organiques du fluor sur une carte à l'aide de données ouvertes
Gratter les données pluviométriques de l'Agence météorologique et les afficher sur M5Stack
Lien vers les points de données du graphe créé par jupyterlab & matplotlib
[Python] Tracer les données par préfecture sur une carte (nombre de voitures possédées dans tout le pays)