1,实现效果

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

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

2,数据库



3。主要步骤

1,输入账号password,模拟新浪微博登陆

2,抓取评论页的内容

3。用正則表達式过滤出username,评论时间和评论内容

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就能方便得下载安装某模块啦~

本人新手菜鸟一仅仅,假设有什么地方没有写好或者写错的地方,欢迎各位红领巾批评指出。

全部代码基本都贴出来了,假设有什么疑惑,也非常欢迎一起讨论。共同进步

python抓取新浪微博评论并分析的更多相关文章

  1. 测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇

    测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇   在前面我分享了几个新浪微博的自动化脚本的实现,下面我们继续实现新的需求,功能需求如下: 1,登陆微博 2,抓取评论页内容3,用正则表 ...

  2. Python抓取微博评论(二)

    对于新浪微博评论的抓取,首篇做的时候有些考虑不周,然后现在改正了一些地方,因为有人问,抓取评论的时候“爬前50页的热评,或者最新评论里的前100页“,这样的数据看了看,好像每条微博的评论都只能抓取到前 ...

  3. Python抓取微博评论

    本人是张杰的小迷妹,所以用杰哥的微博为例,之前一直看的是网页版,然后在知乎上看了一个抓取沈梦辰的微博评论的帖子,然后得到了这样的网址 然后就用m.weibo.cn进行网站的爬取,里面的微博和每一条微博 ...

  4. Python爬取新浪微博评论数据,写入csv文件中

    因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cook ...

  5. 使用Python抓取猫眼近10万条评论并分析

    <一出好戏>讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何? 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演 ...

  6. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

  7. 使用python抓取并分析数据—链家网(requests+BeautifulSoup)(转)

    本篇文章是使用python抓取数据的第一篇,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取.通过使用requests库对链家网二手房列表页进行抓取,通过Beautifu ...

  8. Python抓取豆瓣《白夜追凶》的评论并且分词

    最近网剧<白夜追凶>在很多朋友的推荐下,开启了追剧模式,自从琅琊榜过后没有看过国产剧了,此剧确实是良心剧呀!一直追下去,十一最后两天闲来无事就抓取豆瓣的评论看一下 相关代码提交到githu ...

  9. python抓取知乎热榜

    知乎热榜讨论话题,https://www.zhihu.com/hot,本文用python抓取下来分析 #!/usr/bin/python # -*- coding: UTF-8 -*- from ur ...

随机推荐

  1. hadoop无法启动DataNode问题

    因为种种原因,今天又一次安装hadoop集群.清空了/tmp下的文件夹,重新启动集群,hadoop namenode -format 之后  start-all   可是没有发现DataNode的守护 ...

  2. 关于App class loader的总结

    关于App class loader的总结 2010-05-11 15:19:09 分类: 系统运维 Java本身是一种设计的非常简单,非常精巧的语言,所以Java背后的原理也很简单,归结起来就是两点 ...

  3. 王立平--TF卡

    最终知道TF卡是什么了... TF卡又称microSD,是一种极细小的快闪存储器卡,由SanDisk(闪迪)公司发明创立. 这样的卡主要于手机使用.但因它拥有体积极小的长处,随着不断提升的容量. 它慢 ...

  4. Codeforces Gym 100015F Fighting for Triangles 状态压缩DP

    F Fighting for Triangles Description Andy and Ralph are playing a two-player game on a triangular bo ...

  5. bzoj3713: [PA2014]Iloczyn(乱搞)

    3713: [PA2014]Iloczyn 题目:传送门 题解: 随手一发水题x2 直接离线啊,斐波那契到了第五十个就炒鸡大了 代码: #include<cstdio> #include& ...

  6. Redis学习笔记(七) 基本命令:Set操作

    原文链接:http://doc.redisfans.com/set/index.html 虽然set和list很相似但还是有一些差别的,如set中的顺序没有先后之分,所以不像list一样可以在首尾增删 ...

  7. ORM框架——Dapper的应用

    常见的ORM框架有EF,Dapper,NHibernate 参考:http://shuai7boy.iteye.com/blog/2357339 http://www.cnblogs.com/Sint ...

  8. Chrome添加Unity本地文档引擎

    前提:输入Unity后出来的第一连接 浏览器的设置: 分别填入: UnityDocs unity3d.com/cn file:///Applications/Unity/Documentation/e ...

  9. .net基础总复习(3)

    第三天 2.单例模式 1)  将构造函数私有化 2)  提供一个静态方法,返回一个对象 3)  创建一个单例 3.XML 可扩展的标记语言 XML:存储数据 注意: XML严格区分大小写,并且成对出现 ...

  10. [luogu 2568] GCD (欧拉函数)

    题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入样例#1: 4 输出样例#1: 4 ...