利用新浪API实现数据的抓取\微博数据爬取\微博爬虫
2018-03-13 12:54
483 查看
本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。同时欢迎加入社交媒体数据交流群:99918768
注意:这两天有人给我反映,说爬到的数据都是重复的,而且不能再一直爬了,可能是因为新浪微博api改了,对api研究并不深入,当初只是做的玩一下,并没有很多时间取研究这个了,希望可以抛砖引玉,小伙伴们解决了这个问题也可以跟我说,大家一起进步
我主要抓取了大概4天的数据,图上可以看的出来大概有360万条数据,由于是在自己的电脑上爬取做数据的,有时候晚上断网了就间断了,所以大概一天可以爬取有100万左右的最新微博数据(因为我调用的是最新的微博API public_timeline)
API文档当中定义了很多返回的类型(以json数据格式返回,我选取了一些我认为重要的信息抓取下来如图所示: 大概有id号,所在位置,粉丝数,发的微博内容,发微博的时间等等。 当然这些数据都可以根据自己的需要进行定制。)
数据库: mongodb(可以使用客户端MongoBooster)
开发环境: Python2.7(我用的IDE是Pycharm)
一个新浪开发者账号: 用自己的新浪微博账号注册就行(后面会讲)
需要的库: sinaweibopy和pymongo(这些都可以在Pycharm中下载)
小插曲:什么是NoSql?
NoSql,全称是 Not Only Sql,指的是非关系型的数据库。下一代数据库主要解决几个要点:非关系型的、分布式的、开源的、水平可扩展的。原始的目的是为了大规模web应用,这场运动开始于2009年初,通常特性应用如:模式自由、支持简易复制、简单的API、最终的一致性(非ACID)、大容量数据等。NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。
Linux下mongodb的安装
* 创建完毕需要填写手机号验证 *
进入新浪开放者平台: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
至此你的开发者账号就已经完成了
可以直接用pip安装
pip install requests 和 pip install pymongo
也可以在Pycharm里面直接安装
选择File -> Settings -> Project -> Project Interpreter
可以看到自己安装的Python库,点击右边的绿色* + * 号
安装即可
网上很多讲利用新浪微博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
登陆后会调转到一个连接https://api.weibo.com/oauth2/default.html?code=××××××××
我们所需要的就是code=×××××××××× 的值
如果看了上面的那个授权机制,就应该想到。这个时候就需要我们之前申请的access-token了
access-token 根据我的理解就是把你的微博授权给了第三方让他帮你做一些事情,类似于在你的手机端通过新浪微博来登录然后进行操作(利用上面授权机制里面讲的一句话来说就是)移动端应用可直接使用官方移动SDK,通过呼起微博客户端(未安装微博客户端的会呼起H5授权页)方式授权
这个界面你应该很熟悉
新浪也给出了说明Oauth2/access token
能抓取数据的多少就取决于你的token权限了
接下来就是利用API来获取数据了:新建一个文件weibo_run.py
刚开始我的代码是这样的,看起来已经完成了。
但是,因为新浪会限制你的调用次数,后来我试了一下重新运行,结果发现了一个问题,我之前的print length 出来的每行获取值都不一样,总是在16-20之间徘徊,这说明了我每次重新运行获取的数据都不一样.然后我想算了,干脆写个死循环看他什么时候再被封吧。于是代码就变成了下面这样
把run()删除,换成下面这个死循环。
结果他就一直运行下去了…运行了四天还没有被封,估计是封不了了…
其他接口也是一样使用,只用改变url和params就行,具体参数参照新浪微博API文档
开始我发现一天可以获取800万的数据,把我给乐的…后来发现好多好多重复的数据。最后找了半天的解决方案,在mongodb中根据用户的id和创建的时间这两点建立索引(因为一个人不可能在同一时刻发送两条微博),最后没有重复数据大概一天可以获取100万条左右的信息。
支付宝:
or微信:
利用新浪API实现数据的抓取(2018.4.2 更新)
2018.4.2 说明注意:这两天有人给我反映,说爬到的数据都是重复的,而且不能再一直爬了,可能是因为新浪微博api改了,对api研究并不深入,当初只是做的玩一下,并没有很多时间取研究这个了,希望可以抛砖引玉,小伙伴们解决了这个问题也可以跟我说,大家一起进步
1. 首先来看看最后我们得到的是什么结果,是不是你想要了解的东西,再决定是否往下读。
我主要抓取了大概4天的数据,图上可以看的出来大概有360万条数据,由于是在自己的电脑上爬取做数据的,有时候晚上断网了就间断了,所以大概一天可以爬取有100万左右的最新微博数据(因为我调用的是最新的微博API public_timeline)
API文档当中定义了很多返回的类型(以json数据格式返回,我选取了一些我认为重要的信息抓取下来如图所示: 大概有id号,所在位置,粉丝数,发的微博内容,发微博的时间等等。 当然这些数据都可以根据自己的需要进行定制。)
大概就是这些内容,你如果认为这对你有点帮助,就请继续读下去… 第一次写博客有些啰嗦
2. 前期准备
我们需要的东西:数据库: mongodb(可以使用客户端MongoBooster)
开发环境: Python2.7(我用的IDE是Pycharm)
一个新浪开发者账号: 用自己的新浪微博账号注册就行(后面会讲)
需要的库: sinaweibopy和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 依赖库的安装方法
sinaweibopy和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
登陆后会调转到一个连接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 MongoClient ACCESS_TOKEN = '2.00GrlpNEwp7azCa0cf771a73RorfEE' url = 'https://api.weibo.com/2/statuses/public_timeline.json def run(): #授权 while True: #调用statuses__public_timeline的api接口 params = { 'access_token': TOKEN } statuses = requests.get(url=url, params=params)['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万条左右的信息。
请我喝杯咖啡
如果觉得十分感谢我的内容,可以请我喝杯咖啡~支付宝:
or微信:
个人博客
8aoy1.cn相关文章推荐
- python利用新浪API实现数据的抓取\python微博数据爬虫
- python利用新浪API实现数据的抓取\python微博数据爬虫
- Python爬虫:十分钟实现从数据抓取到数据API提供
- 如何利用API实现行式报表后台导入excel数据入库
- 新浪API, 利用get_uid获取是uid的数据溢出问题解决方案
- chencang-----是使用淘宝API获取数据好,还是利用爬虫去抓取数据好呢
- 利用ASIHTTPRequest 发送数据到(新浪微博)以及新浪API Oauth认证
- 利用ASIHTTPRequest 发送数据到(新浪微博)以及新浪API Oauth认证
- 【python网络编程】新浪爬虫:关键词搜索爬取微博数据
- FLASK (CURRENCY)汇率换算api JSON数据读取显示实现
- 利用js和css实现Bootstrap下拉列表数据过滤
- 【使用JSOUP实现网络爬虫】修改数据-设置属性的值
- 圆形进度条/百分比数据 --- 利用css3和js实现
- 利用ajaxfileupload.js实现跨域上传图片并处理返回的数据
- 利用Java实现搜索引擎爬虫技术
- 利用ORACLE实现数据抽样
- 利用python+jieba+gensim+sklearn实现微博文本性别分类
- 利用Jsoup模拟跳过登录爬虫获取数据
- pyhthon 利用爬虫结合阿里大于短信接口实现短信发送天气预报
- 利用Oracle分析函数实现多行数据合并为一行