1-3 爬取微博上电影主题的热度(主题的阅读数和讨论数)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1-3 爬取微博上电影主题的热度(主题的阅读数和讨论数)相关的知识,希望对你有一定的参考价值。

 1 weiboHeat.py
 2 #-*- coding:utf-8 -*-
 3 ‘‘‘
 4 该脚本可以从wap版的微博网站上爬取热门电影的信息,
 5 尤其是其中的电影主题讨论数和阅读数
 6 ‘‘‘
 7 import json
 8 import requests
 9 from pandas import DataFrame
10 import time
11 headers = {User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/45.0.2454.101 Safari/537.36}
12 i=1  #网址中的规律项
13 movies=[]  #初始化电影列表
14 csvName=wh_allmovies.csv  #将要输入的文件的名字
15 cards=[1]  #为了冷启动,将cards列表设置为非空
16 #此处为动态加载问题,当可以从网页中获取内容时,不停循环
17 while(cards!=[]):
18     try:
19         if i==1:
20             j=2
21         else:
22             j=0
23         url=http://m.weibo.cn/page/pageJson?containerid=&containerid= 24             100803_ctg1_100_-_page_topics_ctg1__100&luicode=10000011&lfid= 25             100808d35a54c4ae10c8311e64ae96c776f206&v_p=11&ext=&fid= 26             100803_ctg1_100_-_page_topics_ctg1__100&uicode= 27             10000011&next_cursor=&page=+str(i)
28         resp=requests.get(url,headers=headers)
29         time.sleep(0.1)
30         content=json.loads((resp.text).decode(ascii).encode(utf-8))  #响应的text属性是json格式的数据
31         #通过分析json格式文本内容,发现规律#########
32         cards=content[cards]
33         card=cards[j]
34         card_group=card[card_group]
35         ############################################
36         movies=movies+card_group  #将card_group为每一次循环得到的包含10个电影信息的list列表
37         #将该列表不断添加到movies列表中,card_group的每一项为一个包含电影各种信息的字典
38         print i*10  #作为标记使用
39         i+=1  #每次循环i都加1
40     except:
41         print Error
42     finally:
43         movies_df = DataFrame(movies)  #每次循环都将movies列表转换为DataFrame格式文件,然后存入文件
44         # df1 = DataFrame({‘title‘: movies_df.ix[:, ‘card_type_name‘], ‘heat‘: movies_df.ix[:, ‘desc2‘],
45         #                  ‘scheme‘: movies_df.ix[:, ‘scheme‘],
46         #                  ‘pic‘: movies_df.ix[:, ‘pic‘]})
47         movies_df.to_csv(csvName, index=False, encoding=utf-8)
 1 weiboHeat_treatment.py
 2 #-*- coding:utf-8 -*-
 3 ‘‘‘
 4 该脚本可以针对得到的weiboHeat.csv文件进行处理
 5 添加电影主题讨论数discussNum、主题阅读数readNum、以及通过阅读数得到的热度分数
 6 ‘‘‘
 7 import pandas as pd
 8 from pandas import DataFrame
 9 df=pd.read_csv(wh_allmovies.csv)
10 # 取出所需要的列,并加上自定义的列名
11 df1=DataFrame({title:df.ix[:,card_type_name],heat:df.ix[:,desc2],
12                scheme:df.ix[:,scheme],
13                pic:df.ix[:,pic]})
14 #从DataFrame数据结构中取出heat列
15 heat=df1.ix[:,heat]
16 
17 #函数:将形如‘2.4亿阅读’的字符串转换成int格式的2400000000
18 #注意:输入的字符串为unicode编码格式
19 def getNum(heat):
20     if u亿 in heat:
21         temp=list(heat)  #将字符串转换成list列表,方便后续删除中文字符操作
22         temp.pop()
23         temp.pop()
24         temp.pop()  #执行该语句三次,将形如‘亿阅读’的字符串去掉
25         temp=‘‘.join(temp)  #将删除中文之后的剩余部分结合,得到的是str格式字符串
26         temp=float(temp)*100000000  #首先将str转换为float格式,再乘以1亿
27     elif u in heat:
28         temp = list(heat)
29         temp.pop()
30         temp.pop()
31         temp.pop()
32         temp = ‘‘.join(temp)
33         temp = float(temp) * 10000  #乘以1万
34     else:
35         temp = list(heat)
36         temp.pop()
37         temp.pop()
38         temp = ‘‘.join(temp)
39         temp = float(temp)  #不需要乘
40     return int(temp)  #将返回的值转换成int格式的数字
41 
42 #函数:根据电影的阅读量,得到电影的得分
43 def getScore(i):
44     if i>=0 and i<100000000:
45         return 1
46     elif i>=100000000 and i<300000000:
47         return 2
48     elif i>=300000000 and i<500000000:
49         return 3
50     elif i>=500000000 and i<700000000:
51         return 4
52     elif i>=700000000:
53         return 5
54     else:
55         return None
56 
57 discussNum=[]  #初始化讨论数列表
58 readNum=[]  #初始化阅读数列表
59 score_weibo=[]  #初始化微博热度的得分列表
60 for i in range(len(heat)):
61     heat_i=heat[i]  #取出每个热度项
62     # 将每个热度项转换成unicode编码,并按空格切分成长度为2的list
63     heat_iList=(heat_i.decode(utf-8)).split()
64     heat_discuss=heat_iList[0] #list的第一项为讨论数,形如‘275.8万讨论’
65     heat_read=heat_iList[1] #list的第二项为阅读数,形如‘13亿阅读’
66     discussNum.append(getNum(heat_discuss))  #调用getNum函数进行格式转换后,添加到列表中
67     readNum.append(getNum(heat_read))
68     score_weibo.append(getScore(getNum(heat_read)))  #调用getScore函数,将得到的分数添加到列表中
69 df2=DataFrame({discussNum:discussNum,readNum:readNum,score_weibo:score_weibo})  #得到DataFrme格式
70 df3=pd.concat([df1,df2],axis=1)
71 df3.to_csv(wh_allmovies_discussReadScore.csv,index=False)

 

以上是关于1-3 爬取微博上电影主题的热度(主题的阅读数和讨论数)的主要内容,如果未能解决你的问题,请参考以下文章

爬去微博热搜榜

Python爬取《流浪地球》豆瓣影评与数据分析

爬取知乎热搜

爬取微博热门话题

爬虫实例——爬取微博动态

python-爬取微博信息