Python使用PyExecJS(execjs)解决P站爬虫一例

代码片段, 折腾 2019/10/16

好久没爬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']:
    ……
本文标签:


评论(*号为必填项)