300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > python3网易公开课爬虫实践

python3网易公开课爬虫实践

时间:2019-10-29 23:18:26

相关推荐

python3网易公开课爬虫实践

结果

这次先说结果吧,截止到目前(-01-28)位置总共爬了网易公开课4296个订阅号(有的订阅号是没有内容的),409030条内容(视频或者文章),243413个视频集合,内容里面的视频和视频集合里的视频是有重叠的.分别保存到open163_subscribe,open163_content,open163,3个collection的结构如下

数据抓取过程

首先,网易公开课的内容都是通过订阅号发布的,所以我先抓取了所有订阅号的信息

通过在浏览器里调试订阅号的首页,可以发现获取订阅号的接口:https://c./open/mob/subscribe/detail/info.do?subscribeId=

集合open163_subscribe保存的就是这个接口返回的信息.而且还发现订阅号的唯一标识subscribeId是数字的形式,所以只要从1开始自增就可以遍历所有的订阅号了(当然有的subscribeId是没有订阅号的,有可能是下架了,跳过就好)

def crawler_all_subscribe():empty = 0subscribeId = 4080while empty < 100:subscribe = crawler_subscribe(subscribeId)if 'subscribeName' in subscribe.keys():print(subscribe['subscribeName'])insert_subscribe(subscribe)crawler_content(subscribeId)empty = 0else:empty = empty + 1subscribeId = subscribeId + 1

同时在订阅号首页还有一个列出推送内容的接口:

https://c./open/mob/subscribe/detail/list.do?subscribeId=3994&rtypes=2%2C3%2C4%2C5%2C6%2C8%2C9%2C10%2C11%2C12&cursor=&pagesize=10

这里使用游标cursor来分页,最新一页cursor为空,每次请求结果会返回下一页的cursor,如不返回则为最后一页.接口返回的data字段(数组)即为存入open163_content中的内容.

其中,如果内容是视频类型的话,还会有一个plid字段,这个plid即为视频集合的唯一标识,通过抓取所有订阅号的所有内容,就可以获得所有视频集合的plid.

def crawler_content(subscribeId):content = []cursor = ''result = crawler_content_page(subscribeId, cursor)while 'data' in result.keys() and 'cursor' in result.keys():content = content + result['data']cursor = result['cursor']result = crawler_content_page(subscribeId, cursor)if 'data' in result.keys():content = content + result['data']print(len(content))insert_contents(content)def crawler_content_page(subscribeId, cursor=''):# print(subscribe_url_prefix)url = content_url_prefix + '&subscribeId=' + str(subscribeId) + '&cursor=' + cursorresponse = urllib.request.urlopen(url)result = response.read().decode('utf-8')content = json.loads(result)if content is None or 'data' not in content.keys():return {}return content

有了视频集合的plid,就可以通过这个接口来获取视频信息了:https://c./mob/${plid}/getMoviesForAndroid.do

返回结果中的data即为存入open163中的内容.

def insert_movies(plid):try:response = urllib.request.urlopen(movies_url_prefix + plid + movies_url_suffix)result = response.read().decode('utf-8')data = json.loads(result)if data['code'] == 200:try:collection.insert_one(data['data'])except pymongo.errors.DuplicateKeyError:passexcept:print(plid)

分析

收集了这么多数据,可以用来做一些分析了,比如,可以看一下那些订阅号最受欢迎:

可以看出,订阅数最多的都是一些subscribeId比较小的,这可能是因为最开始推出的订阅号都是一些竞品,审核比较严格,还有就是时间的积累,订阅用户因此比较多.

然后,我们还可以看到有不少订阅号是没有发布内容的:

可以统计出最火(浏览次数最多)的内容,结果如下(截至-02-28)

关于播放次数,这里给出的和APP里的是一致的,但是网页版的播放次数以及评论数量都要比APP上高很多,这个具体是怎么计算的不得而知.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。