网站调用新浪微博内容(python言语恶劣地评论个人博客是垃圾,说个人代码有问题 )
优采云 发布时间: 2021-11-28 12:37网站调用新浪微博内容(python言语恶劣地评论个人博客是垃圾,说个人代码有问题
)
PS:(本人长期售卖大量微博数据,旅游网站评论数据,并提供各种指定的数据爬取服务,Message to。由于更新后微博界面限制增加,此代码可以不再使用爬取数据。如果只是采集数据,可以咨询个人邮箱,如果是学习爬取,建议改成phantomjs从网页爬取微博)html
使用新浪API抓取数据
2018.5.16条提示
现在微博的api接口已经不好用了。具有普通权限的令牌无法再抓取任何数据。用这个代码爬取大量数据是不可能的。只有熟悉使用微博api接口的人才能使用。一个小演示。Python
2018.4.16 说明 linux
注:今天有人在个人博客上差评说是垃圾,说个人代码有问题。这个博客历史悠久,是我的第一个爬虫写的。我很感谢能对个人守则发表意见的人,但我受不了人说脏话和态度不好。如果有什么要说的,那就是现代社会,高*敏*感*词*高知识分子的最低意识。ios
我已经更改了代码。如果有什么问题,欢迎您温柔地指出!!!!混帐
同时,由于新浪微博自身api机制的不断变化,截至目前,本博客的内容有所限制。对我的开发者来说,你申请的token权限只能爬你自己的微博。,所以对于那些想依赖api爬取数据的人来说,恐怕达不到他们的目的。如果要使用api抓取微博内容,只能选择获取更高的开发者权限。github
1. 首先来看看我们得到的结果,是否是你想知道的,然后再决定是否继续阅读。
我主要爬取了4天左右的数据,图中可以看到大约360万条数据,因为是在自己的电脑上爬取数据,有时候晚上上网会中断,所以大约一天能爬取100万条左右最新的微博数据(因为我调用的是最新的微博API public_timeline) web
API文档中定义了很多返回类型(以json数据格式返回,我选择了一些我认为重要的信息抓取如图:大概id号,位置,粉丝数,微博内容,微博时间等.虽然这些数据可以根据自己的需要定制。)mongodb
大概就是这个内容。如果你觉得这对你有帮助,请继续阅读... 第一次写博客有点啰嗦2.前期准备
我们需要什么:数据库
2.1mongodb 安装
MongoDB 是一种高性能、开源、无模式的文档数据库,是最流行的 NoSql 数据库之一。在很多场景下可以用来替代传统的关系型数据库或者键/值存储。Mongo 是用 C++ 开发的。Mongo的官方网站地址是:读者可以在这里获得更详细的信息。json
插曲:什么是NoSql?
NoSql,全称Not Only Sql,指的是非关系型数据库。下一代数据库主要解决几个点:非关系型、分布式、开源、横向扩展。最初的目的是用于大型 Web 应用程序。这一运动始于2009年初。 一般特性如:模型自由、支持简单复制、简单API、最终一致性(非ACID)、大容量数据等。NoSQL是我们使用最多的键值存储,当然,还有其他基于文档的、基于列的、基于图的数据库、xml数据库等。
网上有很多安装mongodb的教程,我就不写了
Windows下mongodb的安装
Linux下mongodb的安装
2.2 如何注册新浪开发者账号
* 建立完成后,需要填写手机号码验证*
首次创建应用程序,您需要填写以下信息:
本页面信息无需填写真实信息,如地区、电话等,可随意填写。网站 填写即可。(邮箱必须是真实的)
继续构建应用程序。自定义应用名称,查看平台下的ios、android
建立完成后,返回继续创建。一个账号可以创建10个应用,每个应用对应一个access-token(其实我只用了一个来满足我的需求)
一一选择创建的应用程序。观点
用txt保存下面的令牌。
回到
点击个人申请
然后选择您刚刚创建的应用程序
进入后点击申请信息
保存APP Key和APP Secret
点击高级信息
设置回调地址
可以设为默认
至此你的开发者账号已经完成
2.3 如何安装依赖库
安装请求和 pymongo
可以直接用pip安装
pip install requests 和 pip install pymongo
也可以直接在Pycharm中安装
选择文件 -> 设置 -> 项目 -> 项目解释器
可以看到自己安装的Python库,点击右边绿色的*+*号
只需安装
3.问题分析3.1 OAuth认证
* 授权机制说明(非常重要)*
网上很多人都在谈论使用新浪微博API发送微博。他们使用这种方式来请求用户授权令牌,但是这种方式显然不适合我们爬取数据,因为我们每次都要请求。从新获取代码。详情请参考新浪微博API授权机制
廖雪峰老师(新浪微博贡献者)也对这个授权机制有解释
通过新浪微博网站的API接入,用户无需在您的网站上注册,直接在新浪微博@>用自己的账号和密码登录您的网站,需要确保你的网站在不知道或不知道用户密码的情况下确认用户已经成功登录。因为用户的密码存储在新浪微博中,所以认证用户的过程只能由新浪微博来完成,但是新浪微博是如何和你的网站沟通并告诉你用户是否登录成功的呢?这个过程称为第三方登录。OAuth 是标准的第三方登录协议。通过 OAuth,您的 网站 可以安全地访问从新浪微博成功登录的用户。
OAuth 目前有两个版本:1.0 和 2.0。2.0版本大大简化了1.0版本,API更简单。新浪微博最新的API也是使用OAuth2.0。整个登录过程如下:
用户在您的网站上点击“使用新浪微博登录”,您的网站将用户重定向到新浪微博的OAuth认证页面。重定向的连接收录client_id参数作为你的网站ID,redirect_uri参数告诉新浪微博,当用户登录成功后,浏览器将重定向到你的网站;用户在新浪微博认证页面输入账号和密码;新浪微博认证成功后,将浏览器重定向到你的网站并附上code参数;你的网站通过code参数向新浪微博请求用户的访问令牌;你的 网站 拿到用户的访问令牌后,用户登录就完成了。
OAuth访问令牌是由网站(如新浪微博)生成的提供认证服务的令牌,表示用户的认证信息。在随后的 API 调用中,传入访问令牌以指示已登录的用户。这样在OAuth协议之后,你的网站会将用户验证步骤交给新浪微博完成,新浪微博会通知你用户是否登录成功。
OAuth的安全是通过第4步完成的。通过code参数获取access token的过程由你的网站后台到新浪微博网站完成,用户看不到获取的HTTP访问令牌。问。如果用户输入伪造的代码,新浪微博将返回错误。
详情请参考廖雪峰老师的文档
一般来说,按照通常要求用户授权调用Token的情况,会出现这种情况:
获取代码
登录后会转一个链接××××××××
我们需要的是code=××××××××××××的值
也就是说,每次调用API认证都会在浏览器中出现一段代码,这显然不利于爬取网站
如何解决问题?首先我们想到的就是在Python程序中模拟登录新浪微博,然后自然就可以得到code值了。不过模拟新浪微博登录比较复杂,既然模拟登录成功了,何必调用API呢……直接自定义爬取不是更方便。
如果你看过上面的授权机制,你应该会想到的。这时候就需要我们之前申请的access-token
个人理解,access-token就是将你的微博授权给第三方,让他为你做一些事情。类似于在手机上通过新浪微博登录然后进行操作(使用上面提到的授权机制) 总之,手机应用可以直接使用官方的手机SDK,通过调用微博客户端进行授权(如果未安装微博客户端,会调用H5授权页面)。
你应该熟悉这个界面
新浪也对Oauth2/access token进行了说明
4.代码实现
有了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()
个人代码一开始是这样的,现在好像搞定了。
不过因为新浪会限制可以调用的次数,所以我又尝试运行了一下,发现了一个问题。我之前打印长度的每一行得到的值都不一样,一直在16-20之间徘徊。它表明我从新运行中获得的数据每次都不同。然后就想算了,就写个无限循环看他什么时候又会被阻塞。所以代码变成如下
删除 run() 并将其替换为以下无限循环。
if __name__ == "__main__":
while 1:
try:
run()
except:
pass
结果,他一直在跑……已经跑了四天了,没有被堵死。估计是不能屏蔽了……
其他接口也以同样的方式使用。只需更改 url 和 params。具体参数请参考新浪微博API文档。
一开始我发现我一天可以拿到800万条数据,这让我很开心……后来我发现了很多重复的数据。找了半天终于找到了解决办法。在mongodb中,根据用户的id和建立时间创建了一个索引(因为不可能同时发两条微博),最后没有重复数据一天搞100条。一万条信息。
我的博客