100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 【豆瓣电影】/11/21/Python搜索豆瓣电影(Top100)爬虫+D3.js词云(票房和豆瓣评分)实现

【豆瓣电影】/11/21/Python搜索豆瓣电影(Top100)爬虫+D3.js词云(票房和豆瓣评分)实现

时间:2020-01-06 18:48:28

相关推荐

【豆瓣电影】/11/21/Python搜索豆瓣电影(Top100)爬虫+D3.js词云(票房和豆瓣评分)实现

【豆瓣电影爬虫】/11/21/Python豆瓣电影爬虫+D3.js WordCloud

1.目标

今天临时需要将100部票房最高的电影【from艺恩网:如图1】,找到对应的豆瓣评分,制作D3词云图(因为只需要图片其实Python画超快,只是D3画是矢量图,放大缩小都不会不清晰),本来以为很快就搞定了,后来发现豆瓣爬虫先有了问题。

图1.内地票房

处理后获得初步数据

对票房数据做了处理适合生成词云图

2.豆瓣API利用(花时间最长的步骤)

发现很多官方API都挂了,很久找到一个可以用的,但是不能直接搜索q(详细的名字),只能查tag(不精确)。

basic_url = "/j/search_subjects?type=movie&tag={}&page_limit=50&page_start=0&tdsourcetag=s_pcqq_aiomsg&qq-pf-to=pcqq.c2c"

tag的{}里是填想要搜索的电影名字,如果想搜索战狼

就是"/j/search_subjects?type=movie&tag=我和我的祖国&page_limit=50&page_start=0&tdsourcetag=s_pcqq_aiomsg&qq-pf-to=pcqq.c2c"

返回的这个东西【图2】,通过requests和beautifulsoup解析后得到的不是里面是列表的字典,他是个字符串。。。。一定要注意

{"subjects":[{"rate":"","cover_x":749,"title":"战狼3","url":"https:\/\/\/subject\/26665255\/","playable":false,"cover":"\/view\/photo\/s_ratio_poster\/public\/p2495511299.jpg","id":"26665255","cover_y":999,"is_new":false},{"rate":"7.1","cover_x":1024,"title":"战狼2","url":"https:\/\/\/subject\/26363254\/","playable":true,"cover":"\/view\/photo\/s_ratio_poster\/public\/p2494701965.jpg","id":"26363254","cover_y":1548,"is_new":false}]}

需要用下面代码解析成正常的列表形式待用:

html_list = s.split('},{') # 将html页面中的每一个条目提取为列表的一个元素。# 定义正则,目的是从html中提取想要的信息(根据title提取id)str_title = '"title":"' + data[url]["text"] + '"' ##匹配movienamepattern_title = pile(str_title)str_id = '"rate":"' + '[0-9]*' +'.[0-9]' ##匹配评分pattern_id = pile(str_id)id_list = [] # 评分存放列表for l in html_list: # 遍历html_listfind_results_title = re.findall(pattern_title, l, flags=0) # 找到匹配该剧name的条目itemif find_results_title != []: # 如果有title=name的条目,即如果有匹配的结果find_results_id = re.findall(pattern_id, l, flags=0) id_list.append(find_results_id[-3:]) ## id_list标准列表格式id_list = str(id_list).replace('[', '').replace(']', '').replace("'", '').replace('"id":"', '').replace(' ', '')id_list = id_list.split(',')if id_list[0]=="":data[url]["rate"]=1121#data是上面那个最前面已经获得票房数据的data,往里面加一项豆瓣评分,url为当前循环所在的下标#可能查询不到,就随便存一个固定值提醒自己这个没查到需要最后手工填上else:data[url]["rate"] = eval(id_list[0][-3:])

得到这个结果:打印出url,解析网页得到的信息,得到的评分

一般url得到的结果可能会没有,可能有多个,还需要自己匹配下

数据基本上搞定了

3.D3.js词云

时间关系,画个最简单的,这个基本上用v3版本比较简单。

票房前100的电影的票房词云图:

D3版本

用echarts也画了一版本,的确缩放没有D3清晰,但一般动态的我更喜欢用echarts:

echarts版本

top100的评分词云图:

D3版本

不是很难的小实验,花了一下午时间,反思记录一下!

最大的收获,对豆瓣爬虫有了新的概念

当然,每个电影对应豆瓣里一个ID,也可以通过ID来解析相应电影网页。

----/11/21 22:27 EchoZhang于北京-------------------------------

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