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
Je vais expliquer chacun d'eux.
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.
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 **.
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)
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
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
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.
À ce stade, sélectionnez ** UTF-8 (avec BOM) ** et enregistrez à nouveau.
Lorsque vous ouvrez à nouveau csv, les caractères déformés sont résolus.
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