[Python / Ruby] Mit Code verstehen Wie man Daten aus dem Internet abruft und in CSV schreibt

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.

Frühere Artikel

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

Überblick

Dieser Artikel ist im Grunde eine Codebasis. Erklären

ist.

Python

Verwendung der API

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.

Schaben

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

CSV-Ausgabe

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

Verwendung der API

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.

Scraping und CSV

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

Am Ende

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

[Python / Ruby] Mit Code verstehen Wie man Daten aus dem Internet abruft und in CSV schreibt
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
Schreiben Sie CSV-Daten mit AWS-Lambda + Python in AWS-S3
So kratzen Sie Bilddaten von Flickr mit Python
[Python] So benennen Sie Tabellendaten und geben sie mit csv aus (to_csv-Methode)
Erhalten Sie E-Mails von Google Mail und beschriften Sie sie mit Python3
Schreiben Sie mit Python in csv
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
[Python] Mit Python in eine CSV-Datei schreiben
Erste Schritte mit Python
Vorsichtsmaßnahmen bei der Eingabe von CSV mit Python und der Ausgabe an json, um exe zu erstellen
Offline in Echtzeit, wie man ein Implementierungsbeispiel für E11 Ruby und Python schreibt
So importieren Sie CSV- und TSV-Dateien mit Python in SQLite
So erhalten Sie mithilfe der Mastodon-API Follower und Follower von Python
Holen Sie sich Daten von VPS MySQL mit Python 3 und SQL Alchemy
Herstellen einer Verbindung zum Cloud Firestore über Google Cloud-Funktionen mit Python-Code
So erstellen Sie eine Python- und Jupyter-Ausführungsumgebung mit VSCode
[Hinweis] Mit Python Daten von PostgreSQL abrufen
Komprimieren Sie Python-Daten und schreiben Sie in SQLite
Wie schreibe ich Ruby to_s in Python
[Data Science-Grundlagen] Ich habe versucht, mit Python von CSV auf MySQL zu speichern
So schreiben Sie den richtigen Shebang in Perl-, Python- und Ruby-Skripten
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
Lesen Sie die CSV-Datei mit Python und konvertieren Sie sie unverändert in DataFrame
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
Erstellen von CSV-Beispieldaten mit Hypothese
Lesen einer CSV-Datei mit Python 2/3
Kratzen Sie das Essen mit Python und geben Sie es an CSV aus
Wie man Spaß am Programmieren mit Minecraft hat (Ruby, Python)
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
So starten Sie das Python-Projekt im Jahr 2020 (Windows WSL und Mac Common)
Zusammenfassung zum Lesen numerischer Daten mit Python [CSV, NetCDF, Fortran Binary]
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
So generieren Sie QR-Code und Barcode in Python und lesen ihn normal oder in Echtzeit mit OpenCV
Lesen von CSV-Daten aus dem Python-Code des DSX-Objektspeichers
So erhalten Sie mit SQLAlchemy + MySQLdb mehr als 1000 Daten
So konvertieren Sie eine JSON-Datei mit Python Pandas in eine CSV-Datei
[Python] Ein Memo zum vertikalen Schreiben von CSV mit Pandas
Wie man mit Python-Flüchen ein Urteil über das Mausrad erhält
Abrufen von Daten aus der Datenbank über ODBC mit Python (Access)
Erstellen Sie mit Streamlit schnell ein Python-Datenanalyse-Dashboard und stellen Sie es in AWS bereit
Holen Sie sich den Ländercode mit Python
Erstellen Sie mit Python einen Entscheidungsbaum aus 0 und verstehen Sie ihn (3. Datenanalysebibliothek Pandas Edition)
Holen Sie sich Youtube-Daten mit Python
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
Herstellen einer Verbindung zu verschiedenen DBs über Python (PEP 249) und SQL Alchemy
Analysieren von Java-Quellcode mit AST (Abstract Syntax Tree) mithilfe von ANTLR und Python
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
So erhalten Sie die aktuellen Wetterdaten und zeigen sie auf der GUI an, während Sie sie automatisch aktualisieren
Geben Sie die Bilddaten mit Flask of Python zurück und zeichnen Sie sie in das Canvas-Element von HTML
Wie man Youtube in MP3 konvertiert und es super sicher herunterlädt [Python]
Python-Code zum Schreiben von CSV-Daten in den DSX-Objektspeicher
Drücken Sie in Python auf REST, um Daten von New Relic abzurufen
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
So gelangen Sie mit Vagrant in die Python-Entwicklungsumgebung