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