zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    判断开始时间不能小于结束时间
    angular1.0使用echarts点刷新再次调用echarts方法
    解决angular4.0打包后不能再继续打包
    html拼接+layer按钮
    angular.js+echarts
    nginx配置
    NET_Framework_4.0installer.rar
    IIS6.0开启gzip压缩
    IIS的应用程序池优化方法
    远程桌面连接电脑后键盘失灵解决
  • 原文地址:https://www.cnblogs.com/PistonType/p/5499024.html
Copyright © 2011-2022 走看看