Premiers pas avec Python Web Scraping Practice

Je voudrais écrire une introduction à la pratique du web scraping avec Python.

Sauf pour la partie générale, j'aimerais aller avec un style qui comprend par le sentiment.

Choses à faire

Finalement, "Accédez au Nihon Keizai Shimbun toutes les heures et enregistrez le cours moyen de l'action Nikkei à ce moment-là en csv."

Je voudrais faire un programme.

Mise en garde

C'est une note. Lisez-le attentivement. [Affaire de la bibliothèque centrale d'Okazaki City (Affaire Librahack) --Wikipedia](https://ja.wikipedia.org/wiki/%E5%B2%A1%E5%B4%8E%E5%B8%82%E7%AB%8B % E4% B8% AD% E5% A4% AE% E5% 9B% B3% E6% 9B% B8% E9% A4% A8% E4% BA% 8B% E4% BB% B6) Liste des précautions pour le scraping Web

Qu'est ce que tu utilises

Langage: Python 2.7.12 Bibliothèques: urllib2, BeautifulSoup, csv, datetime, time

urllib2 est requis pour accéder à l'URL. BeautifulSoup est comme un analyseur XML qui ouvre les fichiers auxquels vous accédez et obtenez Cette bibliothèque est requise lorsque vous travaillez avec des fichiers csv. datetime est une bibliothèque pour obtenir l'heure

Installation de la bibliothèque

urllib2 est installé lorsque vous installez Python. Utilisez la commande pip pour installer Beautiful Soup

shell.sh


$ pip install beautifulsoup4

Prenons le titre de page de Nihon Keizai Shimbun comme point de départ!

Tout d'abord, accédez au Nihon Keizai Shimbun avec Python et récupérez le HTML.

Après cela, transformez-le en une forme qui peut être manipulée par Beautiful Soup,

Le titre de la page est acquis à partir du formulaire qui peut être manipulé et sorti.

De plus, cette fois, il peut être difficile de comprendre l'image si vous n'obtenez que le titre de la page, donc j'aimerais obtenir l'élément titre et obtenir le titre à partir des éléments titre.

getNikkeiWebPageTitle.py


# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup

#URL d'accès
url = "http://www.nikkei.com/"

#Html pour accéder à l'URL est retourné →<html><head><title>Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei</title></head><body....
html = urllib2.urlopen(url)

#Manipulez le HTML avec une belle soupe
soup = BeautifulSoup(html, "html.parser")

#Obtenez l'élément de titre →<title>Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei</title>
title_tag = soup.title

#Obtenir la chaîne d'élément → Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei
title = title_tag.string

#Élément de titre de sortie
print title_tag

#Titre de sortie sous forme de chaîne de caractères
print title

Cela renverra les résultats suivants:

shell.sh


$ python getNikkeiWebPageTitle.py
<title>Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei</title>
Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei

Au fait

print.py


print soup.title.string

Des résultats similaires peuvent également être obtenus dans ce cas.

Je pense que vous en avez une idée approximative.

Entraine toi!

L'objectif cette fois est "d'accéder au Nihon Keizai Shimbun toutes les heures et d'enregistrer le cours moyen de l'action Nikkei à ce moment-là en csv". Si vous vérifiez la procédure du programme

  1. Accédez à la page du cours moyen de l'action Nikkei du Nihon Keizai Shimbun et obtenez le code HTML
  2. Obtenez le cours moyen de l'action Nikkei en utilisant Beautiful Soup
  3. Décrivez la date, l'heure et la valeur moyenne du cours de l'action Nikkei dans un enregistrement en csv

L'en-tête n'est pas utilisé pour csv.

Faisons le.

Accéder à la page du cours moyen de l'action Nikkei

Tout d'abord, accédez à la page du cours moyen de l'action Nikkei.

La théorie consiste à rechercher l'URL vous-même à l'avance dans le navigateur.

Si vous le recherchez, vous pouvez le trouver sur la page "Nihon Keizai Shimbun-> Marché-> Stock".

J'utiliserai le programme précédent

getNikkeiHeikin.py


# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup

#URL d'accès
url = "http://www.nikkei.com/markets/kabu/"

#Html pour accéder à l'URL est retourné →<html><head><title>Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei</title></head><body....
html = urllib2.urlopen(url)

#Manipulez le HTML avec une belle soupe
soup = BeautifulSoup(html, "html.parser")

#Titre de sortie sous forme de chaîne de caractères
print soup.title.string

Cela affichera le titre.

shell.sh


$ python getNikkiHeikin.py
>>Stock: Marché: version électronique Nikkei

Acquisition du cours moyen de l'action Nikkei

Ensuite, obtenez le cours moyen de l'action Nikkei.

Ouvrons Nihon Keizai Shimbun> Marché> Bourse dans votre navigateur.

Le cours moyen de l'action Nikkei est indiqué du haut vers le bas de cette page.

Pour obtenir cela, nous devons trouver l'emplacement de ces données en HTML.

Faites un clic droit sur le cours moyen de l'action Nikkei et appuyez sur "Vérifier".

Alors je pense que l'écran ressemblera à ceci

スクリーンショット 2016-12-01 17.59.17.png

Class = "mkc-stock_prices" dans l'élément span.

Maintenant vous connaissez la position.

Imprimons réellement avec Beautiful Soup.

getNikeiHeikin.py


# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup

#URL d'accès
url = "http://www.nikkei.com/markets/kabu/"

#Html pour accéder à l'URL est retourné →<html><head><title>Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei</title></head><body....
html = urllib2.urlopen(url)

#Manipulez le HTML avec une belle soupe
soup = BeautifulSoup(html, "html.parser")

#Extraire tous les éléments span → Tous les éléments span sont renvoyés dans le tableau →[<span class="m-wficon triDown"></span>, <span class="l-h...
span = soup.find_all("span")

#Déclarez-le d'abord afin qu'il ne provoque pas d'erreur lors de l'impression.
nikkei_heikin = ""
#Classez tous les éléments de portée en quelques minutes="mkc-stock_prices"Cherchez celui qui est devenu
for tag in span:
    #Les éléments pour lesquels la classe n'est pas définie sont des balises.get("class").pop(0)Évitez l'erreur avec try car cela entraînera une erreur car vous ne pouvez pas faire
    try:
        #Classe à partir du tag="n"Extrayez la chaîne de n caractères de. Étant donné que plusieurs classes peuvent être définies
        #La fonction get est renvoyée sous forme de tableau. Donc, la fonction de tableau pop(0)Supprime le tout début de la séquence en
        # <span class="hoge" class="foo">  →   ["hoge","foo"]  →   hoge
        string_ = tag.get("class").pop(0)

        #Mkc dans la chaîne de classe extraite-stock_Vérifiez s'il est défini comme prix
        if string_ in "mkc-stock_prices":
            # mkc-stock_Puisque les prix sont définis, la chaîne de caractères entre les balises.Commencez par une chaîne
            nikkei_heikin = tag.string
            #Puisque l'extraction est terminée, je vais quitter pendant quelques minutes
            break
    except:
        #Chemin → Ne rien faire
        pass

#Affiche le cours moyen de l'action Nikkei extrait.
print nikkei_heikin

résultat

shell.sh


$ python getNikeiHeikin.py
>>18,513.12

L'explication du code est essentiellement insérée dans le commentaire

Pour exprimer le flux simplement

  1. Accédez à Nihon Keizai Shimbun> Marché> Actions et choisissez HTML
  2. Puisque le cours moyen de l'action Nikkei est entouré d'éléments span, tous les éléments span à l'intérieur du HTML sont extraits.
  3. Assurez-vous que "mkc-stock_prices" est défini sur class pour chaque élément span.
  4. Lorsque la classe définie est trouvée, obtenez la valeur avec .string et terminez pendant quelques minutes
  5. Imprimez la valeur obtenue

C'est un flux.

Le flux de ce programme peut être utilisé dans la plupart des situations L'avantage est que ce n'est pas si difficile et peut être appliqué dans la plupart des situations. En guise de mise en garde, si l'élément span change en un autre élément ou si le contenu de la classe change, il ne peut pas être généré.

Répéter et sortie csv

Sortir ce résultat en csv et le répéter toutes les heures

getNikeiHeikin.py


# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup
from datetime import datetime
import csv
import time

time_flag = True

#Laissez-le courir pour toujours
while True:
    #Si la durée est différente de 59 minutes, attendez 58 secondes
    if datetime.now().minute != 59:
        #1 minute parce que ce n'est pas 59 minutes(58 secondes)Attendre un moment(誤差がないとは言い切れないので58 secondesです)
        time.sleep(58)
        continue
    
    #Ouvrez csv en mode ajout → Ouvrez csv ici car il faut du temps pour ouvrir csv lorsque le fichier devient volumineux
    f = open('nikkei_heikin.csv', 'a')
    writer = csv.writer(f, lineterminator='\n')

    #C'est 59 minutes, mais je ne peux pas sortir avant 59 secondes à des secondes d'intervalle pour mesurer au bon moment.
    while datetime.now().second != 59:
            #Attendez 1 seconde car ce n'est pas 00 secondes
            time.sleep(1)
    #Le processus se termine rapidement et se répète deux fois, alors attendez ici une seconde.
    time.sleep(1)

    #Créer un enregistrement à décrire en csv
    csv_list = []

    #Obtenez l'heure actuelle en année, mois, jour, heure, minute, seconde
    time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    #Insérez l'heure dans la première colonne
    csv_list.append(time_)

    #URL d'accès
    url = "http://www.nikkei.com/markets/kabu/"

    #Html pour accéder à l'URL est retourné →<html><head><title>Actualités économiques, boursières, commerciales et politiques:Version électronique Nikkei</title></head><body....
    html = urllib2.urlopen(url)

    #Manipulez le HTML avec une belle soupe
    soup = BeautifulSoup(html, "html.parser")

    #Extraire tous les éléments span → Tous les éléments span sont renvoyés dans le tableau →[<span class="m-wficon triDown"></span>, <span class="l-h...
    span = soup.find_all("span")

    #Déclarez-le d'abord afin qu'il ne provoque pas d'erreur lors de l'impression.
    nikkei_heikin = ""
    #Classez tous les éléments de portée en quelques minutes="mkc-stock_prices"Cherchez celui qui est devenu
    for tag in span:
        #Les éléments pour lesquels la classe n'est pas définie sont des balises.get("class").pop(0)Évitez l'erreur avec try car cela entraînera une erreur car vous ne pouvez pas faire
        try:
            #Classe à partir du tag="n"Extrayez la chaîne de n caractères de. Étant donné que plusieurs classes peuvent être définies
            #La fonction get est renvoyée sous forme de tableau. Donc, la fonction de tableau pop(0)Supprime le tout début de la séquence en
            # <span class="hoge" class="foo">  →   ["hoge","foo"]  →   hoge
            string_ = tag.get("class").pop(0)

            #Mkc dans la chaîne de classe extraite-stock_Vérifiez s'il est défini comme prix
            if string_ in "mkc-stock_prices":
                # mkc-stock_Puisque les prix sont définis, la chaîne de caractères entre les balises.Commencez par une chaîne
                nikkei_heikin = tag.string
                #Puisque l'extraction est terminée, je vais quitter pendant quelques minutes
                break
        except:
            #Chemin → Ne rien faire
            pass

    #Le cours moyen de l'action Nikkei extrait est émis au fil du temps.
    print time_, nikkei_heikin
    #Enregistrez la moyenne Nikkei dans la deuxième colonne
    csv_list.append(nikkei_heikin)
    #Ajouter au csv
    writer.writerow(csv_list)
    #Fermer pour éviter la corruption de fichiers
    f.close()

Parler dans un flux

  1. Attendez jusqu'à n: 00 secondes
  2. Ouvrez csv
  3. Créer un enregistrement
  4. Obtenez le cours moyen de l'action Nikkei
  5. Ajouter à l'enregistrement
  6. Ecrivez l'enregistrement dans csv

Voilà pourquoi

Si vous continuez à faire cela, il accédera une fois par heure pour obtenir la moyenne Nikkei et l'enregistrer.

Vous pouvez tout faire en appliquant ceci

Par exemple, vous pouvez ajouter un panier à grande vitesse (appelé groupe de scripts) au moment de la vente sur une longue rivière en Amérique du Sud. .. ..

Je ne le recommande pas beaucoup

Puis!

Ici aussi

Collection de techniques de scraping Web Python "Aucune valeur ne peut être obtenue" Prise en charge de JavaScript [10 000 requêtes par seconde!?] Scrapage Web explosif à partir du langage Go [Golang] [Pour les débutants] Re: Algorithme génétique partant de zéro [Intelligence artificielle]

Recommended Posts

Premiers pas avec Python Web Scraping Practice
Premiers pas avec les applications Web Python
1.1 Premiers pas avec Python
Premiers pas avec Python
Pratiquer le web scraping avec Python et Selenium
Web scraping avec python + JupyterLab
Premiers pas avec Python Django (1)
Premiers pas avec Python Django (4)
Premiers pas avec Python Django (3)
Introduction à Python Django (6)
Web scraping débutant avec python
Premiers pas avec Python Django (5)
Premiers pas avec Python responder v2
Web scraping avec Python Première étape
J'ai essayé webScraping avec python.
Premiers pas avec Python pour les classes PHPer
Premiers pas avec les algorithmes génétiques Python
Premiers pas avec Python 3.8 sous Windows
Premiers pas avec Python pour les fonctions PHPer
Grattage avec Python
Grattage avec Python
Premiers pas avec python3 # 1 Apprenez les connaissances de base
Grattage WEB avec Python (pour mémo personnel)
[Note personnelle] Scraping de pages Web en python3
Site de courses de chevaux Web scraping avec Python
Premiers pas avec Python pour PHPer-Super Basics
Premiers pas avec Dynamo de Python boto
Scraping Web facile avec Python et Ruby
[Pour les débutants] Essayez le web scraping avec Python
[FastAPI] Premiers pas avec FastAPI, un framework Web ASGI créé par Python
Django 1.11 a démarré avec Python3.6
Grattage en Python (préparation)
Essayez de gratter avec Python.
Premiers pas avec Android!
Grattage avec Python + PhantomJS
Premiers pas avec apache2
Premiers pas avec Django 1
Introduction à l'optimisation
Premiers pas avec Numpy
Premiers pas avec Spark
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Premiers pas avec Pydantic
Premiers pas avec Jython
Scraping RSS avec Python
Premiers pas avec Django 2
Démarrer avec Python avec 100 coups sur le traitement du langage
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
[Français] Premiers pas avec Rust pour les programmeurs Python
Introduction à Tornado (1): Framework Web Python démarré avec Tornado
Premiers pas avec AWS IoT facilement en Python
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)