1. 程式人生 > >python抓取新浪微博評論並分析

python抓取新浪微博評論並分析

1,實現效果


2,資料庫


3,主要步驟

1,輸入賬號密碼,模擬新浪微博登陸

2,抓取評論頁的內容

3,用正則表示式過濾出使用者名稱,評論時間和評論內容

4,將得到的內容存入資料庫

5,用SQL語句實現其他功能:例如統計評論次數等

4,詳細步驟

# -*- coding: utf-8 -*-
import requests
import base64
import re
import urllib
import rsa
import json
import binascii
import MySQLdb

class Userlogin:
    def userlogin(self,username,password,pagecount):
        session = requests.Session()
        url_prelogin = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.5)&_=1364875106625'
        url_login = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.5)'

        #get servertime,nonce, pubkey,rsakv
        resp = session.get(url_prelogin)
        json_data  = re.search('\((.*)\)', resp.content).group(1)
        data       = json.loads(json_data)
        servertime = data['servertime']
        nonce      = data['nonce']
        pubkey     = data['pubkey']
        rsakv      = data['rsakv']

        # calculate su
        su  = base64.b64encode(urllib.quote(username))

        #calculate sp
        rsaPublickey= int(pubkey,16)
        key = rsa.PublicKey(rsaPublickey,65537)
        message = str(servertime) +'\t' + str(nonce) + '\n' + str(password)
        sp = binascii.b2a_hex(rsa.encrypt(message,key))
        postdata = {
                            'entry': 'weibo',
                            'gateway': '1',
                            'from': '',
                            'savestate': '7',
                            'userticket': '1',
                            'ssosimplelogin': '1',
                            'vsnf': '1',
                            'vsnval': '',
                            'su': su,
                            'service': 'miniblog',
                            'servertime': servertime,
                            'nonce': nonce,
                            'pwencode': 'rsa2',
                            'sp': sp,
                            'encoding': 'UTF-8',
                           'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
                            'returntype': 'META',
                            'rsakv' : rsakv,
                            }
        resp = session.post(url_login,data=postdata)
        # print resp.headers
        login_url = re.findall('replace\(\'(.*)\'\)',resp.content)
        #
        respo = session.get(login_url[0])
        uid = re.findall('"uniqueid":"(\d+)",',respo.content)[0]
        url = "http://weibo.com/u/"+uid
        respo = session.get(url)
        # print respo.content #獲取首頁的內容html
#以上為成功登陸微博

        #獲取資料庫連線
        conn = MySQLdb.connect(host='localhost',user='root',passwd='root',db='weiboanalysis',charset='utf8')
        curs = conn.cursor()
        curs.execute('delete from outbox')

        myheaders={}
        myheaders['set-cookie'] = resp.headers['set-cookie']


        myheaders['Referer'] = 'http://weibo.com/comment/inbox?leftnav=1&wvr=5'
        # print myheaders

#以下是開始抓取資訊
        for i in range(1,int(pagecount)+1):
            forwardUrl = """http://weibo.com/comment/inbox?topnav=1&wvr=5&f=1&page=%d"""%i
            r = session.post(forwardUrl,headers=myheaders)
            page = r.content
            # print page

            #獲取並過濾出使用者名稱,存在pagename陣列
            pagename = re.findall('<a\s*title=[^>]*usercard[^>]*>',page)
            for n in range(0,len(pagename)):
                pagename[n] = pagename[n].split('\\"')[1]

            #獲取並過濾出評論時間,存在pagetime陣列
            pagetime = re.findall('WB_time S_func2[^>]*>[^>]*>',page)
            for t in range(0,len(pagetime)):
                pagetime[t] = pagetime[t].split('>')[1].split('<')[0]

            #獲取並過濾出評論內容,存在pagecont陣列
            pagecont={}
            pagecontent = re.findall(r'<p class=\\\"detail\\(.*?)<\\\/p>',page)
            for t in range(0,len(pagecontent)):
                a = pagecontent[t].split("<\/a>")
                b = a[len(a)-1]
                c = re.sub(r"<img(.*?)>",'[表情]',b) #去掉圖片表情
                d = re.sub(r"<span(.*?)span>",'',c)
                pagecont[t] = re.sub(r"\\t|:|:",'',d)  #去掉最後的/t和最前的冒號

            for index in range(0,len(pagetime)):
                sql = """ insert into outbox(uname,time,text) values('%s','%s','%s')"""%(pagename[index],pagetime[index],pagecont[index])
                curs.execute(sql)


        conn.commit()
        curs.close()
        conn.close()

