我是使用Nokogiri和Ruby的新手,所以请耐心等待。我写了一个脚本来访问网站上的一堆不同的页面,每个页面都包含一些我想要提取的链接。它按预期工作,但我想知道是否有更快,更有效的方法来实现这一目标。按照目前的情况, get_urls 方法会收集用于链接所在页面网址的名称,因此它将获得比特币,#39;以及' ethereum' ;等等,然后在 get_websites 方法中,它将该字符串放入链接所在的URL并擦除每个页面。
我想知道我这样做的方式效率是否低,以及是否有更好的方法。运行需要相当长的时间,但正如我所说,这是我第一次涉足网络抓取,所以我不确定这是否正常。
require 'open-uri'
require 'nokogiri'
require 'csv'
def get_urls
url = "https://coinmarketcap.com/"
document = open(url)
content = document.read
parsed_content = Nokogiri::HTML(content)
cointable = parsed_content.css('.col-lg-10').css('.row').css('.col-xs-12').css('#currencies')
cointable.css("tbody").css("tr").each do |row|
currency_name = row.css('.currency-name-container').inner_text
currency_link = row.css('.currency-name').css('.currency-symbol').css("a").first.values
link_name = currency_link[0].gsub("/currencies/", "").gsub("/","")
$url_list << [link_name, currency_name]
end
end
def get_websites
$url_list.each do |url|
coin_arr = Array.new
url_name = url[0]
coin_name = url[1]
url = "https://coinmarketcap.com/currencies/#{url_name}"
document = open(url)
content = document.read
parsed_content = Nokogiri::HTML(content)
links = parsed_content.css('.container').css('.list-unstyled')
puts "Adding #{url_name}..."
links.css("li").css("a").each do |row|
website = row.first[1]
website_name = row.inner_text
coin_arr.push([website_name, website])
CSV.open('crypto_websites.csv', 'a+') do |csv|
csv << [coin_name, website_name, website]
end
end
$list_of_sites[url_name] = coin_arr
end
end
$url_list = Array.new
$list_of_sites = {}
get_urls
get_websites