使用Scrapy-Splash抓取europages动态手机号点击操作不生效问题咨询
问题原因及解决方案
1. LUA脚本逻辑问题
- 未校验目标元素是否成功加载,网络延迟导致元素还没渲染就执行选择逻辑,直接静默失败,看起来就是点击未生效
- 固定等待时间不可靠,代理波动、站点响应慢都会导致手机号还没加载完成就返回了页面源码
- 手动计算坐标点击没有必要,
mouse_click默认就是点击元素中心,坐标计算偏差反而可能触发无效点击
修改后的LUA脚本参考:
function main(splash) splash.private_mode_enabled = false -- 配置正常浏览器UA,避免被站点识别为爬虫拦截 splash:set_user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") -- 关闭图片加载减少资源占用,不影响JS执行 splash.images_enabled = false assert(splash:go(splash.args.url)) -- 等待目标元素加载完成,最多等5秒,加载失败直接报错方便排查 assert(splash:wait_for(function() return splash:select('.page-action.click-tel') ~= nil end, 5)) local element = splash:select('.page-action.click-tel') element:mouse_click() -- 等待手机号渲染完成,代替固定等待,判断逻辑可根据实际页面展示规则调整 assert(splash:wait_for(function() return string.find(element:text(), '%d%d+') ~= nil end, 10)) return splash:html() end
2. 配置校验
- 确认代理字符串格式正确:带用户名密码的代理标准格式为
http://用户名:密码@代理地址:端口,拼写错误会导致点击后请求手机号的接口被拦截 - 可先关闭代理做本地测试,排除代理本身的可用性问题
- 现有scrapy_splash的中间件、缓存配置无问题,不需要额外调整
3. 快速排查手段
- 打开本地Splash可视化调试界面,把LUA脚本粘贴进去直接运行,可直观看到点击效果和返回内容,快速区分是脚本问题还是Scrapy调用问题
- 在parse函数中先打印完整的
response.text,排除BeautifulSoup选择器写错导致的取值失败问题
补充
如果以上调整后点击仍未生效,检查.page-action.click-tel节点的子元素,部分站点会把点击事件绑定在内部的<span>或<a>标签上,直接选中子元素执行点击即可。
内容的提问来源于stack exchange,提问作者IndiaSke
相关产品推荐
相关产品推荐

