Yahoo-Nachrichten mit [Ruby + Nokogiri] kratzen → CSV speichern

Früher habe ich mit Pythons ** Beautiful Soup ** gekratzt, aber ich habe es versucht, weil es mit einer Bibliothek namens ** Nokogiri ** sogar in Ruby realisiert werden kann.

Zunächst aus dem fertigen Code und dem fertigen Produkt

scraping.rb



require 'nokogiri'
require 'open-uri'
require "csv"

require "byebug"


url_base = "https://news.yahoo.co.jp/"

def get_categories(url)
  html = open(url)
  doc = Nokogiri::HTML.parse(html)
  categories = doc.css(".yjnHeader_sub_cat li a")
  categories.map do |category|
    cat_name = category.text
    cat = category[:href]
  end
end

@cat_list = get_categories(url_base)
@infos = []


@cat_list.each do |cat|
  url = "#{url_base + cat}"
  html = open(url)
  doc = Nokogiri::HTML.parse(html)
  titles = doc.css(".topicsListItem a")
  i = 1
  titles.each do |title|
    @infos << [i,title.text]
    i += 1
  end
end

CSV.open("result.csv", "w") do |csv|
  @infos.each do |info|
    csv << info
    puts "-------------------------------"
    puts info
  end
end

スクリーンショット (94).png

Ich werde jeden von ihnen erklären.

Datei lesen

require 'nokogiri'
require 'open-uri'
require "csv"

require "byebug"

Dieses Mal werde ich ** Nokogiri und Open-Uri ** und ** CSV ** für die CSV-Speicherung verwenden.

Nokogiri ist eine Ruby-Bibliothek, die HTML- und XML-Code analysiert und mit Selektoren extrahiert. Da der Selektor zusätzlich zu ** css ** durch ** xpath ** angegeben werden kann, kann das Scraping auch auf Seiten mit komplizierten Strukturen reibungslos durchgeführt werden.

Seitenstruktur des Scraping-Ziels

スクリーンショット (88).png スクリーンショット (89).png

Dieses Mal erhalten wir die Titel der einzelnen Themen und fügen sie schließlich in einer CSV-Datei zusammen.

Die Themenseite scheint über den Link (ein Tag) in der Li der Klasse ** yjnHeader_sub ** verbunden zu sein.

Erhalten Sie Links nach Kategorie

url_base = "https://news.yahoo.co.jp/"

def get_categories(url)
  html = open(url)
  #Holen Sie sich den HTML-Code der URL durch Parse gelesen
  doc = Nokogiri::HTML.parse(html)
  #Verwenden Sie den CSS-Selektor, um alle a-Tags abzurufen, die mit der vorherigen Kategorie verbunden sind
  categories = doc.css(".yjnHeader_sub_cat li a")
  categories.map do |category|
    #Inhalt von href aus dem erworbenen Tag(Verknüpfte URL)Nehmen Sie eins nach dem anderen heraus und kehren Sie zurück
    cat = category[:href]
  end
end

#@cat_Ich werde die erhaltenen Links als Liste zusammenfassen
@cat_list = get_categories(url_base)

Holen Sie sich den Titel des Themas

Wir erhalten den Titel für jedes Thema über den Link, den wir zuvor erhalten haben.


@infos = []

@cat_list.each do |cat|
 #Die URL der Themenseite ist die ursprüngliche URL+Wegen der abgerufenen URL
  url = "#{url_base + cat}"
  html = open(url)
  doc = Nokogiri::HTML.parse(html)
  titles = doc.css(".topicsListItem a")
  i = 1
  titles.each do |title|
  #Speichern Sie Themennummern und Titel als Satz für die Kompilierung in CSV
    @infos << [i,title.text]
    i += 1
  end
end

Sammeln Sie die erworbenen Titel in CSV

Speichern Sie den zuletzt zusammengefassten Titel in CSV.


#Verwenden der CSV-Bibliothek"result.csv"Neu erstellt
CSV.open("result.csv", "w") do |csv|
  @infos.each do |info|
  #Die als Protokolle verwendeten Elemente werden ausgegeben, während sie zu csv hinzugefügt werden.
    csv << info
    puts "-------------------------------"
    puts info
  end
end

スクリーンショット (90).png

Maßnahmen gegen verstümmelte Charaktere

Wenn es jedoch so bleibt, wie es ist, werden die Zeichen wahrscheinlich verstümmelt. Speichern Sie es daher erneut mit einer Stückliste. (Ursprünglich ist es richtig, dies beim Speichern von CSV zu tun, aber es hat nicht funktioniert, deshalb habe ich mich hier darum gekümmert.)

Öffnen Sie "result.csv" mit ** Notepad ** und wählen Sie Überschreiben.

スクリーンショット (92).png

スクリーンショット (93).png

Wählen Sie zu diesem Zeitpunkt ** UTF-8 (mit Stückliste) ** und speichern Sie erneut.

スクリーンショット (94).png

Wenn Sie csv erneut öffnen, werden die verstümmelten Zeichen aufgelöst.

Schließlich

Ich denke, es gibt noch viele Punkte, die noch erreicht werden müssen. Wenn Sie also Vorschläge haben, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten.

Recommended Posts

Yahoo-Nachrichten mit [Ruby + Nokogiri] kratzen → CSV speichern
Erhalten Sie Daten aller Premier League-Spieler, indem Sie mit Ruby (nokogiri) kratzen.
[Nokogiri] Lassen Sie uns RSS-Nachrichten mit Ruby bearbeiten!
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Konvertieren von TSV-Dateien in CSV-Dateien (mit Stückliste) in Ruby