使用Nokogiri抓取MusicRadar样本链接仅获3条,求排查及批量打开方法
问题分析与解决
一、为什么只抓到3条链接?
核心有两个原因:
XPath范围限制过严
你的代码用//div/a/@href仅抓取div标签下的<a>链接,但页面中大量样本链接实际嵌套在<article>、<li>、<header>等其他容器内,不在div节点下,因此被过滤遗漏。静态抓取无法获取动态加载内容
该页面可能通过JavaScript实现滚动加载更多样本内容,而open-uri只能获取页面初始的静态HTML,那些滚动后才加载的链接无法被抓取到。
修复抓取逻辑的代码
先放宽XPath范围,抓取所有<a>标签的href再筛选:
require 'open-uri' require 'nokogiri' base_url = 'https://www.musicradar.com/news/tech/free-music-samples-royalty-free-loops-hits-and-multis-to-download' html = OpenURI.open_uri(base_url) doc = Nokogiri::HTML(html) # 抓取所有a标签的href,筛选以-samples结尾的链接 sample_hrefs = doc.xpath('//a/@href').select { |href| href.value.match?(/\-samples$/) } # 将相对路径转换为完整URL full_sample_links = sample_hrefs.map { |href| URI.join(base_url, href.value).to_s } puts full_sample_links
如果上述代码仍抓不全内容,说明页面存在动态加载,需使用支持JavaScript的爬虫工具(如selenium-webdriver):
require 'selenium-webdriver' require 'nokogiri' driver = Selenium::WebDriver.for :chrome driver.get('https://www.musicradar.com/news/tech/free-music-samples-royalty-free-loops-hits-and-multis-to-download') # 模拟滚动到底部,触发动态加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") sleep 3 # 等待内容加载完成 doc = Nokogiri::HTML(driver.page_source) sample_hrefs = doc.xpath('//a/@href').select { |href| href.value.match?(/\-samples$/) } full_sample_links = sample_hrefs.map { |href| URI.join(driver.current_url, href.value).to_s } driver.quit puts full_sample_links
二、批量打开抓取到的链接
方法1:使用launchy gem(跨平台)
- 先安装gem:
gem install launchy
- 添加批量打开逻辑:
require 'launchy' # 遍历链接数组,逐个打开 full_sample_links.each do |url| Launchy.open(url) sleep 1 # 避免短时间打开过多页面导致浏览器卡顿 end
方法2:使用系统原生命令(无需额外gem)
根据操作系统差异执行对应命令:
full_sample_links.each do |url| if RUBY_PLATFORM =~ /darwin/ # macOS system("open #{url}") elsif RUBY_PLATFORM =~ /mswin|mingw/ # Windows system("start #{url}") else # Linux system("xdg-open #{url}") end sleep 1 end
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

