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)
时间: 2024-10-14 13:34:09