如何在Rails中使用Nokogiri爬取href指向页面的内容?
嘿,我来帮你搞定这个问题!其实爬取跳转页面的数据核心就是先抓主页面的链接,再逐个请求子页面解析内容,用Nokogiri完全可以做到,我给你拆解成具体步骤和代码示例:
步骤1:确保安装了Nokogiri
如果还没装这个gem,先在终端运行:
gem install nokogiri
步骤2:完整代码示例
下面是针对你给出的HTML结构写的可运行代码,你只需要替换主页面的URL就行:
require 'nokogiri' require 'open-uri' # 替换成你实际要爬的主页面地址 main_page_url = "http://your-main-page-url-here.com" begin # 第一步:解析主页面,提取所有地点链接 main_page_doc = Nokogiri::HTML(URI.open(main_page_url)) # 用CSS选择器定位到你要的a标签,提取所有href属性,去重避免重复链接 place_links = main_page_doc.css('div ul li a').map { |a_tag| a_tag['href'] }.uniq # 第二步:逐个访问子页面,提取数据 place_links.each do |sub_page_link| begin # 请求子页面并解析 sub_page_doc = Nokogiri::HTML(URI.open(sub_page_link)) # 提取子页面里的地点名称(div下的p标签文本) place_name = sub_page_doc.css('div p').text.strip # 提取图片链接(div下的img标签的src属性),加rescue防止页面没img时报错 image_src = sub_page_doc.css('div img')[0]['src'] rescue nil # 这里可以把数据存到数组、文件或者数据库,先简单输出看看结果 puts "地点名称: #{place_name}" puts "图片链接: #{image_src}" puts "-------------------------" rescue => e # 单个链接请求失败时不中断整个脚本,打印错误信息就行 puts "访问链接 #{sub_page_link} 失败: #{e.message}" end end rescue => e # 主页面请求失败的处理 puts "访问主页面失败: #{e.message}" end
关键部分解释
- 主页面解析:用
css('div ul li a')精准定位到你给出的HTML结构里的a标签,map把每个a标签的href属性提取出来,uniq去掉可能重复的链接。 - 子页面处理:遍历每个链接时,重新请求页面并解析,用同样的CSS选择器定位到子页面的p和img标签,提取需要的内容。
- 异常处理:两层
begin...rescue分别处理主页面和单个子页面的请求失败,避免一个小错误导致整个脚本崩溃。
额外提醒
- 如果遇到相对链接(比如href是
/place1而不是完整URL),记得用URI.join(main_page_url, sub_page_link).to_s把主域名和相对链接拼接成完整URL。 - 频繁爬取容易被网站封禁IP,建议在每个子页面请求后加个间隔,比如
sleep 1(暂停1秒)。 - 一定要遵守目标网站的使用规则,别搞恶意爬取哦!
内容的提问来源于stack exchange,提问作者Corey
相关产品推荐
相关产品推荐

