[Python / Ruby] Comprendre le code Comment obtenir des données en ligne et les écrire au format CSV

Il y a des occasions où vous avez besoin d'utiliser des API, de gratter et d'exporter au format CSV afin de récupérer des données en ligne. A cette époque, j'écris parfois en me référant aux articles que j'ai postés auparavant, mais comme il était dispersé dans plusieurs articles, je vais le résumer en un seul. Personnellement, j'utilise souvent Python ou Ruby dans ces cas, donc j'écrirai une approche personnelle de ce langage.

Articles précédents

Obtenir la météo à venir à partir de l'API météo python Modèle de sujet par LDA avec gensim ~ Réflexion sur les goûts de l'utilisateur à partir du tag Qiita ~ Comment utiliser la méthode de grattage Rails Mechanize Notes pour la gestion de Ruby CSV

Aperçu

Cet article est essentiellement une base de code. Expliquer

est.

Python

Utilisation de l'API

urllib2

Dans l'article suivant que j'ai écrit plus tôt, j'ai utilisé ʻurllib2` pour obtenir les données comme indiqué dans le code ci-dessous. Obtenir la météo à venir à partir de l'API météo python

J'utilisais Python2 à l'époque, donc c'est du code Python2. Il semble qu'il y ait eu un changement dans la bibliothèque ʻurllib2` dans Python3

Le module urllib2 a été divisé en urllib.request et urllib.error en Python 3. L'outil 2to3 corrigera automatiquement l'importation du code source. (http://docs.python.jp/2/library/urllib2.html)

import urllib2, sys
import json

try: citycode = sys.argv[1]
except: citycode = '460010' #Région par défaut
resp = urllib2.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read()

#Convertir les données JSON lues en type dictionnaire
resp = json.loads(resp)
print '**************************'
print resp['title']
print '**************************'
print resp['description']['text']

for forecast in resp['forecasts']:
    print '**************************'
    print forecast['dateLabel']+'('+forecast['date']+')'
    print forecast['telop']
print '**************************'

requests

Maintenant, Python 3 utilise des «requêtes». Quand je le réécris, cela ressemble à ce qui suit.

import requests, sys

try: citycode = sys.argv[1]
except: citycode = '460010' #Région par défaut
resp = requests.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode)

resp = resp.json()
print('**************************')
print(resp['title'])
print('**************************')
print(resp['description']['text'])

for forecast in resp['forecasts']:
    print('**************************')
    print(forecast['dateLabel']+'('+forecast['date']+')')
    print(forecast['telop'])
print('**************************')

Vous pouvez vérifier les détails dans Document. Je suis heureux que ce document de demandes soit rédigé assez soigneusement. Requêtes: HTTP pour les humains

Si vous souhaitez savoir comment l'utiliser, veuillez consulter l'article suivant. Comment utiliser les requêtes (bibliothèque Python) Je pense que ce sera utile.

Grattage

Encore une fois, j'aimerais utiliser des «demandes» pour capturer les données. Le code ci-dessous est un code pour gratter les noms des acteurs et actrices japonais sur wikipedia. Utilisez BeautifulSoup comme analyseur HTML acquis. C'est pratique car il peut également être utilisé en XML.

En d'autres termes, le scraping Python se fait avec des "requests" et "BeautifulSoup".

Je pense qu'il est plus facile de sélectionner BeautifulSoup avec le sélecteur CSS en utilisant la méthode select.

import requests
from bs4 import BeautifulSoup
import csv
import time

base_url = 'https://en.wikipedia.org/wiki/'

url_list = ['List_of_Japanese_actors', 'List_of_Japanese_actresses']

for i in range(len(url_list)):
    target_url = base_url + url_list[i]
    target_html = requests.get(target_url).text
    soup = BeautifulSoup(target_html, 'html.parser')
    names = soup.select('#mw-content-text > h2 + ul > li > a')


    for k, name in enumerate(names):
        print(name.get_text())

    time.sleep(1) 
    print('scraping page: ' + str(i + 1))

Pour plus d'informations Beautiful Soup Documentation Pour ceux qui veulent un croquis approximatif Grattage avec Python et Beautiful Soup

Sortie CSV

Maintenant, écrivons le nom de l'acteur / actrice japonais ci-dessus en CSV.

C'est facile avec la bibliothèque csv.

import requests
from bs4 import BeautifulSoup
import csv
import time

base_url = 'https://en.wikipedia.org/wiki/'

url_list = ['List_of_Japanese_actors', 'List_of_Japanese_actresses']

all_names = []

for i in range(len(url_list)):
    target_url = base_url + url_list[i]
    target_html = requests.get(target_url).text
    soup = BeautifulSoup(target_html, 'html.parser')
    names = soup.select('#mw-content-text > h2 + ul > li > a')


    for k, name in enumerate(names):
        all_names.append(name.get_text())

    time.sleep(1) 
    print('scraping page: ' + str(i + 1))

f = open('all_names.csv', 'w') 
writer = csv.writer(f, lineterminator='\n')
writer.writerow(['name'])
for name in all_names:
    writer.writerow([name])

f.close()

all_names.csv


name
Hiroshi Abe
Abe Tsuyoshi
Osamu Adachi
Jin Akanishi
...

Les articles suivants sont parfaitement résumés sur l'utilisation de la bibliothèque csv. Lecture et écriture de CSV avec Python

Bien qu'il soit recommandé dans cet article, il n'est pas mauvais d'utiliser ʻopen pour lire le CSV, mais il est recommandé car il est assez courant d'utiliser pandas` en considération d'une analyse ultérieure.

