PS:(本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。由于微博接口更新后限制增大,这个代码已经不能用来爬数据了。如果只是为了收集数据可以咨询我的邮箱,如果是为了学习爬虫,建议改学phantomjs从网页中爬取微博的)

利用新浪API实现数据的抓取(由于api接口限制增大,本文已基本废弃)

2018.5.16 提示
微博的api接口现在已经不好用了,普通权限的token已经爬不到什么数据了,想要用这个代码爬大量数据的已经不太可能,只能作为熟悉微博api接口使用方法的一个小demo了。

2018.4.16 说明

注意:今天有人言语恶劣地评论我的博客是垃圾,说我的代码有问题,这篇博客历史久远,是我初玩爬虫写的博客。我非常感谢能对我的代码提出意见的人,但是出言不逊,态度恶劣的人我是忍受不了的,有话好好说,是一个现代社会高学历高知识分子的最低觉悟。

代码我已经改过了,如果还有问题非常欢迎大家来温和地指出!!!!

同时,由于新浪微博本身api机制的不断更改,到目前为止,这篇博客的内容已经有了局限,对于个人开发者来说,你申请到的token的权限只能爬你自己的微博,所以对于想要靠api来爬数据的人,恐怕可能并不能达成自己的目的了。想要用api来爬取微博内容只能选择获取更高的开发者权限了。


1. 首先来看看最后我们得到的是什么结果,是不是你想要了解的东西,再决定是否往下读。 

我主要抓取了大概4天的数据,图上可以看的出来大概有360万条数据,由于是在自己的电脑上爬取做数据的,有时候晚上断网了就间断了,所以大概一天可以爬取有100万左右的最新微博数据(因为我调用的是最新的微博API public_timeline)

API文档当中定义了很多返回的类型(以json数据格式返回,我选取了一些我认为重要的信息抓取下来如图所示: 大概有id号所在位置粉丝数,发的微博内容,发微博的时间等等。 当然这些数据都可以根据自己的需要进行定制。)

大概就是这些内容,你如果认为这对你有点帮助,就请继续读下去… 第一次写博客有些啰嗦

2. 前期准备

我们需要的东西:

  • 数据库: mongodb(可以使用客户端MongoBooster)
  • 开发环境: Python2.7(我用的IDE是Pycharm)
  • 一个新浪开发者账号: 用自己的新浪微博账号注册就行(后面会讲)
  • 需要的库: requests和pymongo(这些都可以在Pycharm中下载)

2.1 mongodb的安装

MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。Mongo的官方网站地址是:http://www.mongodb.org/,读者可以在此获得更详细的信息。

小插曲:什么是NoSql?

  NoSql,全称是 Not Only Sql,指的是非关系型的数据库。下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用,这场运动开始于2009年初,通常特性应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。

网上有很多安装mongodb教程我就不写了

Windows下mongodb的安装

Linux下mongodb的安装

2.2 新浪开发者账号的注册方法

  • 注册新浪微博账号(163邮箱、手机号)

  * 创建完毕需要填写手机号验证 *

  • 进入新浪开放者平台:http://open.weibo.com/

  • 点击继续创建

初次创建应用需要填写如下信息:

此页面信息不需要填写真实信息,如地区,电话,可随意填写。网站填https://www.baidu.com/即可。(邮箱要真实)

继续创建应用。应用名称自定义,平台如下勾选 ios 、andrioid

创建完毕直接返回继续创建,一个账号可以创建10个应用,每个应用对应一个access-token(事实上我只用了一个就可以满足需求)

  • 前往API测试平台

依次选取创建的应用。点将下方的token用txt保存即可。

  • 获取key

回到

点击我的应用

然后选择自己刚刚创建的应用

进入之后点击应用信息

保存下 APP Key 和 APP Secret

点击高级信息

设置回调网址

可以设置成默认的
http://api.weibo.com/oauth2/default.html

至此你的开发者账号就已经完成了

2.3 依赖库的安装方法

requests和pymongo的安装

可以直接用pip安装
pip install requests 和 pip install pymongo

也可以在Pycharm里面直接安装

选择File -> Settings -> Project -> Project Interpreter

可以看到自己安装的Python库,点击右边的绿色* + *

安装即可

3. 分析问题 

3.1 OAuth 认证

* 授权机制说明(很重要)*

网上很多讲利用新浪微博API发送微博什么的都是使用的请求用户授权Token这种方式,但是这种方式显然不适用于我们爬取数据,因为每次都要请求,每次都要重新获取code。具体可参考新浪微博API的授权机制

廖雪峰老师(sinaweibopy 的贡献者)也对这个授权机制有一个说明

通过新浪微博的API接入网站,由于用户无需在您的网站上注册,就可以直接?使用他/她在新浪微博的帐号和口令登录您的网站,这就需要确保您的网站在无需知道,也不能知道用户口令的情况下确认用户已经登录成功。由于用户的口令存储在新浪微博,因此,认证用户的过程只能由新浪微博完成,但新浪微博如何与您的网站通信并告知您用户是否登录成功呢?这个过程称之为第三方登录,OAuth是一个标准的第三方登录协议,借助OAuth,您的网站就可以安全地接入来自新浪微博登录成功的用户。

