python 爬取腾讯视频的所有评论

1、网址分析

查阅了网上的大部分资料,大概都是经过抓包获取。可是抓包有点麻烦,尝试了F12,也能够获取到评论。以电视剧《在一块儿》为例子。评论最底端有个查看更多评论猜想过去应该是 Ajax 的异步加载。
网上的大部分都是构建评论的网址,经过 requests 获取,正则表达式进行数据处理。本文也利用该方法进行数据处理,其实利用 scrapy 会更简单。
根据前辈给出的经验,顺利找到了评论所在的连接。html


在新标签中打开,该网址的连接。python

评论都在"content":"xxxxx"里面,全部能够经过正则表达式获取。
那么如今要开始构建网址,找到其规律。
在查找评论连接的过程当中无心发现,点击影评旁边的评论总数,能够获取到更为干净的评论界面。结果是同样的。git

既然是要爬取全部的评论,因此知道评论数是必不可少的。github

再经过F12获取到评论连接,找到网址的规律,构建网址,加载三四个评论就好了。这里加载了四个网址。把全部网址复制到文本文件中,进行对比分析。正则表达式

观察发现只有 cursor 和 source 进行了改变,其余是不变的,二 source 是在第一个的基础上进行加一操做,因此只须要获取到 cursor 便可。咱们打开一个评论连接的网址,咱们能够知道,cursor 实际上是上一页 最后一个用户的ID码。因此咱们只须要在爬取上一页的时候一块儿爬虫了。而后就能够构建网址。docker

2、代码编写

这个代码仍是简单的。套用以前上课作的模板就能够直接进行爬虫了。
经过正则表达式获取评论,返回一个列表;
正则表达式得到的 cursor 码是列表,因此要转化为字符串使用;
source 很简单了,直接在上一个的基础上加一便可。python爬虫

def getComment(html):  # 爬取单页评论

    findeComment = re.compile(r'"content":"(.*?)"', re.S)
    comment = re.findall(findeComment, html)
    # print(comment)
    return comment

def getCursor(html):  # 获取下一页的cursor码
    findeCursor = re.compile(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)

有点难度的可能就送弄代理吧,可是代理能够模仿网上其余人的写法,因此仍是不是很难。dom

#添加用户代理

def ua(uapools):
    thisua = random.choice(uapools)
    # print(thisua)
    headers = ("User-Agent", thisua)
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    # 设置为全局变量
    urllib.request.install_opener(opener)

3、遇到的问题

1. 获取评论的时候也将子评论爬虫进去了。

仔细查看了源码,发现评论主要在 data 下面的 oriCommList 列表里,其余范围的评论为子评论。我的认为子评论也算有效评论,目前不打算处理。
异步

2. 获取所有评论数,直接经过 requests 获取不到

尝试了 xpath 和 requests 发现不能获取所有评论数,因此目前只能经过 selenium 获取,可是 selenium 效率过低了,就获取一个评论总数,还不如打开源码直接修改评论总数,因此暂时没有修改scrapy

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万条吧。

4、完整代码

GitHub地址

参考资料

Python爬虫实战:爬取腾讯视频的评论
python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫
应对反爬虫最简单的策略——随机UA+递归request

相关文章
相关标签/搜索