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

【豆瓣电影爬虫】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于北京-------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值