從資料庫獲取評論並分析:
# -*- encoding:utf-8 -*-
__author__ = 'lanzao'
import MySQLdb

class OutboxAnalysis:

    def getMost(self,num):<span style="white-space:pre">		</span>#檢視評論最多的前num個人
        conn =  MySQLdb.connect(host='localhost',user='root',passwd='root',db='weiboanalysis',charset='utf8')
        curs = conn.cursor()
        sql="""
        select uid,uname,count(uname) as count
        from outbox
        group by uname
        order by count(uname) desc
        limit %d;
        """% int(num)
        curs.execute(sql)
        conn.commit()
        print "******************評論次數排行榜************************"
        for item in curs.fetchall():
            print item[1]+" ",str(item[2])+"次"
        print "*******************************************************"
        curs.close()
        conn.close()

    def getUser(self,user):<span style="white-space:pre">	</span>#檢視某使用者評論
        conn =  MySQLdb.connect(host='localhost',user='root',passwd='root',db='weiboanalysis',charset='utf8')
        curs = conn.cursor()
        curs.execute("""select * from outbox where uname='%s'"""%user)
        print "*****************************************"
        for item in curs.fetchall():
            print item[1]+"   ",item[2]+"   ",item[3]
        print "*****************************************"
        curs.close()
        conn.close()
程式入口:
# -*- encoding:utf-8 -*-
__author__ = 'lanzao'

from OutboxAnalysis import OutboxAnalysis
from UserLogin import Userlogin;

def menu():
    print"""
        選擇你想要的功能:
        0,退出
        1,查詢評論數最多的人
        2,查詢某使用者的所有評論
        3,登陸微博並抓取評論
    """
def menuChoice():
    choice = raw_input("輸入你的選擇(0/1/2/3):")
    while choice != '0':
        if choice == '3':
            username = raw_input("輸入新浪微博賬號:")
            password = raw_input("輸入密碼:")
            pagecount = raw_input("輸入想要抓取評論的頁數:")
            o = Userlogin()
            o.userlogin(username=username,password=password,pagecount=pagecount)
            print "抓取完畢"
            choice = raw_input("輸入你的選擇(0/1/2/3):")
        elif choice == '1':
            num = raw_input("你想檢視前幾個人?請輸入數字:")
            o = OutboxAnalysis()
            o.getMost(num)
            choice = raw_input("輸入你的選擇(0/1/2/3):")
        elif choice == '2':
            name = raw_input("你想檢視誰的評論:")
            o = OutboxAnalysis()
            o.getUser(name)
            choice = raw_input("輸入你的選擇(0/1/2/3):")
        else:
            print """choice=%s"""%choice
            print "輸入無效"
            choice = raw_input("輸入你的選擇(0/1/2/3):")

menu()
menuChoice()




5,相應模組的安裝

import requests
import base64
import re
import urllib
import rsa
import json
import binascii
import MySQLdb

推薦好用的Python的包管理工具:pip

安裝PIP的教程網上很多,裝好後,直接在CMD的黑窗口裡用命令pip install xxx就能方便得下載安裝某模組啦~

本人新手菜鳥一隻,如果有什麼地方沒有寫好或者寫錯的地方,歡迎各位紅領巾批評指出。所有程式碼基本都貼出來了,如果有什麼疑惑,也很歡迎一起討論,共同進步吐舌頭