Python爬虫实战,requests模块,Python实现

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」。

前言

利用Python实现抓取芒果TV弹幕,废话不多说。

让我们愉快地开始吧~

开发工具

Python版本: 3.6.4

相关模块:

requests模块;

pandas模块

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

思路分析

本文以爬取电影《悬崖之上》为例,讲解如何爬取芒果TV视频的弹幕和评论!

目标网址

https://www.mgtv.com/b/335313/12281642.html?fpa=15800&fpos=8&lastp=ch_movie
复制代码

抓取弹幕

分析网址

弹幕数据所在的文件是动态加载的,需要进入浏览器的开发者工具进行抓包,得到弹幕数据所在的真实url。当视频播放一分钟它就会更新一个json数据包,里面包含我们需要的弹幕数据。

弹幕数据

获取真实的URL

https://bullet-ali.hitv.com/bullet/2021/08/14/005323/12281642/0.json\
https://bullet-ali.hitv.com/bullet/2021/08/14/005323/12281642/1.json
复制代码

可以发现,每条url的差别在于后面的数字,首条url为0,后面的逐步递增。视频一共120:20分钟,向上取整,也就是121条数据包。

代码实现

import requests\
import pandas as pd\
\
headers = {\
    'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'\
}\
df = pd.DataFrame()\
for e in range(0121):\
    print(f'正在爬取第{e}页')\
    resposen = requests.get(f'https://bullet-ali.hitv.com/bullet/2021/08/3/004902/12281642/{e}.json', headers=headers)\
# 直接用json提取数据\
    for i in resposen.json()['data']['items']:\
        ids = i['ids']  # 用户id\
        content = i['content']  # 弹幕内容\
        time = i['time']  # 弹幕发生时间\
        # 有些文件中不存在点赞数\
        try:  \
            v2_up_count = i['v2_up_count']\
        except:\
            v2_up_count = ''\
        text = pd.DataFrame({'ids': [ids], '弹幕': [content], '发生时间': [time]})\
        df = pd.concat([df, text])\
df.to_csv('悬崖之上.csv', encoding='utf-8', index=False)
复制代码

效果展示

效果

抓取评论

分析网页

芒果TV视频的评论需要拉取到网页下面进行查看。评论数据所在的文件依然是动态加载的,进入开发者工具,按下列步骤进行抓包:Network→js,最后点击查看更多评论。

抓包

加载出来的依然是js文件,里面包含评论数据。得到的真实url:

https://comment.mgtv.com/v4/comment/getCommentList?page=1&subjectType=hunantv2014&subjectId=12281642&callback=jQuery1820749973529821774_1628942431449&_support=10000000&_=1628943290494\
https://comment.mgtv.com/v4/comment/getCommentList?page=2&subjectType=hunantv2014&subjectId=12281642&callback=jQuery1820749973529821774_1628942431449&_support=10000000&_=1628943296653
复制代码

其中有差别的参数有page_,page是页数,_是时间戳;url中的时间戳删除后不影响数据完整性,但里面的callback参数会干扰数据解析,所以进行删除。最后得到url:

https://comment.mgtv.com/v4/comment/getCommentList?page=1&subjectType=hunantv2014&subjectId=12281642&_support=10000000
复制代码

数据包中每页包含15条评论数据,评论总数是2527,得到最大页为169。

评论数据

效果展示

效果