Scraping Yahoo News avec [Ruby + Nokogiri] → Enregistrer CSV

J'avais l'habitude de gratter en utilisant ** Beautiful Soup ** de Python, mais je l'ai essayé car il peut être réalisé avec une bibliothèque appelée ** Nokogiri ** même en Ruby.

Tout d'abord, à partir du code complété et du produit fini

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

Je vais expliquer chacun d'eux.

Lire le fichier

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

require "byebug"

Cette fois, j'utiliserai ** Nokogiri et open-uri **, et ** csv ** pour le stockage CSV.

Nokogiri est une bibliothèque Ruby qui analyse le code HTML et XML et l'extrait avec des sélecteurs. Comme le sélecteur peut être spécifié par ** xpath ** en plus de ** css **, le scraping peut être effectué en douceur même sur des pages avec des structures compliquées.

Structure de page de la destination de scraping

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

Cette fois, nous obtiendrons les titres de chaque sujet et les rassemblerons finalement dans un fichier CSV.

La page de sujet semble être connectée à partir du lien (une balise) dans le li de la classe ** yjnHeader_sub **.

Obtenir des liens par catégorie

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

def get_categories(url)
  html = open(url)
  #Récupérer le code HTML de l'URL lu par analyse
  doc = Nokogiri::HTML.parse(html)
  #Utilisez le sélecteur css pour obtenir toutes les balises a connectées à la catégorie précédente
  categories = doc.css(".yjnHeader_sub_cat li a")
  categories.map do |category|
    #Contenu de href de la balise acquise a(URL liée)Sortez un par un et revenez
    cat = category[:href]
  end
end

#@cat_Je vais résumer les liens obtenus sous forme de liste
@cat_list = get_categories(url_base)

Obtenez le titre du sujet

Nous obtiendrons le titre de chaque sujet en utilisant le lien que nous avons obtenu précédemment.


@infos = []

@cat_list.each do |cat|
 #L'URL de la page de sujet est l'URL d'origine+En raison de l'URL récupérée
  url = "#{url_base + cat}"
  html = open(url)
  doc = Nokogiri::HTML.parse(html)
  titles = doc.css(".topicsListItem a")
  i = 1
  titles.each do |title|
  #Stocker les numéros de sujet et les titres sous forme d'ensemble pour la compilation au format CSV
    @infos << [i,title.text]
    i += 1
  end
end

Récupérez les titres acquis en CSV

Enregistrez le dernier titre résumé au format CSV.


#Utilisation de la bibliothèque CSV"result.csv"Nouvellement créé
CSV.open("result.csv", "w") do |csv|
  @infos.each do |info|
  #Les éléments utilisés comme journaux sont générés lors de leur ajout à csv.
    csv << info
    puts "-------------------------------"
    puts info
  end
end

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

Mesures contre les caractères déformés

Cependant, s'il est laissé tel quel, les caractères seront probablement déformés, alors enregistrez-le à nouveau avec une nomenclature. (À l'origine, c'était correct de le faire tout en enregistrant CSV, mais cela ne fonctionnait pas, alors je m'en suis occupé ici.)

Ouvrez "result.csv" avec ** Bloc-notes ** et sélectionnez Écraser.

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

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

À ce stade, sélectionnez ** UTF-8 (avec BOM) ** et enregistrez à nouveau.

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

Lorsque vous ouvrez à nouveau csv, les caractères déformés sont résolus.

finalement

Je pense qu'il reste encore beaucoup de points à atteindre, donc si vous avez des suggestions, j'apprécierais que vous puissiez commenter.

Recommended Posts

Scraping Yahoo News avec [Ruby + Nokogiri] → Enregistrer CSV
Obtenez les données de tous les joueurs de Premier League en grattant avec Ruby (nokogiri)
[Nokogiri] Gérons les actualités RSS avec Ruby!
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
Conversion du fichier TSV en fichier CSV (avec BOM) en Ruby