Es gibt gelegentliche Fälle, in denen Sie APIs verwenden, kratzen und in CSV exportieren müssen, um Daten online abzurufen. Zu dieser Zeit schreibe ich manchmal unter Bezugnahme auf die Artikel, die ich zuvor gepostet habe, aber da es in mehreren Artikeln verstreut war, werde ich es in einem zusammenfassen. Persönlich verwende ich in diesen Fällen häufig Python oder Ruby, daher schreibe ich einen persönlichen Ansatz für diese Sprache.
Holen Sie sich das bevorstehende Wetter von der Python-Wetter-API Themenmodell von LDA mit Gensim ~ Nachdenken über den Geschmack des Benutzers vom Qiita-Tag ~ Verwendung der Rails-Scraping-Methode Mechanize Hinweise zum Umgang mit Ruby CSV
Dieser Artikel ist im Grunde eine Codebasis. Erklären
Anfragen
und BeautifulSoup
in Python und konvertieren Sie sie in CSV.Mechanize
in Ruby und konvertieren Sie sie in CSV.ist.
Python
urllib2
In dem folgenden Artikel, den ich zuvor geschrieben habe, habe ich "urllib2" verwendet, um die Daten abzurufen, wie im folgenden Code gezeigt. Holen Sie sich das bevorstehende Wetter von der Python-Wetter-API
Ich habe damals Python2 verwendet, also ist es Python2-Code. Es scheint eine Änderung in der Bibliothek "urllib2" in Python3 zu geben
Das urllib2-Modul wurde in Python 3 in urllib.request und urllib.error aufgeteilt. Das 2to3-Tool korrigiert automatisch den Quellcode-Import. (http://docs.python.jp/2/library/urllib2.html)
import urllib2, sys
import json
try: citycode = sys.argv[1]
except: citycode = '460010' #Standardbereich
resp = urllib2.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read()
#Konvertieren Sie die gelesenen JSON-Daten in den Wörterbuchtyp
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
Jetzt verwendet Python 3 "Anfragen". Wenn ich es umschreibe, sieht es wie folgt aus.
import requests, sys
try: citycode = sys.argv[1]
except: citycode = '460010' #Standardbereich
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('**************************')
Sie können die Details im Dokument überprüfen. Ich bin froh, dass dieses Dokument der Anfragen ziemlich sorgfältig geschrieben wurde. Anfragen: HTTP für Menschen
Wenn Sie überprüfen möchten, wie es verwendet wird, lesen Sie bitte den folgenden Artikel. Verwendung von Anfragen (Python-Bibliothek) Ich denke es wird hilfreich sein.
Auch hier möchte ich "Anfragen" verwenden, um die Daten zu erfassen. Der folgende Code ist ein Code zum Abkratzen der Namen japanischer Schauspieler und Schauspielerinnen auf Wikipedia. Verwenden Sie "BeautifulSoup" als Parser für den abgerufenen HTML-Code. Dies ist praktisch, da es auch in XML verwendet werden kann.
Mit anderen Worten, Python-Scraping wird mit "Anfragen" und "Schöne Suppe" durchgeführt.
Ich denke, es ist einfacher, "BeautifulSoup" mit dem CSS-Selektor unter Verwendung der "select" -Methode auszuwählen.
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))
Für mehr Informationen Beautiful Soup Documentation Für diejenigen, die eine grobe Skizze wollen Schaben mit Python und schöner Suppe
Schreiben wir nun den obigen Namen des japanischen Schauspielers / der japanischen Schauspielerin an CSV.
Mit der CSV-Bibliothek ist das ganz einfach.
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
...
Die folgenden Artikel sind über die Verwendung der CSV-Bibliothek übersichtlich zusammengefasst. Lesen und Schreiben von CSV mit Python
Obwohl es in diesem Artikel empfohlen wird, ist es nicht schlecht, "open" zum Lesen von CSV zu verwenden, aber es wird empfohlen, weil es durchaus üblich ist, "Pandas" im Hinblick auf nachfolgende Analysen zu verwenden.
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 benutzt Mechanize
.
Analysieren und verwenden Sie den von 'Mechanize' empfangenen JSON.
Wir machen dasselbe wie oben mit der Python-Wetter-API.
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 '**************************'
Als Bonus denke ich, dass Sie auch httparty usw. verwenden können. jnunemaker/httparty "Mechanisieren" wird jedoch ausreichen.
Grundsätzlich halte ich den folgenden Artikel für ausreichend. Verwendung der Rails-Scraping-Methode Mechanize
Wie unten gezeigt, verwenden Sie "get", um die Daten abzurufen, verwenden Sie die "search" -Methode, um den relevanten Teil zu extrahieren, und verwenden Sie "inner_text" oder "get_attribute", um den Text und die Attribute zu extrahieren.
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
Dieses Mal werde ich die Datenerfassung mit der Post-Methode, die im obigen Artikel nicht durchgeführt wird, anhand eines konkreten Anwendungsbeispiels vorstellen.
Die Site Das Orakel des Specks ist eine Site, die die "Nummer des Specks" zurückgibt, wenn Sie den Namen des Schauspielers eingeben. Obwohl es sich vom Inhalt dieses Artikels unterscheidet, gibt die "Anzahl der Specke" an, wie oft die Co-Stars des Schauspielers verfolgt werden, um den Schauspieler Kevin Bacon zu erreichen. [Sechste Entfernung](https://ja.wikipedia.org/wiki/%E5%85%AD%E6%AC%A1%E3%81%AE%E9%9A%94%E3%81%9F% Es ist interessant, über E3% 82% 8A) nachzudenken. Ab 2011 soll die durchschnittliche Anzahl der Facebook-Nutzer in der Welt, die zwei davon trennt, 4,74 betragen, was zeigt, dass die Welt überraschend klein ist.
Hier habe ich die Namen japanischer Schauspieler und Schauspielerinnen mit dem obigen Python-Code erhalten und sie in CSV umgewandelt, daher möchte ich die Anzahl der Specke für jeden von ihnen ermitteln und sie in CSV umwandeln.
Die CSV von Schauspielern und Schauspielerinnen ist wie folgt.
all_names.csv
name
Hiroshi Abe
Abe Tsuyoshi
Osamu Adachi
Jin Akanishi
...
Unten ist der Code. Der Punkt ist, wie man "Post" von "Mechanize" verwendet. Außerdem konnte ich nicht einfach die "Anzahl Speck" ermitteln, die ich aus HTML erhalten wollte (es war Text ohne Tags), daher habe ich einen regulären Ausdruck verwendet. Referenz: Verwendung von regulären Ruby-Ausdrücken
Die Behandlung von CSV wird in Hinweise zur Behandlung von Ruby CSV beschrieben. Da "CSV.open" auf die gleiche Weise wie "File.open" verwendet werden kann, habe ich dies hier verwendet.
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
Ich denke, es gibt verschiedene Methoden, aber ich denke, dass die diesmal eingeführten Tools viele Dinge bewältigen können. Bitte versuchen Sie es auf jeden Fall!
Recommended Posts