python爬取腾讯视频评论
⼀、⽹址分析
查阅了⽹上的⼤部分资料,⼤概都是通过抓包获取。但是抓包有点⿇烦,尝试了F12,也可以获取到评论。以为例⼦。评论最底端有个查看更多评论猜测过去应该是 Ajax 的异步加载。
⽹上的⼤部分都是构建评论的⽹址,通过 requests 获取,正则表达式进⾏数据处理。本⽂也利⽤该⽅法进⾏数据处理,其实利⽤ scrapy 会更简单。
根据前辈给出的经验,顺利到了评论所在的链接。
在新标签中打开,该⽹址的链接。
评论都在"content":"xxxxx"⾥⾯,所有可以通过正则表达式获取。
那么现在要开始构建⽹址,到其规律。
在查评论链接的过程中⽆意发现,点击影评旁边的评论总数,可以获取到更为⼲净的评论界⾯。结果是⼀样的。
既然是要爬取所有的评论,所以知道评论数是必不可少的。
再通过F12获取到评论链接,到⽹址的规律,构建⽹址,加载三四个评论就⾏了。这⾥加载了四个⽹址。把所有⽹址复制到⽂本⽂件中,进⾏对⽐分析。
观察发现只有 cursor 和 source 进⾏了改变,其他是不变的,⼆ source 是在第⼀个的基础上进⾏加⼀操作,所以只需要获取到 cursor 即可。我们打开⼀个评论链接的⽹址,我们可以知道,cursor 其实是上⼀页最后⼀个⽤户的ID码。所以我们只需要在爬取上⼀页的时候⼀起爬⾍了。然后就可以构建⽹址。
⼆、代码编写
这个代码还是简单的。套⽤之前上课做的模板就可以直接进⾏爬⾍了。
通过正则表达式获取评论,返回⼀个列表;
正则表达式获得的 cursor 码是列表,所以要转化为字符串使⽤;
source 很简单了,直接在上⼀个的基础上加⼀即可。
def getComment(html): # 爬取单页评论
findeComment = repile(r'"content":"(.*?)"', re.S)
comment = re.findall(findeComment, html)
# print(comment)
return comment
def getCursor(html): # 获取下⼀页的cursor码
findeCursor = repile(r'"last":"(.*?)"', re.S)
cursor = re.findall(findeCursor, html)[0]
# print(cursor)
return cursor
def getSource(source): # 获取下⼀页的source码
source = int(source) + 1
return str(source)
有点难度的可能就送弄代理吧,但是代理可以模仿⽹上其他⼈的写法,所以还是不是很难。
#添加⽤户代理
def ua(uapools):
thisua = random.choice(uapools)
# print(thisua)
headers = ("User-Agent", thisua)
opener = quest.build_opener()
opener.addheaders = [headers]
# 设置为全局变量
三、遇到的问题
1. 获取评论的时候也将⼦评论爬⾍进去了。xpath语法 python
仔细查看了源码,发现评论主要在 data 下⾯的 oriCommList 列表⾥,其他范围的评论为⼦评论。个⼈认为⼦评论也算有效评论,⽬前不打算处理。
2. 获取全部评论数,直接通过 requests 获取不到
尝试了 xpath 和 requests 发现不能获取全部评论数,所以⽬前只能通过 selenium 获取,但是 selenium 效率太低了,就获取⼀个评论总数,还不如打开源码直接修改评论总数,所以暂时没有修改3. 评论总数数据太⼤
因为之前爬⾍过很多⽹站,同⼀个 user-agent 很容易被 ban ,所以⽬前构建了⽤户代理,然后进⾏随机。其实还想加⼀个 ip 代理的,但是使⽤了 ip 代理的⽹址,上⾯写的正常的 ip ,在使⽤的时候,拒绝连接。也尝试过构建代理池。但是代理池⼀般都是使⽤docker 和 Redis 进⾏获取。暂时没有选⽤,之选⽤了⽤户代理,然后在获取 headers 的时候加个 time.sleep(1)。⽬前还是正常的。
4. 报错'utf-8' codec can't decode byte 0xff in position 1: invalid start byte
遇到这个问题,实在⽆语,我怀疑后⾯的评论是新出的 emjoy,然后utf-8不能识别,程序挂掉了。但是选取其他格式,在解释的过程估计还会挂掉,就暂时爬到1万条吧。
四、完整代码
参考资料
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论