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.
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
Cet article est essentiellement une base de code. Expliquer
Mechanize
dans Ruby et convertissez-les en CSV.est.
Python
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.
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
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
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.
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
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