使用Ruby Mechanize填充otodom.pl表单失败的问题求助
解决Mechanize提交otodom.pl表单时参数丢失的问题
我之前折腾过类似的房产网站表单提交,otodom.pl的表单确实有几个容易踩坑的地方,导致你设置的字段值没被正确提交。咱们一步步来修正:
核心问题分析
你遇到的空结果页面,大概率是这两个原因:
- 没精准定位到正确的搜索表单,误操作了页面上的其他表单
- 字段名称填错了,现代网站的表单字段经常用嵌套命名(比如
location[city]),不是简单的city
修正后的代码示例
require 'mechanize' # 初始化Mechanize,先设置浏览器UA避免被拦截 agent = Mechanize.new agent.user_agent_alias = 'Chrome' # 访问主页 main_page = agent.get('https://www.otodom.pl/') # 精准定位搜索表单:优先用表单ID(看页面源码,otodom的搜索表单ID通常是search-form) # 如果ID找不到,就用action路径匹配,比如包含/search/的表单 search_form = main_page.form_with(id: 'search-form') || main_page.form_with(action: %r{/search/}) # 关键:设置正确的城市字段值 # 右键页面上的城市输入框→检查元素,查看input的name属性,通常是location[city] search_form['location[city]'] = 'Wrocław' # 指定提交按钮(波兰语的"搜索"是Szukaj,避免触发其他按钮) submit_button = search_form.button_with(value: 'Szukaj') result_page = search_form.submit(submit_button) # 验证结果:打印跳转后的URL和标题,确认是否带了城市参数 puts "跳转后的URL:#{result_page.uri}" puts "页面标题:#{result_page.title}"
几个必须注意的细节
- User-Agent一定要设:otodom会拦截Mechanize的默认UA,伪装成浏览器才能正常访问
- 字段名称要精准:别瞎猜字段名,一定要去页面源码里看输入框的
name属性——比如城市输入框的name大概率是location[city],不是city或者query - 表单定位要准确:页面上可能有多个表单(比如顶部搜索、侧边栏搜索),必须选对负责全局搜索的那个表单
- 检查隐藏参数:如果还是不行,看看表单里有没有隐藏的csrf token之类的字段,Mechanize会自动带上页面里的隐藏字段,但如果遇到动态生成的,可能需要手动抓取(不过otodom的基础搜索一般不需要)
如果以上方法还是不行,那可能是网站启用了JS渲染的表单逻辑,这时候Mechanize就搞不定了——毕竟它不支持JS,得换用Watir或者Selenium这类能模拟浏览器的工具。
内容的提问来源于stack exchange,提问作者Antonina K
相关产品推荐
相关产品推荐

