使用Apify Webscraper抓取LinkedIn视频时长无返回值的问题咨询
Apify Webscraper抓取LinkedIn视频时长返回空值排查
已确认的场景
- 目标存储元素为类名
vjs-duration-display的span标签,全局唯一,文本内容为视频时长(示例为1:00) - 现有代码可正常返回当前页面URL,仅时长字段持续返回空值
核心错误点
- 取值API使用错误:现有代码通过
$('span[class=vjs-duration-display]').text取值,混淆了jQuery封装对象和原生DOM对象的API差异。jQuery实例获取元素文本必须调用.text()方法,直接读取.text属性只会得到undefined,无法拿到实际存储的时长字符串。 - 选择器匹配逻辑不严谨:现有代码使用
span[class=vjs-duration-display]属性选择器,要求元素的class属性值与输入字符串完全一致才能命中。LinkedIn的VideoJS播放器组件会动态给容器追加附加类名,这种完全匹配的写法很容易因为类名值不纯粹而选择失效,提取单一类名的元素直接使用类选择器.vjs-duration-display即可,兼容类名附带其他参数的场景。 - 动态元素加载时机不匹配:LinkedIn的视频时长元素是播放器初始化完成后才会插入DOM、填充时长值的,现有代码在页面刚触发加载完成事件时就立刻执行取值逻辑,此时播放器尚未完成初始化,目标元素可能还不存在,自然无法提取到内容。
修正后的可运行代码
async function pageFunction(context) { const { request, log, jQuery: $, waitFor } = context; if (request.userData.label === "PAGE"){ log.info('LinkedIn page opened'); // 等待目标时长元素渲染完成,超时时间设置为10秒 await waitFor('span.vjs-duration-display', { timeout: 10000 }); } return { url: context.request.url, // 正确调用jQuery的text()方法提取文本,去除多余空格 duration: $('span.vjs-duration-display').text().trim(), }; }
补充注意事项
- 如果抓取的页面包含多个视频播放器,上述选择器可能命中多个时长值,可通过定位对应视频的外层容器,再查找容器内的子元素完成提取,避免取到错误的时长数据。
- 如果等待元素超时,可适当延长
waitFor的超时时间,适配网络较差时的页面加载速度。
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

