python抓取新浪微博评论并分析

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

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

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

时间: 2025-01-20 06:57:10

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

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

因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cookies和headers # -*- coding: utf-8 -*- import requests import csv import os base_url = 'https://m.weibo.cn/api/comments/show?id=4131150395559419&page={pa

[python]利用selenium模拟用户操作抓取天猫评论数据

准备: python3.5 安装selenium包 第一种方法: cmd里输pip install selenium,但是经常报错 第二种方法: 下载安装包-cmd进入解压路径-python setup.py install-报错permission denied-右键安全更改报错文件夹权限为完全控制-再次安装成功unknown error: unable to discover open pages-下载chromedriver放在环境变量目录下测试自动打开百度时提示"您使用的是不受支持的命令

《一出好戏》讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何?

黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演阵容强大,相信许多观众也都是冲着明星们去的.目前<一出好戏>在猫眼上已经获得近60万个评价,评分为8.2分,票房已破10亿. 作者本人(汤小洋 )今天也走进了电影院,对这部电影做了亲身的观看,看完后的感觉是有些许失落的,本以为是喜剧片,结果发现笑点一般,从搞笑的角度来看,不如<西虹市首富>,影片更多的是反映人类本性的一部电影,不应当做喜剧片来看,影片中展现的人与人之间的关系倒是值得我们去深思.

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

测试开发Python培训:抓取新浪微博抓取数据-技术篇 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的selenium的课程中,我们在培训的课程里讲python的语言,也是通过项目实战的方式进行讲解,前期分享了个新浪微博的登陆功能,这次在通过抓取新浪微博数据进一步讲解脚本.(大家对课程感兴趣,请加qq:564202718) 微博有发布微博功能,微博发布后需要验证内容,那么如何验证微博发布数据的正确性,首先要

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

本篇文章是使用python抓取数据的第一篇,使用requests+BeautifulSoup的方法对页面进行抓取和数据提取.通过使用requests库对链家网二手房列表页进行抓取,通过BeautifulSoup对页面进行解析,并从中获取房源价格,面积,户型和关注度的数据. 准备工作 首先是开始抓取前准备工作,导入需要使用的库文件,这里主要使用的是requests和BeautifulSoup两个.Time库负责设置每次抓取的休息时间.这里并非全部,后续还会在过程中导入新的库. 抓取列表页 开始抓取

微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的"有趣",寻找那份或有或无的存在感. 有人选择在朋友圈记录生活的点滴,有人选择在朋友圈展示自己的观点.有时我们想去展示自己,有时又想去窥探着别人的生活,而有时又不想别人过多的了解自己的生活,或是屏蔽对方,或是不给对方看朋友圈,又或是不

Python抓取需要cookie的网页

Python抓取需要cookie的网页 在仿照<Python小练习:可视化人人好友关系>一文时,需要登录模拟登录人人网.然而自从CSDN事件之后,人人网开始使用加密方式处理登录名和密码,直接使用post方式已经无法登陆人人网.这时,从豆瓣讨论中找到了解决方法: 1. 首先使用浏览器登陆人人,然后找到浏览器中关于登陆的Cookie: 2. 将Cookie记录下来,在Python中使用cookie模块模拟浏览器的行为: 3. 取得并解析数据. 1. HTTP协议与Cookie 抓取网页的过程跟浏览

Python抓取网页&amp;批量下载文件方法初探(正则表达式+BeautifulSoup) (转)

Python抓取网页&批量下载文件方法初探(正则表达式+BeautifulSoup) 最近两周都在学习Python抓取网页方法,任务是批量下载网站上的文件.对于一个刚刚入门python的人来说,在很多细节上都有需要注意的地方,以下就分享一下我在初学python过程中遇到的问题及解决方法. 一.用Python抓取网页 基本方法: [python] view plaincopyprint? import urllib2,urllib url = 'http://www.baidu.com' req 

用Python抓取全站中的404错误

链接是SEO的一个重要因素.为了在搜索引擎中获取更好的排名,一定要定期检查下网站中的链接是否依然有效.特别是由于一些巨大的改动可能会导致坏链接的出现.要检测这些站内的链接问题,可以通过一些在线的工具.比如Google Analytics,Bing Webmaster Tools,brokenlinkcheck.com等.尽管有现成的工具,我们也可以自己来编写一个.使用Python会非常容易. 参考原文:How to Check Broken Links with 404 Error in Pyt