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教程我就不写了

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

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

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

点击继续创建

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

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

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

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

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

获取key

回到

点击我的应用

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

进入之后点击应用信息

保存下 APP Key 和 APP Secret

点击高级信息

设置回调网址

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

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,整个登录流程如下:

用户在您的网站上点击“使用新浪微博登录”,您的网站将用户重定向到新浪微博的OAuth认证页,重定向链接中包含client_id参数作为您的网站ID,redirect_uri参数告诉新浪微博当用户登录成功后,将浏览器重定向到您的网站;

用户在新浪微博的认证页输入帐号和口令;

新浪微博认证成功后,将浏览器重定向到您的网站,并附上code参数;

您的网站通过code参数向新浪微博请求用户的access token;

您的网站拿到用户的access token后,用户登录完成。

OAuth的access token是提供认证服务的网站(例如新浪微博)生成的令牌,代表一个用户认证信息。在随后的API调用中,传入该access token就代表这个登录用户,这样,通过OAuth协议,您的网站将验证用户的步骤交给新浪微博完成,并由新浪微博告知您用户是否登录成功。

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

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

获取code

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

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

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

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

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

这个界面你应该很熟悉

4. 代码实现

有了token之后,实现抓取数据就十分简单了

能抓取数据的多少就取决于你的token权限了

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

# -*- coding:utf-8 -*-

import requests

from pymongo import MongoClient

ACCESS_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']

#插入mongodb

WeiboData.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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 金融工程python报告期权_利用Backtrader进行期权回测之一:获取期权数据

    最近在学习一些期权方面的知识,希望有一个期权的回测环境,方便自己做一些测试.初步做了一些功课之后,打算从通达信软件获得期权数据,并使用backtrader进行回测.编程语言使用python. 下载期权 ...

  9. python批量爬取小网格区域坐标系_Python爬虫实例_利用百度地图API批量获取城市所有的POI点...

    上篇关于爬虫的文章,我们讲解了如何运用Python的requests及BeautifuiSoup模块来完成静态网页的爬取,总结过程,网页爬虫本质就两步: 1.设置请求参数(url,headers,co ...

  10. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...

最新文章

  1. NO7 利用三剑客awk-grep-sed-head-tail等7种方法实践
  2. python 生成随机图片
  3. shared_ptr智能指针源码剖析
  4. rxjava 并行_使用RxJava和Completable并行执行阻塞任务
  5. 【软件工程】复利计算器--结对编程
  6. 基于HTML5的iPad电子杂志横竖屏自适应方案
  7. Extended Twin Composite Number 思维题
  8. java this关键字的使用_做java两年了,构造方法和方法重载还是搞不明白?一文帮你搞定...
  9. 时间序列经济python_(13)Python初入坑之时间序列基础内容
  10. r5处理器_买完笔记本特别的卡?那是因为你买笔记本之前,处理器没选对
  11. 软考论文写作攻略,让你轻松拿高分!
  12. Start11软件1.0版发布:如果适应了win10或win7的系统,可一键将win11改回
  13. UI设计流行渐变配色素材,轻松驾驭色彩
  14. 告别windows,拥抱ubuntu
  15. MongoDB 之滴滴、摩拜都在用的索引-educoder上面的题目以及笔记
  16. 【一句日历】2019年1月
  17. 【数据结构基础_双向链表(有[*pHead]和[*pEnd])_(C语言实现)】
  18. Python 之霍兰德人格与职业分析
  19. oracle 判断节气,FullCalendar应用——整合农历节气和节日
  20. python开发的录音机(二)让鼠标点击与开始录音同步(录制与回放鼠标宏)

热门文章

  1. 抽样分布(卡方分布、t分布、F分布)
  2. Termux:api 使用及脚本分享
  3. 草根程序员转型做项目管理走过的点点滴滴_康奈尔笔记法介绍
  4. 3dmax寻找丢失贴图_寻找遗失的号码
  5. 3dmax 计算机中丢失,3dmax材质丢失怎么快速找回-解决3dmax材质不见了的方法 - 河东软件园...
  6. 3dmax材质丢失插件_3dmax找回材质插件怎么用
  7. 插桩java_字节码插桩技术
  8. Houdini13:合成
  9. 三星手机android,个人评测 篇三:三星S10e还值得买吗——半年使用杂谈,最终篇...
  10. jmeter beanshell 之常用的代码