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

來源:互聯網
上載者:User

標籤:密碼   data-   .com   south   fetch   入口   命令   技術   ldb   

1,實現效果

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2xhbnphbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="320" height="300" >

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2xhbnphbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="600" height="300" >

2,資料庫


3。主要步驟

1,輸入帳號password,類比新浪微博登陸

2,抓取評論頁的內容

3。用正則表達式過濾出username,評論時間和評論內容

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

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

4,具體步驟


# -*- coding: utf-8 -*-import requestsimport base64import reimport urllibimport rsaimport jsonimport binasciiimport MySQLdbclass 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 MySQLdbclass 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 OutboxAnalysisfrom 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就能方便得下載安裝某模組啦~


本人新手菜鳥一僅僅,假設有什麼地方沒有寫好或者寫錯的地方,歡迎各位紅領巾批評指出。

全部代碼基本都貼出來了,假設有什麼疑惑,也非常歡迎一起討論。共同進步

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.