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

 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)
原文地址:https://www.cnblogs.com/PistonType/p/5499024.html