加快与Nokogiri& amp;红宝石

时间:2018-01-10 21:28:12

标签: ruby web-scraping nokogiri

我是使用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

0 个答案:

没有答案