使用Ruby Mechanize爬取Shopee商品链接失败求助
问题排查与解决方案
核心问题分析
CSS选择器语法错误
原代码中的CSS选择器col-xs-2-4 shopee-search-item-result__item不符合语法规范:类选择器需要以.开头,多个类名之间用.连接(表示同时匹配多个类),正确写法应为.col-xs-2-4.shopee-search-item-result__item。页面动态渲染限制
Shopee的商品列表是通过JavaScript动态加载的,Mechanize作为纯HTTP请求工具,只能获取页面的初始静态HTML,无法执行JavaScript,因此静态页面中并不包含你要抓取的商品元素,这是无输出的主要原因。
解决方案
方案1:改用支持JS渲染的工具
使用Capybara配合Selenium来抓取动态渲染的页面,示例代码如下:
require 'capybara/dsl' require 'selenium-webdriver' Capybara.register_driver :selenium_chrome do |app| Capybara::Selenium::Driver.new(app, browser: :chrome) end session = Capybara::Session.new(:selenium_chrome) session.visit('https://shopee.com.br/Casa-e-Decora%C3%A7%C3%A3o-cat.11059983/') # 等待商品列表加载完成 session.find('.col-xs-2-4.shopee-search-item-result__item') session.all('.col-xs-2-4.shopee-search-item-result__item').each do |product| link = product.find('a') puts link.text puts link[:href] end
方案2:修复选择器(仅语法参考)
如果后续遇到静态渲染的页面场景,可先修正CSS选择器,但此方法无法解决Shopee的动态加载问题,仅作语法示例:
require 'mechanize' agent = Mechanize.new page = agent.get('https://shopee.com.br/Casa-e-Decora%C3%A7%C3%A3o-cat.11059983/') # 修正后的选择器 page.css('.col-xs-2-4.shopee-search-item-result__item').each do |product| link = product.at('a') puts link&.text # 使用&.避免nil报错 end
额外提示
- Shopee存在反爬机制,频繁请求可能会被封禁IP,建议添加请求间隔、使用代理,并遵守网站
robots.txt规则。 - 优先考虑使用Shopee官方开放的API获取数据,这是更稳定合规的方式。
内容的提问来源于stack exchange,提问作者Lucas Cunha
相关产品推荐
相关产品推荐