import csv

with open('all_name.csv', 'r') as f:
  reader = csv.reader(f)
  header = next(reader)

  for row in reader:
    print row
import pandas as pd
df = pd.read_csv('all_name.csv')

Ruby

Utilisation de l'API

Ruby utilise «Mechanize». Analysez et utilisez le JSON reçu par "Mécaniser". Nous faisons la même chose que l'utilisation de l'API météo Python ci-dessus.

require 'mechanize'
require 'json'

citycode = '460010'
agent = Mechanize.new
page = agent.get("http://weather.livedoor.com/forecast/webservice/json/v1?city=#{citycode}")
data = JSON.parse(page.body)

puts '**************************'
puts data['title']
puts '**************************'
puts data['description']['text']

data['forecasts'].each do |forecast|
  puts '**************************'
  puts "#{forecast['dataLabel']}(#{forecast['date']})"
  puts forecast['telop']
end
puts '**************************'

En prime, je pense que vous pouvez également utiliser httparty etc. jnunemaker/httparty Cependant, «Mécaniser» suffira.

Grattage et CSV

En gros, je pense que l'article suivant est suffisant. Comment utiliser la méthode de grattage Rails Mechanize

Comme indiqué ci-dessous, utilisez get pour obtenir les données, utilisez la méthode search pour extraire la partie pertinente et ʻinner_text ou get_attribute` pour extraire le texte et les attributs.

require 'mechanize'

agent = Mechanize.new
page = agent.get("http://qiita.com")
elements = page.search('li a')

elements.each do |ele|
  puts ele.inner_text
  puts ele.get_attribute(:href)
end

Cette fois, je présenterai l'acquisition de données en utilisant la méthode post, ce qui n'est pas fait dans l'article ci-dessus, avec un exemple d'utilisation concret.

Le site L'Oracle de Bacon est un site qui renvoie le "nombre de bacon" lorsque vous entrez le nom de l'acteur. Bien qu'il soit différent du contenu de cet article, le "nombre de bacon" indique combien de fois les co-stars de l'acteur seront tracées pour atteindre l'acteur Kevin Bacon. [Sixième distance](https://ja.wikipedia.org/wiki/%E5%85%AD%E6%AC%A1%E3%81%AE%E9%9A%94%E3%81%9F% Il est intéressant de penser à E3% 82% 8A). À partir de 2011, il est dit que le nombre moyen d'utilisateurs de Facebook dans le monde qui en sépare deux est de 4,74, ce qui montre que le monde est étonnamment petit.

Ici, j'ai obtenu les noms des acteurs et actrices japonais avec le code python ci-dessus et les ai convertis en CSV, alors j'aimerais obtenir le nombre de bacon pour chacun d'eux et les transformer en CSV.

Le CSV des acteurs et actrices est le suivant.

all_names.csv


name
Hiroshi Abe
Abe Tsuyoshi
Osamu Adachi
Jin Akanishi
...

Ci-dessous le code. Le but est de savoir comment utiliser «post» de «Mechanize». De plus, je ne pouvais pas simplement obtenir le "nombre de bacon" que je voulais obtenir du HTML (c'était du texte non étiqueté), alors j'ai utilisé une expression régulière. Référence: Comment utiliser les expressions régulières Ruby

La gestion de CSV est décrite dans Notes pour la gestion de Ruby CSV. Puisque CSV.open peut être utilisé de la même manière que File.open, je l'ai utilisé ici.

require 'mechanize'
require 'csv'
require 'kconv'

def get_bacon_num_to(person)

  agent = Mechanize.new
  page = agent.post('http://oracleofbacon.org/movielinks.php',  { a: 'Kevin Bacon', b: person })
  main_text = page.at('#main').inner_text.toutf8
  match_result = main_text.match(/has a Bacon number of ([0-9]+)/)

  bacon_number = 0

  if match_result.nil?
    puts "#{person}: Not found."
  else
    bacon_number = main_text.match(/has a Bacon number of ([0-9]+)/)[1]
    puts "#{person}: #{bacon_number}"
  end

  return bacon_number

end

people = CSV.read('all_names.csv', headers: true)

CSV.open("result.csv", 'w') do |file|
  people.each do |person|
    num = get_bacon_num_to(person['name'])
    file << [person['name'], num]
    sleep(1)
  end

end

À la fin

Je pense qu'il existe différentes méthodes, mais je pense que les outils introduits cette fois-ci peuvent gérer beaucoup de choses. Veuillez essayer par tous les moyens essayez!

Recommended Posts

[Python / Ruby] Comprendre le code Comment obtenir des données en ligne et les écrire au format CSV
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Écrire des données CSV sur AWS-S3 avec AWS-Lambda + Python
Comment récupérer des données d'image de Flickr avec Python
[Python] Comment nommer les données de table et les sortir avec csv (méthode to_csv)
Recevoir des e-mails de Gmail et étiqueter avec Python3
Écrire en csv avec Python
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)
[Introduction à Python] Comment obtenir des données avec la fonction listdir
[Python] Ecrire dans un fichier csv avec Python
Comment démarrer avec Python
Précautions lors de la saisie à partir de CSV avec Python et de la sortie vers json pour faire exe
Comment écrire un exemple d'implémentation E11 Ruby et Python en temps réel hors ligne
Comment importer des fichiers CSV et TSV dans SQLite avec Python
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
Obtenez des données de VPS MySQL avec Python 3 et SQL Alchemy
Comment se connecter à Cloud Firestore à partir de Google Cloud Functions avec du code Python
Comment créer un environnement d'exécution Python et Jupyter avec VSCode
[Note] Obtenir des données de PostgreSQL avec Python
Compressez les données python et écrivez sur sqlite
Comment écrire Ruby to_s en Python
[Bases de la science des données] J'ai essayé d'enregistrer de csv à mysql avec python
Comment écrire le bon shebang dans les scripts Perl, Python et Ruby
Comment obtenir la différence de date et d'heure en secondes avec Python
Lisez le fichier CSV avec Python et convertissez-le en DataFrame tel quel
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
Comment créer des exemples de données CSV avec hypothèse
Comment lire un fichier CSV avec Python 2/3
Grattage de la nourriture avec python et sortie en CSV
Comment profiter de la programmation avec Minecraft (Ruby, Python)
[Python] De l'analyse morphologique des données CSV à la sortie CSV et à l'affichage graphique [GiNZA]
Comment démarrer le projet Python en 2020 (Windows WSL et Mac commun)
Résumé de la lecture des données numériques avec python [CSV, NetCDF, Fortran binary]
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment générer un code QR et un code à barres en Python et le lire normalement ou en temps réel avec OpenCV
Lecture de données CSV à partir du code Python de stockage d'objets DSX
Comment obtenir plus de 1000 données avec SQLAlchemy + MySQLdb
Comment convertir un fichier JSON en fichier CSV avec Python Pandas
[Python] Un mémo pour écrire du CSV verticalement avec Pandas
Comment obtenir le verdict de la molette de la souris avec des malédictions Python
Obtenir des données de la base de données via ODBC avec Python (Access)
Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
Obtenez le code du pays avec python
Créez un arbre de décision à partir de zéro avec Python et comprenez-le (3. Bibliothèque d'analyse de données édition Pandas)
Obtenez des données Youtube avec python
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Comment se connecter à diverses bases de données à partir de Python (PEP 249) et SQL Alchemy
Comment analyser le code source Java avec AST (Abstract Syntax Tree) en utilisant ANTLR et Python
Débarrassez-vous des données sales avec Python et les expressions régulières
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
Comment obtenir les données météorologiques actuelles et les afficher sur l'interface graphique tout en la mettant à jour automatiquement
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
Comment convertir Youtube en mp3 et le télécharger en toute sécurité [Python]
Code Python pour l'écriture de données CSV dans le stockage d'objets DSX
Appuyez sur REST en Python pour obtenir des données de New Relic
Obtenez des données de l'API d'analyse avec le client API Google pour python
Comment entrer dans l'environnement de développement Python avec Vagrant