Python使用PyExecJS(execjs)解决P站爬虫一例
好久没爬P站的feed列表了,跑起来一看,居然解析不了视频的链接了,打开视频页面源码检查,发现P站对视频信息存放的变量做了小修改。
以前视频信息是在页面加载时,视频信息就已经直接存放在 flashvars_ + videoId
这样的变量中的
爬的时候只需要抓取页面,解析其json对应分辨率的链接即可,如 quality":"1080","videoUrl":"......"
、quality":"720","videoUrl":"......"
现在多了一步,flashvars_ + videoId
初始变量的videoUrl先初始,不赋值
然后通过一系列骚操作二次赋值,所以在浏览器中可以正常获取 flashvars_ + videoId
的值,而爬虫端无法解析js,导致爬虫获取不到对应的videoUrl。如图:
所谓互联网的第一生产力是s*e*x,继续捣鼓呗。
其实Python是可以执行js的,需要用到PyExecJS(execjs) https://pypi.org/project/PyExecJS/
用法不再赘述,只记录一下踩坑过程
调试过程中出现 Could not find a JavaScript runtime
错误,没装nodejs导致
yum install nodejs -y
核心代码
#先爬核心段内容,以便获取videoId
all = htmlContent.xpath('//*[@id="player"]')[0]
videoId = re.findall('data-video-id="(.+?)"', etree.tostring(all))[-1]
#再爬js内容
js = htmlContent.xpath('//*[@id="player"]/script/text()')[0]
#执行js
#需要补充完整
jscontext = execjs.compile("var loadScriptVar=[];var loadScriptUniqueId=[];var playerObjList = {};"+js)
#获取flashvars_变量
res = jscontext.eval('flashvars_'+videoId)
#遍历1080p、720p等等视频信息
for _dict in res['mediaDefinitions']:
……
一条评论
good,谢啦