OAuth目前主要有1.0和2.0两个版本,2.0版对1.0版做了大量简化,API也更简单。新浪微博最新的API也是采用的OAuth 2.0,整个登录流程如下:

  1. 用户在您的网站上点击“使用新浪微博登录”,您的网站将用户重定向到新浪微博的OAuth认证页,重定向链接中包含client_id参数作为您的网站ID,redirect_uri参数告诉新浪微博当用户登录成功后,将浏览器重定向到您的网站;
  2. 用户在新浪微博的认证页输入帐号和口令;
  3. 新浪微博认证成功后,将浏览器重定向到您的网站,并附上code参数;
  4. 您的网站通过code参数向新浪微博请求用户的access token;
  5. 您的网站拿到用户的access token后,用户登录完成。
    OAuth的access token是提供认证服务的网站(例如新浪微博)生成的令牌,代表一个用户认证信息。在随后的API调用中,传入该access token就代表这个登录用户,这样,通过OAuth协议,您的网站将验证用户的步骤交给新浪微博完成,并由新浪微博告知您用户是否登录成功。

OAuth的安全性是通过步骤4完成的,通过code参数获取access token的过程是您的网站后台到新浪微博网站完成的,用户无法看到获取access token的HTTP请求。如果用户传入伪造的code,则新浪微博会返回一个错误。

具体内容请看廖雪峰老师的文档

大致上来说按照一般的请求用户授权Token调用会出现这种情况:

获取code

登陆后会调转到一个连接https://api.weibo.com/oauth2/default.html?code=×××××××× 

我们所需要的就是code=×××××××××× 的值

也就是说,每当你调用一次API认证在浏览器中都会出现一个code,这样显然不利于我们去爬取网站 

怎么解决问题呢?首先我们想到的自然是在Python程序里面模拟登录新浪微博,然后自然可以获取到code的值,但是,模拟新浪微博登录相对来说比较复杂,而且既然都模拟登录成功了,为啥还要调用API呢…直接自定义进行抓取不是更加方便。

如果看了上面的那个授权机制,就应该想到。这个时候就需要我们之前申请的access-token了

access-token 根据我的理解就是把你的微博授权给了第三方让他帮你做一些事情,类似于在你的手机端通过新浪微博来登录然后进行操作(利用上面授权机制里面讲的一句话来说就是)移动端应用可直接使用官方移动SDK,通过呼起微博客户端(未安装微博客户端的会呼起H5授权页)方式授权

这个界面你应该很熟悉

新浪也给出了说明Oauth2/access token

4. 代码实现 

有了token之后,实现抓取数据就十分简单了
能抓取数据的多少就取决于你的token权限了

接下来就是利用API来获取数据了:新建一个文件weibo_run.py

# -*- coding:utf-8 -*-
import requests
from pymongo import MongoClientACCESS_TOKEN = '2.00ZooSqFHAgn3D59864ee3170DLjNj'
URL = 'https://api.weibo.com/2/statuses/public_timeline.json'def run():
#授权while True:#调用statuses__public_timeline的api接口params = {'access_token': ACCESS_TOKEN}statuses = requests.get(url=URL, params=params).json()['statuses']length = len(statuses)#这是后来我为了查看获取微博条数设置的print length#连接mongodb,不需要本地的额外配置Monclient = MongoClient('localhost', 27017)db = Monclient['Weibo']WeiboData = db['HadSelected']#获取的各个数据名应该可以清楚的看出来对应的是什么数据for i in range(0, length):created_at = statuses[i]['created_at']id = statuses[i]['user']['id']province = statuses[i]['user']['province']city = statuses[i]['user']['city']followers_count = statuses[i]['user']['followers_count']friends_count = statuses[i]['user']['friends_count']statuses_count = statuses[i]['user']['statuses_count']url = statuses[i]['user']['url']geo = statuses[i]['geo']comments_count = statuses[i]['comments_count']reposts_count = statuses[i]['reposts_count']nickname = statuses[i]['user']['screen_name']desc = statuses[i]['user']['description']location = statuses[i]['user']['location']text = statuses[i]['text']#插入mongodbWeiboData.insert_one({'created_at': created_at,'id': id,'nickname': nickname,'text': text,'province': province,'location': location,'description': desc,'city': city,'followers_count': followers_count,'friends_count': friends_count,'statuses_count': statuses_count,'url': url,'geo': geo,'comments_count': comments_count,'reposts_count': reposts_count})if __name__ == "__main__":run()

刚开始我的代码是这样的,看起来已经完成了。

但是,因为新浪会限制你的调用次数,后来我试了一下重新运行,结果发现了一个问题,我之前的print length 出来的每行获取值都不一样,总是在16-20之间徘徊,这说明了我每次重新运行获取的数据都不一样.然后我想算了,干脆写个死循环看他什么时候再被封吧。于是代码就变成了下面这样

run()删除,换成下面这个死循环。

if __name__ == "__main__":while 1:try:run()except:pass

结果他就一直运行下去了…运行了四天还没有被封,估计是封不了了…

