【豆瓣电影爬虫】2019/11/21/Python豆瓣电影爬虫+D3.js WordCloud
1.目标
今天临时需要将100部票房最高的电影【from艺恩网:如图1】,找到对应的豆瓣评分,制作D3词云图(因为只需要图片其实Python画超快,只是D3画是矢量图,放大缩小都不会不清晰),本来以为很快就搞定了,后来发现豆瓣爬虫先有了问题。
图1.内地票房
处理后获得初步数据
对票房数据做了处理适合生成词云图
2.豆瓣API利用(花时间最长的步骤)
发现很多官方API都挂了,很久找到一个可以用的,但是不能直接搜索q(详细的名字),只能查tag(不精确)。
basic_url = "https://movie.douban.com/j/search_subjects?type=movie&tag={}&page_limit=50&page_start=0&tdsourcetag=s_pcqq_aiomsg&qq-pf-to=pcqq.c2c"
tag的{}里是填想要搜索的电影名字,如果想搜索战狼
就是"https://movie.douban.com/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:\/\/movie.douban.com\/subject\/26665255\/","playable":false,"cover":"https://img1.doubanio.com\/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:\/\/movie.douban.com\/subject\/26363254\/","playable":true,"cover":"https://img3.doubanio.com\/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"] + '"' ##匹配moviename
pattern_title = re.compile(str_title)
str_id = '"rate":"' + '[0-9]*' +'.[0-9]' ##匹配评分
pattern_id = re.compile(str_id)
id_list = [] # 评分存放列表
for l in html_list: # 遍历html_list
find_results_title = re.findall(pattern_title, l, flags=0) # 找到匹配该剧name的条目item
if 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来解析相应电影网页。
----2019/11/21 22:27 EchoZhang于北京-------------------------------