精华内容
下载资源
问答
  • 很多人不理解为什么微博关闭的是评论而不是转发,他们认为微博传播信息的主要途径是转发,但是我想说微博的鼻祖Twitter是没有评论功能的,而对于国内微博而言评论包含的信息量实际上远大于转发。试想@作业本 发布了...

    很多人不理解为什么微博关闭的是评论而不是转发,他们认为微博传播信息的主要途径是转发,但是我想说微博的鼻祖Twitter是没有评论功能的,而对于国内微博而言评论包含的信息量实际上远大于转发。试想@作业本 发布了一条微博,众多名人在这条微博下争相发表内涵评论,以作业本的关注数,一条微博有1k条评论应该很容易,除去垃圾评论,至少也有几百条,而每一个关注作业本的用户都可以对这条微博下任意一条评论进行回复和转发,信息扩散的速度远大于单纯的转发。另外,一条微博的字数限制在140,用过微博的用户都知道,在对一条微博进行转发时,所包含的信息量不能超过140,并且在转发一条微博的评论时,加上自己和原评论也不能超过140,因此用户在转发多条评论和微博时,经常会被提示字数超过限制,解决办法就是删除一部分原有的评论。也就是说,转发实际限制了信息的传播量,而评论包含的信息才是最多的。还有,有些人喜欢使用评论发表一些介于转发和私信之间的信息,这些信息不会直接被用户看到,而是附加在一条或多条微博下,对保护用户隐私起到了一定作用,这点@手林是Dumpling 应该有体会。因此从信息控制的角度讲,转发也比评论更加易于管理和控制。

    转载于:https://www.cnblogs.com/edwardcmh/archive/2012/04/01/2428778.html

    展开全文
  • 2020 年最新微博内容及评论爬虫

    万次阅读 多人点赞 2020-03-13 12:40:23
    今天手把手教大家如何写成一份微博爬虫的代码,可以自己爬取微博的热门话题或评论,方便做相关的数据分析和可视化。 该项目的 Github 地址是 https://github.com/Python3Spiders/WeiboSuperSpider ,请不要利用该...

    微博爬虫综述

    今天手把手教大家如何写成一份微博爬虫的代码,可以自己爬取微博的热门话题或评论,方便做相关的数据分析和可视化。

    该项目的 Github 地址是 https://github.com/Python3Spiders/WeiboSuperSpider
    ,请不要利用该爬虫项目获得的数据作任何违法用途。

    微博爬虫主要有两个导向,一个是微博内容的爬虫,其目的字段包括微博文本、发布者、转发/评论/点赞数等,另一个是微博评论的爬虫,其目的字段主要是评论文本和评论者。

    微博的爬虫的目的网站主要有四个,pc 站weibo.comweibo.cn 以及对应的 m(mobile) 站 m.weibo.com(无法在电脑上浏览)、m.weibo.cn,总得来说,.cn.com 更简单 UI 更丑,m 站比 pc 站更简单 UI 更丑。

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    Github 仓库详解

    仓库的目录如下图所示,主要是分两部分 GUI 功能集中版无 GUI 功能独立版,GUI 即 Graph User Interface(图形用户接口)。

    在这里插入图片描述

    GUI 功能集中版

    最开始只有 GUI 功能集中版 这一部分,主代码是 GUI.py 和 WeiboCommentScrapy.py。

    在这里插入图片描述

    GUI.py 包括爬虫逻辑和 GUI 界面,是基于 PyQt5 构建的,爬虫部分由三个类 WeiboSearchScrapy、WeiboUserScrapy、WeiboTopicScrapy,他们的目标站点都是 weibo.cn,都继承自线程类 Thread。

    在这里插入图片描述

    GUI.Py 里面实现的是用户/话题爬虫,即爬取指定用户/话题下的微博,当我们在界面点击提交了一个抓取任务,就会开启对应的线程类爬虫,抓取完毕通过该类和主界面之间的信号提示抓取完成。
    在这里插入图片描述

    GUI.py 运行效果图如下:

    在这里插入图片描述
    在这里插入图片描述
    无论是微博用户,还是话题爬虫,都有 50 页左右的限制。

    爬取了微博之后,我们可以使用 WeiboCommentScrapy.py 爬取指定微博的评论,怎么指定,参考下图

    在这里插入图片描述

    注意 weibo.cn 站微博的 id 是类似 IjEDU1q3w 这种格式,和后面的 m.weibo.cn 的微博 id 格式不同(它的纯数字,比较长),该评论爬虫只能爬取前 100 页的。

    微博用户/话题/评论 爬虫的数据依次保存在 user/topic/comment 文件夹下的 csv 文件中。

    20200313 实测 GUI 功能集中版的代码仍可用,exe 失效了,因为代码每更新一次就要打包、发布一次 exe,比较麻烦,我就没更新 exe 了( exe 是第一版代码打包了,现在第三版了)

    注意 GUI 功能集中版均是针对 weibo.cn 的,也就是界面最丑的那个站,不要把 weibo.com 或者 m.weibo.cn 的 cookie 放到这来,否则会出现以下错误:

    encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
    encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
    encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
    I/O error : encoder error
    encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
    encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
    encoding error : input conversion failed due to input error, bytes 0xC3 0x87 0xC3 0x82
    I/O error : encoder error
    

    同时,如果出现了诸如PermissionError: [Errno 13] Permission denied: 'comment/IaYZIu0Ko.csv 之类的错误,则是因为你在 excel 中打开了 这个 csv 文件,同时程序还在继续向这个文件追加写,获取不到锁因而报错,如果想一边跑一边查看文件内容,可以用 Pycharm 的 CSV Plugin 插件。

    无 GUI 功能独立版

    在这里插入图片描述

    该文件下有三个文件 WeiboCommentScrapy.py、WeiboTopicScrapy.py、WeiboSuperCommentScrapy.py,前面两个都还是针对 weibo.cn 的,WeiboTopicScrapy.py 作了相应的升级,可以支持时间跨度搜索,比如之前假如这个话题有 1000 页吗,我们最多只能爬取 130 页,但是可能把这 1000 页按照时间段拆分,每个时间段(Year-Month-Day,不支持小时及以下时间颗粒度)无论长短,都最多能获取 130 页。

    而 WeiboSuperCommentScrapy.py 则是针对 m.weibo.cn 的,这个评论爬虫没有 100 页的限制,我一条微博拿到了几w+的评论,但是有的只能拿到几k(实际评论几w+),这点很迷。该文件运行可以不自己设置 cookie,可以通过账号登录自动获取 cookie,这一步是学习的一位简书博主的文章(https://www.jianshu.com/p/8dc04794e35f)不过经过调试我发现其中有个参数 max_id_type 会在 17 页+1,同时做了对评论的回复的解析保存。

    解析的代码如下,直接提取 json :

    def info_parser(data):
    	id,time,text =  data['id'],data['created_at'],data['text']
    	user = data['user']
    	uid,username,following,followed,gender = \
    		user['id'],user['screen_name'],user['follow_count'],user['followers_count'],user['gender']
    	return {
    		'wid':id,
    		'time':time,
    		'text':text,
    		'uid':uid,
    		'username':username,
    		'following':following,
    		'followed':followed,
    		'gender':gender
    	}
    

    抓取的代码如下:

    def start_crawl(cookie_dict,id):
    	base_url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0'
    	next_url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id={}&max_id_type={}'
    	page = 1
    	id_type = 0
    	comment_count = 0
    	requests_count = 1
    	res = requests.get(url=base_url.format(id,id), headers=headers,cookies=cookie_dict)
    	while True:
    		print('parse page {}'.format(page))
    		page += 1
    		try:
    			data = res.json()['data']
    			wdata = []
    			max_id = data['max_id']
    			for c in data['data']:
    				comment_count += 1
    				row = info_parser(c)
    				wdata.append(info_parser(c))
    				if c.get('comments', None):
    					temp = []
    					for cc in c.get('comments'):
    						temp.append(info_parser(cc))
    						wdata.append(info_parser(cc))
    						comment_count += 1
    					row['comments'] = temp
    				print(row)
    			with open('{}/{}.csv'.format(comment_path, id), mode='a+', encoding='utf-8-sig', newline='') as f:
    				writer = csv.writer(f)
    				for d in wdata:
    					writer.writerow([d['wid'],d['time'],d['text'],d['uid'],d['username'],d['following'],d['followed'],d['gender']])
    
    			time.sleep(5)
    		except:
    			print(res.text)
    			id_type += 1
    			print('评论总数: {}'.format(comment_count))
    
    		res = requests.get(url=next_url.format(id, id, max_id,id_type), headers=headers,cookies=cookie_dict)
    		requests_count += 1
    		if requests_count%50==0:
    			print(id_type)
    		print(res.status_code)
    

    反爬措施主要是设置 User-Agent 和 Cookie,欢迎大家尝试,有问题请留言。

    展开全文
  • jquery插件——仿新浪微博限制输入字数的textarea title > 6 < script src ="http://apps.bdimg.com/libs/jquery/1.10.1/jquery.min.js" > script > 7 < style > 8 * { padding : 0 ; margin : ...

    内容链接地址:http://www.cnblogs.com/jone-chen/p/5213851.html;

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     5 <title>jquery插件——仿新浪微博限制输入字数的textarea</title>
     6 <script src="http://apps.bdimg.com/libs/jquery/1.10.1/jquery.min.js"></script>
     7 <style>
     8     *{padding: 0;margin: 0;}
     9     .box{width: 800px;margin: 0 auto;}
    10     #test{border:1px solid #d9d9d9; padding:0 1%;line-height: 1.8;font-family: "microsoft yahei";font-size: 14px;display: block; width: 98%; height: 80px;;}
    11     #info{padding: 3px 0;font-family: "microsoft yahei";font-size: 14px;}
    12 </style>
    13 </head>
    14 <body>
    15 <div class="box">
    16     <textarea id="test" width="100%"></textarea>
    17 </div>
    18 <script>
    19     (function($) {
    20         $.fn.limitTextarea = function(opts) {
    21             var defaults = {
    22                 maxNumber: 140, //允许输入的最大字数
    23                 position: 'top', //提示文字的位置,top:文本框上方,bottom:文本框下方
    24                 onOk: function() {}, //输入后,字数未超出时调用的函数
    25                 onOver: function() {} //输入后,字数超出时调用的函数   
    26             }
    27             var option = $.extend(defaults, opts);
    28             this.each(function() {
    29                 var _this = $(this);
    30                 var info = '<div id="info"><b>' + (option.maxNumber - _this.val().length) + '</b>/'+option.maxNumber+'</div>';
    31                 var fn = function() {
    32                     var $info = $('#info');
    33                     var extraNumber = option.maxNumber - _this.val().length;
    34                     
    35                     if (extraNumber >= 0) {
    36                         $info.html('<b>' + extraNumber + '</b>/'+option.maxNumber);
    37                         option.onOk();
    38                     } else {
    39                         $info.html('已经超出<b style="color:red;">' + (-extraNumber) + '</b>个字');
    40                         option.onOver();
    41                     }
    42                 };
    43                 switch (option.position) {
    44                     case 'top':
    45                         _this.before(info);
    46                         break;
    47                     case 'bottom':
    48                     default:
    49                         _this.after(info);
    50                 }
    51                 //绑定输入事件监听器
    52                 if (window.addEventListener) { //先执行W3C
    53                     _this.get(0).addEventListener("input", fn, false);
    54                 } else {
    55                     _this.get(0).attachEvent("onpropertychange", fn);
    56                 }
    57                 if (window.VBArray && window.addEventListener) { //IE9
    58                     _this.get(0).attachEvent("onkeydown", function() {
    59                         var key = window.event.keyCode;
    60                         (key == 8 || key == 46) && fn(); //处理回退与删除
    61                     });
    62                     _this.get(0).attachEvent("oncut", fn); //处理粘贴
    63                 }
    64             });
    65         }
    66     })(jQuery)
    67     //插件调用;
    68     $(function() {
    69         $('#test').limitTextarea({
    70             maxNumber: 140, //最大字数
    71             position: 'bottom', //提示文字的位置,top:文本框上方,bottom:文本框下方
    72             onOk: function() {
    73                 $('#test').css('background-color', 'white');
    74             }, //输入后,字数未超出时调用的函数
    75             onOver: function() {
    76                 $('#test').css('background-color', 'lightpink');
    77             } //输入后,字数超出时调用的函数,这里把文本区域的背景变为粉红色   
    78         });
    79     });
    80 </script>
    81 </body>
    82 </html>

     

    转载于:https://www.cnblogs.com/helena000/p/6949901.html

    展开全文
  • 调用新浪微博开放接口,首先要到新浪服务器进行认证,新浪微博目前采用的是OAuth2.0认证,google了一下OAuth2.0认证过程大概如下:

    源码下载


    调用新浪微博开放接口,首先要到新浪服务器进行认证,新浪微博目前采用的是OAuth2.0认证,google了一下OAuth2.0认证过程大概如下:

    1.待着你的应用app key去新浪服务器,新浪收到后会返回认证页面;

    2.当用户授权给你的应用后,服务器 会返回一个code给你;

    3.待着你的app key、app secret和服务器返回的code再去新浪服务器,服务器会返回一个access_token给你。

    然后访问接口的时候记得待着这个access_token就行了。

    不知道讲对了没有,目前我的程序的确就是这么做的。

    其实新浪提供了很多本版的sdk,本文就不研究了,直接使用Qt自带的QNetworkAccessManager发送请求和接受应答。

    在网上搜了一个qt的http请求帮助类,挺好用的,源码如下:

    头文件:

    #ifndef HTTPCLIENT_H
    #define HTTPCLIENT_H
    
    #include <QObject>
    #include <QNetworkReply>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QEventLoop>
    #include <QTimer>
    
    class HttpClient : public QObject
    {
        Q_OBJECT
    public:
        explicit HttpClient(QObject *parent = 0);
        ~HttpClient();
        //http get请求
        QString get(QNetworkRequest& request);
        //http post请求
        QString post(QNetworkRequest& request, const QByteArray& data);
        //是否发生网络错误
        bool hasNetworkError(){ return this->m_hasNetworkError; }
        //获取网络连接错误代码
        int getNetworkErrorCode(){ return this->m_networkErrorCode; }
        //网络连接是否完成
        bool isHttpFinish(){ return this->m_isFinished; }
        //设置超时
        void setTimeOutLimit(int time);
    signals:
    
    public slots:
        //http请求完成
        void httpRequestFinished(QNetworkReply* reply);
        //请求超时处理
        void timeOutHandler();
        //网络错误处理
        void networkErrorHandler(QNetworkReply::NetworkError error);
    
    private:
        QNetworkReply* m_pNetworkReply;
        QNetworkAccessManager *m_pNetworkMgr;
        bool m_hasNetworkError;//是否发生网络错误
        int m_networkErrorCode;//错误代码.如果发生网络错误,该值不为0
        QByteArray m_contentInByteArray;//请求到的内容
        QEventLoop* m_pEventLoop;//接受内容时保持响应
        volatile bool m_isFinished;
        QTimer* m_timer;//定时,用于超时检测
        int m_timeLimit;//用于设置超时
    
    };
    
    #endif // HTTPCLIENT_H
    
    源文件:

    #include "httpclient.h"
    #include <QTextCodec>
    #include <QDebug>
    
    HttpClient::HttpClient(QObject *parent) :
        QObject(parent)
    {
        this->m_contentInByteArray.clear();
        this->m_hasNetworkError = false;
        this->m_isFinished = false;
        this->m_networkErrorCode = QNetworkReply::NoError;
        this->m_pEventLoop = new QEventLoop(this);
        this->m_pNetworkMgr = new QNetworkAccessManager(this);
        this->m_pNetworkReply = NULL;
        this->m_timeLimit = 60*1000;
        this->m_timer = new QTimer(this);
        QObject::connect( this->m_pNetworkMgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(httpRequestFinished(QNetworkReply*)));
        //QObject::connect( network, SIGNAL(finished(QNetworkReply*)), this, SIGNAL(finished()));
        QObject::connect( this->m_timer, SIGNAL(timeout()), this, SLOT(timeOutHandler()));
    }
    HttpClient::~HttpClient()
    {
        delete this->m_pEventLoop;
        this->m_pEventLoop = NULL;
        delete this->m_pNetworkMgr;
        this->m_pNetworkMgr = NULL;
        delete this->m_timer;
        this->m_timer = NULL;
    }
    QString HttpClient::get(QNetworkRequest &request)
    {
        this->m_pNetworkReply = this->m_pNetworkMgr->get(request);
        QObject::connect(this->m_pNetworkReply, SIGNAL(error(QNetworkReply::NetworkError)),
                         this, SLOT(networkErrorHandler(QNetworkReply::NetworkError)));
        //计时器启动
        this->m_timer->start(this->m_timeLimit);
        this->m_pEventLoop->exec();
        this->m_pNetworkReply->close();
        delete this->m_pNetworkReply;
        this->m_pNetworkReply = NULL;
        if(!this->hasNetworkError())
        {
            QTextCodec *codec = QTextCodec::codecForName("UTF-8");
            return codec->toUnicode(this->m_contentInByteArray);
        }
        else
        {
            return QString::null;
        }
    }
    QString HttpClient::post(QNetworkRequest &request, const QByteArray &data)
    {
        this->m_pNetworkReply = this->m_pNetworkMgr->post(request,data);
        QObject::connect(this->m_pNetworkReply, SIGNAL(error(QNetworkReply::NetworkError)),
                         this, SLOT(networkErrorHandler(QNetworkReply::NetworkError)));
        //计时器启动
        this->m_timer->start(this->m_timeLimit);
        this->m_pEventLoop->exec();
        this->m_pNetworkReply->close();
        delete this->m_pNetworkReply;
        this->m_pNetworkReply = NULL;
        if(!this->hasNetworkError())
        {
            QTextCodec *codec = QTextCodec::codecForName("UTF-8");
            return codec->toUnicode(this->m_contentInByteArray);
        }
        else
        {
            return QString::null;
        }
    }
    void HttpClient::httpRequestFinished(QNetworkReply *reply)
    {
        this->m_isFinished = true;
        this->m_contentInByteArray = reply->readAll();
        this->m_timer->stop();
        this->m_pEventLoop->exit();
    }
    void HttpClient::timeOutHandler()
    {
        this->m_hasNetworkError = true;
        this->m_networkErrorCode = QNetworkReply::TimeoutError;
        this->m_contentInByteArray = this->m_pNetworkReply->readAll();
        this->m_timer->stop();
        this->m_pEventLoop->exit();
    }
    void HttpClient::networkErrorHandler(QNetworkReply::NetworkError error)
    {
        this->m_hasNetworkError = true;
        this->m_networkErrorCode = error;
        qDebug()<<"网络错误描述:"<<this->m_pNetworkReply->errorString();
        qDebug()<<"网络错误代码:"<<this->m_pNetworkReply->error();
    }
    void HttpClient::setTimeOutLimit(int time)
    {
        this->m_timeLimit = time;
    }
    

    微博接口返回的是json格式,意味着需要json解析,Qt自带一个QScriptEngine,可以用来解析简单的json,但貌似解析不了两层以上的json,没有仔细研究,先凑合着用:

    QString JsonUtil::getValueByKey(const QString &source, const QString &key)
    {
        QScriptEngine engine;
        QScriptValue sc = engine.evaluate("value = " + source);
        QScriptValueIterator it(sc);
        while(it.hasNext())
        {
            it.next();
            if (it.name().compare(key) == 0)
    
                return it.value().toString();
    
        }
        return NULL;
    }

    用到的工具类都准备好了,下面进入正题。

    首先看入口程序:

    #include "mainwindow.h"
    #include <QApplication>
    #include "oauthdialog.h"
    #include <QTextCodec>
    #include <QDebug>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QTextCodec *encoding = QTextCodec::codecForName("UTF-8");
        QTextCodec::setCodecForTr(encoding);
        QTextCodec::setCodecForLocale(encoding);
        QTextCodec::setCodecForCStrings(encoding);
        MainWindow w;
        OauthDialog dlg(&w);
    
        if(dlg.exec()==QDialog::Accepted)
        {
            QApplication::setQuitOnLastWindowClosed(true);
    
            w.show();
            return a.exec();
        }
        return 0;
    }
    

    MainWindow是主窗口类,QauthDialog是授权对话框,首先在授权对话框进行登录授权等。

    #include "oauthdialog.h"
    #include "ui_oauthdialog.h"
    #include "httpclient.h"
    #include "jsonutil.h"
    #include <QUrl>
    #include <QDebug>
    #include <QMessageBox>
    #include <mainwindow.h>
    
    OauthDialog::OauthDialog(MainWindow* main) :
        main(main),
        ui(new Ui::OauthDialog)
    {
        ui->setupUi(this);
    
        QUrl url;//登录授权地址
        url.setUrl("https://api.weibo.com/oauth2/authorize?client_id=yourid&redirect_uri=http://www.baidu.com&response_type=code");
        ui->m_webView->setUrl(url);
        //url变化信号,url发生变化判断是否是回调地址并截取code值
        QObject::connect( ui->m_webView, SIGNAL(urlChanged(QUrl)), this, SLOT(urlChgHandler(QUrl)) );
    
    }
    
    void OauthDialog::urlChgHandler(const QUrl& url)
    {
        QString strUrl = url.toString();
        if (strUrl.contains("code="))
        {
            QStringList strList = strUrl.split("code=");
            QString code = strList.at(1);
            qDebug()<<"返回code值:"<<code;
            
            QString strAtUrl = "https://api.weibo.com/oauth2/access_token";
            QByteArray postData = "client_id=yourid&client_secret=yoursecret&grant_type=authorization_code&code=" + code.toAscii() +"&redirect_uri=http://www.baidu.com";
            HttpClient* http = new HttpClient();
            QUrl atUrl;
            atUrl.setUrl(strAtUrl);
            QNetworkRequest request;
            request.setUrl(atUrl);
            QString content = http->post(request,postData);
            delete http;
            //qDebug()<<"content:"<<content;
            JsonUtil json;
            QString accessToken = json.getValueByKey(content,"access_token");
            QString uid = json.getValueByKey(content,"uid");
    
            qDebug()<<"accessToken:"<<accessToken;
            qDebug()<<"uid:"<<uid;
            this->main->setAccesstoken(accessToken);
            this->main->setUid(uid);
            this->accept();
        }
    }
    
    OauthDialog::~OauthDialog()
    {
        delete ui;
    }
    

    上面代码获取到了access token,以后带着这个就可以访问其它接口了。

    下面是获取登录用户的一些基本信息的接口:

    void MainWindow::initAccountInfo()
    {
        HttpClient *http = new HttpClient(this);
        QUrl url;
        url.setUrl("https://api.weibo.com/2/users/show.json");
        url.addQueryItem("access_token",this->getAccesstoken());
        url.addQueryItem("uid",this->getUid());
        QNetworkRequest request;
        request.setUrl(url);
        QString ret = http->get(request);
        JsonUtil json;
        this->ui->m_btn_name->setText(json.getValueByKey(ret,"screen_name"));
        this->ui->m_btn_attention->setText("关注:"+json.getValueByKey(ret,"friends_count"));
        this->ui->m_btn_funs->setText("粉丝:"+json.getValueByKey(ret,"followers_count"));
        this->ui->m_btn_weibo->setText("微博:"+json.getValueByKey(ret,"statuses_count"));
        delete http;
    }

    要想评论某条微博,首先要获取这个微博的id,试了一下获取指定用户的微博的api,不知道为什么返回来的是空,又试了一下获取指定用户的用户信息的接口,返回的内容正好包含用户最新的一条微博信息,正好用这个api做实验吧。

    void MainWindow::getWeiboId()
    {
        HttpClient *http = new HttpClient(this);
        QUrl url;
        url.setUrl("https://api.weibo.com/2/users/show.json");
        url.addQueryItem("access_token",this->getAccesstoken());
        url.addQueryItem("screen_name",this->ui->m_name->text());
        QNetworkRequest request;
        request.setUrl(url);
        QString ret = http->get(request);
        qDebug()<<ret;
        JsonUtil json;
        QString id = "id:\n"+json.getValueByKey(ret,"id")+"\n";
        QString name = "name:\n"+json.getValueByKey(ret,"screen_name")+"\n";
        QString description = "description:\n"+json.getValueByKey(ret,"description")+"\n";
    
        QStringList list = ret.split("idstr\":\"");
        QString temp = list.at(2);
        QStringList tempList = temp.split("\",\"text\":\"");
        QString weiboId = "weiboId:\n"+tempList.at(0)+"\n";
        QString weiboContent = "weiboContent:\n"+tempList.at(1).split("\",\"source\"").at(0)+"\n";
    
        this->ui->m_text_ids->setText(id+name+description+weiboId + weiboContent);
        delete http;
    }

    用户信息api返回的json信息包含两层,Qt自带的json解析类貌似解析不了,上面代码用QString的split硬生生的把想要的信息分隔了出来,网上有很多c++的开源json工具,这里就不搞那么复杂了。

    下面是发表评论:

    void MainWindow::timerUpdate()
    {
        HttpClient *http = new HttpClient(this);
        QUrl url;
        url.setUrl("https://api.weibo.com/2/comments/create.json");
        QNetworkRequest request;
        request.setUrl(url);
    
        QString content = this->ui->m_comment->document()->toPlainText();
        QString weiboid = this->ui->m_weiboid->text();
    
        QByteArray data = "access_token="+this->getAccesstoken().toAscii()+
                "&comment="+QUrl::toPercentEncoding(content.toUtf8()) +
                "&id="+weiboid.toAscii();
    
        http->post(request,data);
        delete http;
    }
    

    用了QTimer定时器,按照指定频率执行timerUpdate函数。

    这样就可以自动发表评论了。

    看一下截图:




    注:评论频率不要太高了,小心被啊浪封杀!而且对普通用户,每小时的api调用次数也是有限制的。


    展开全文
  • 此部分为进行微博评论,由于转发也在此activity中进行,所以就直贴出评论微博界面,同时此部分也是微博开发所有的activity开发的终结篇,后面我会贴上所有的工具类。好了,贴代码,在此说明一下,可能代码里调用...
  • 目录 ...获取指定的微博用户:【央视新闻】在2020年上半年发的微博,并爬取每个微博的热门评论。根据需求,任务被划分为:获取指定用户的微博详情的列表;获取指定微博评论列表。 准备工作 1、网址
  • 今天在这里介绍一下如何用beautifulsoup爬取某条微博下的评论 在这里我们介绍几个重要的对网页爬取和数据清洗有帮助的库: requests库 Beautiful Soup库re库 requests库是爬虫的一个基础库: r = request.get...
  • 微博数据抓取并对数据进行情绪分析微博数据爬虫开始爬虫之前请先了解代码实现文本...A:微博数据可以分为几类:博文相关数据,用户信息数据,单条微博评论数据,社交关系网络数据。其中 博文相关数据包括:微博的UR...
  • python爬取新浪微博评论

    万次阅读 2018-05-30 06:01:28
    *此方法只能爬取微博m站前100页评论,想要更全数据的请自行搜索pc站爬取代码在网上看了很多教程和博客,自己试验了很多方法,发现微博爬m站是最容易的。m站数据结构清晰,不需要用很复杂的框架,requests+正则就能...
  • 试想一个问题,如果我们要抓取某个微博大V微博评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口,如下图所示。 ...
  • 试想一个问题,如果我们要抓取某个微博大V微博评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口,如下图所示。 但是很...
  • 试想一个问题,如果我们要抓取某个微博大V微博评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口,如下图所示。 ...
  • 爬取微博评论数据,这里网上有很多爬取的方法,我们主要爬取的是 m.weibo.cn 这个站点上的数据。 这里我们是将每条评论数据进行写入文件,我们写入文件的分隔为“:::”, 格式为:评论数据:::用户id:::用户名 的...
  • 目录1. 爬虫部分实验环境爬虫目标抓包PC端和移动端分析抓取到的目标链接分析评论信息...爬像新浪微博这样的大网站,不用想就知道不登录肯定是爬不了多少数据的(事实就是不登录的话只能爬第一页的评论数据)。 所以我们先
  • 突然觉得,现在发微博已经成为当代青年的潮流,或分享自拍美照,或分享美食美景,小编的女朋友也不例外,平时爱分享一些我俩生活的趣事。但是她最近开始给我抱怨我...
  • 爬虫 微博评论记录 当我最近的文章在dzone上重新发布时,乔纳森·费舍尔(Jonathan Fisher)添加了一个有价值的评论,指出: … 我想我还有别的事情要写:“登录还是发表评论?” 我将调试语句看作是“活动注释”...
  • 今天主要就是拿最近一个关于支付宝的话题【花呗借呗不得向大学生放款】来简单使用snowNLP做一下网友们评论数据的情感分析。 数据内容样例如下所示: 微博内容 #皓嫣##玖富##快手##肖战##特斯拉道歉能挽回人心...
  • 【Part1——理论篇】试想一个问题,如果我们要抓取某个微博大V微博评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改...
  • 通过爬取微博评论,发现好看的小姐姐...前言页面分析实现架构关键点成果 前言 刷微博刷到一个博主求好看小姐姐照片的微博,内心不由得轻蔑一笑,好看的小姐姐凭啥理你,滑到评论区,我瞬间就酸了,内心对这个博主...
  • python爬虫手把手教你抓取微博评论(完整代码)
  • 试想一个问题,如果我们要抓取某个微博大V微博评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口,如下图所示。 ...
  • 解析了知乎回答内容之后,这次我们来解析一下微博内容,以微博网友发起的美胸大赛为例: https://m.weibo.cn/detail/4367970740108457 https://m.weibo.cn/detail/4348022520956497 这就是本次要获取的...
  • 试想一个问题,如果我们要抓取某个微博大V微博评论数据,应该怎么实现呢?最简单的做法就是找到微博评论数据接口,然后通过改变参数来获取最新数据并保存。首先从微博api寻找抓取评论的接口,如下图所示。 写到...
  • Python爬取微博评论数据,竟被反爬封号了!

    千次阅读 多人点赞 2021-01-30 11:28:41
    哈喽,各位小伙伴大家好呐,这些天一直忙其它事情,回头发现已经好几天没更新爬虫专辑了,今天给大家整一首Python爬取微博评论,哈哈但是最后有点小丑(微博被封号了一段时间),下面大家一起来看操作! 一: 核心过程...
  • 据中国之声《新闻晚高峰》报道, 1月20日,...原创微博支持此功能,评论和转发均保持140字限制。 网友听闻后,表示对曾经深耕的平台,其当下的命运走向还是很操心的。支持取消字数限制的网友认为,这事儿挺好,以...
  • "mids": ["要爬微博的mid"], "headers": { "cookie": "你自己的", "user-agent": "你自己的" }, "intervals": 间隔时间,单位为秒 } 2. 链接生成(url_gen.py) import execjs import time js_str = '''...
  • '''python3''''''2018/04/03'''import requests import os ...#headers是请求加上头信息,伪装成浏览器访问,不然会被限制 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.2; WOW64) Appl...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,907
精华内容 3,962
关键字:

微博限制评论