其他接口也是一样使用,只用改变url和params就行,具体参数参照新浪微博API文档

开始我发现一天可以获取800万的数据,把我给乐的…后来发现好多好多重复的数据。最后找了半天的解决方案,在mongodb中根据用户的id和创建的时间这两点建立索引(因为一个人不可能在同一时刻发送两条微博),最后没有重复数据大概一天可以获取100万条左右的信息。

个人博客

8aoy1.cn

利用新浪API实现数据的抓取\微博数据爬取\微博爬虫 1相关推荐

  1. 利用新浪API实现数据的抓取\微博数据爬取\微博爬虫

    PS:(本人长期出售超大量微博数据.旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com.由于微博接口更新后限制增大,这个代码已经不能用来爬 ...

  2. php查询ip归属地api接口_【php】利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地...

    本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地>(点击打开链接)为姊妹篇,只是后端编程语言换成了php. 做出同样的效果,打开页面,得 ...

  3. php新浪获取ip接口,【php】利用新浪api接口与php获取远程数据的步骤,获取IP地址,并获取相应的IP归属地...

    [php]利用新浪api接口与php获取远程数据的方法,获取IP地址,并获取相应的IP归属地 本文与<[Servlet]Javaweb中,利用新浪api接口,获取IP地址,并获取相应的IP归属地 ...

  4. 利用新浪API批量生成t.cn 短链接的接口有哪些?

    新浪提供了长链接转为短链接的API,可以把长链接转为t.cn/xxx这种格式的短链接.短链接对于一些商家来说使用价值非常大,故整理了6个较为好用的t.cn短链接批量生成接口. 1.快鸟短网址 随着移动 ...

  5. 利用新浪API实现短网址生成

    新浪提供了长链接转为短链接的API,可以把长链接转为 t.cn/xxx 这种格式的短链接. API有两种格式: http://api.t.sina.com.cn/short_url/shorten.j ...

  6. 利用新浪API实现股票交易实时监控

    # !/usr/bin/env python # -*- coding:utf-8 -*- # @Author : QQ736592720 # @file : 股票交易盯盘.py # @Time : ...

  7. php新浪api,php调用新浪短链接API的方法,php调用新浪api_PHP教程

    php调用新浪短链接API的方法,php调用新浪api 本文实例讲述了php调用新浪短链接API的方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: //Sina App_Key def ...

  8. php短链接api,PHP通过调用新浪API生成t.cn格式短网址链接的方法详解

    本文实例讲述了PHP通过调用新浪API生成t.cn格式短网址链接的方法.分享给大家供大家参考,具体如下: 新浪提供了长链接转为短链接的API,可以把长链接转为 t.cn/xxx 这种格式的短链接. A ...

  9. 如何利用新浪博客做关键词霸屏

    利用新浪博客的高权重,做好关键词SEO优化,建立博客群,打造被动引流系统,实现百度搜索关键词霸屏. 从博客定位到内容布局,从引流文案植入到博文快速收录的技术都会跟大家详细讲解,适合个人及团队操作. 一 ...

最新文章

  1. 【工具方法util】JAVA中将一个List等分成n个list的
  2. Uber 开源 Piranha,可自动删除过时代码
  3. auto自动类型推断
  4. E820-DTU与昆仑通态组态软件联机
  5. 引用js/css时,加入时间戳解决浏览器缓存问题
  6. Spring容器创建流程(1)容器创建准备
  7. android学习笔记---51_编码实现软件界面,把固定不变的界面写到xml中,逻辑改变的写到程序中,
  8. CheckBox的触发
  9. 非域环境下安装并配置Project Server 2007(二)
  10. 计算机集成技术的研究和应用,信息系统集成技术研究
  11. docx文档怎么排列图片_打开.docx文件的6种方法分享:docx文件怎么打开?
  12. TR CEV65M-01460一个人,也有春夏秋冬
  13. 在Mac上使用android studio调试android手机
  14. selenium找到页面元素click没反应
  15. php博客好看的源码,一款好看的WordPress博客主题源码,可做资源教程发布网
  16. 支付宝崩了,七夕红包发得太多?
  17. Vmware Ubuntu虚拟机磁盘扩容(非常简单)
  18. 【java面对对象】分数类型加减乘除运算的实现
  19. 分析器错误 在分析向此请求提供服务所需资源时出错 请检查下列特定分析错误详细信息并适当地修改源文件未能加载类型XXXX
  20. 20个最好的在线网站 Fav 图标生成工具

热门文章

  1. Unity绿背景抠图插件
  2. 怎么在网上找计算机答案,试卷上怎么啊
  3. 2021年茶艺师(初级)新版试题及茶艺师(初级)考试试卷
  4. 桌面运维工程师常见面试问题汇总
  5. MAX31855热电偶转换器开发流程
  6. Dell戴尔游匣7559黄屏解决办法
  7. chrony时间同步端口
  8. 抖音直播带货数据统计,抖音直播间数据怎么分析
  9. 一步步搭建Retrofit+RxJava+MVP网络请求框架(一)
  10. navicat for mysql 修改密码_怎么用navicat for mysql 修改root 密码