使用Watir抓取部分隐藏列表中4600个元素的技术求助
解决滚动加载页面的数据抓取问题
看起来你遇到的核心问题是滚动加载的动态内容无法抓取,加上当前的元素定位和遍历逻辑有问题,导致连初始数据都抓不到。我来一步步帮你解决:
1. 先搞定滚动加载:让所有4600个元素都加载出来
这类动态加载的页面,必须模拟用户滚动行为,直到页面不再加载新内容。你可以用Watir执行JS脚本滚动到底部,循环判断元素数量是否停止增长:
def scroll_to_load_all(browser, item_selector) previous_item_count = 0 loop do # 执行JS滚动到页面底部 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待页面加载(时间可以根据实际加载速度调整,或者用更智能的等待) browser.wait_until { browser.elements(css: item_selector).count > previous_item_count } rescue break current_count = browser.elements(css: item_selector).count # 如果元素数量不再变化,说明所有内容都加载完了 break if current_count == previous_item_count previous_item_count = current_count puts "已加载 #{current_count} 个元素..." end end
2. 修正元素定位与数据提取逻辑
你当前的代码browser.th(...)用错了标签(th是表格表头标签,不是列表项),而且只尝试抓取单个元素,没有遍历所有项。根据你描述的结构,应该先定位到所有列表项,再逐个提取title和href:
# 替换成你实际的列表项选择器(用浏览器开发者工具确认类名组合) list_item_selector = "._9irns._pg23k._jpwof._gvoze" # 先滚动加载所有元素 scroll_to_load_all(browser, list_item_selector) # 遍历所有列表项,提取目标数据 browser.elements(css: list_item_selector).each_with_index do |item, index| begin # 提取href(假设链接是列表项内的a标签) item_href = item.link.href # 提取title(根据实际结构调整,比如是span的文本,或者元素的title属性) item_title = item.text.strip # 如果title在某个子span里,改成item.span.text.strip puts "#{index+1}. 标题:#{item_title} | 链接:#{item_href}" rescue StandardError => e puts "#{index+1}. 元素解析失败:#{e.message}" next end end
3. 你当前代码的问题分析
- 标签错误:
th是表格表头,你的列表项应该是div、li这类标签,直接用类选择器定位更可靠。 - 未遍历元素:
.th(...)只会返回第一个匹配的元素,要抓所有元素得用.elements(...)然后遍历。 - 未处理滚动加载:初始页面只加载可见元素,不滚动的话后面的4000+元素根本没渲染,自然抓不到。
额外注意事项
- 调整等待逻辑:如果页面加载慢,
wait_until比固定sleep更可靠,能避免过早判断加载完成。 - 验证选择器:用浏览器开发者工具的"检查元素"功能,复制列表项的CSS选择器,确保和代码里的一致。
- 处理异常:有些元素可能结构异常,加
rescue能避免单个元素出错导致整个脚本中断。
内容的提问来源于stack exchange,提问作者ahmed elbarky
相关产品推荐
相关产品推荐

