网站调用新浪微博内容(python言语恶劣地评论个人博客是垃圾,说个人代码有问题 )
优采云 发布时间: 2022-04-06 22:27网站调用新浪微博内容(python言语恶劣地评论个人博客是垃圾,说个人代码有问题
)
PS:(本人长期出售大量微博数据,游网站评论数据,并提供各种指定数据爬取服务,留言至。由于微博界面更新,限制增加,这段代码可以不再使用。爬取数据。如果只是为了采集数据,可以咨询个人邮箱。如果是学习爬虫,建议学习phantomjs从网页爬取微博)html
使用新浪API实现数据抓取(由于增加了API接口限制,本文已基本放弃)
2018.5.16个提示
现在微博的api接口很差,普通权限的token已经爬不上任何数据了。用这段代码爬取大量数据是不可能的。仅供熟悉微博api接口使用的人使用。一个小演示。Python
2018.4.16 说明 linux
注:今天有人恶评说个人博客是垃圾,说个人代码有问题。这个博客历史悠久,是我刚开始玩爬虫时写的一篇博客。非常感谢能对个人代码发表意见的人,但我受不了那些说话粗鲁、态度不好的人。如果你有话要说,那是现代社会一个高*敏*感*词*、高智商的最低意识。IOS
我已经更改了代码。如果还有问题,欢迎大家轻轻指出!!!!混帐
同时,由于新浪微博自身api机制的不断变化,本篇博客的内容至今有限。对于我的开发者来说,你申请的token的权限只能爬你自己的微博。,所以对于那些想依靠api来爬取数据的人来说,恐怕就达不到目的了。如果要使用api抓取微博内容,只能选择获取更高的开发者权限。github
1.首先我们看看我们到底得到了什么结果,是不是你想知道的,然后再决定是否继续读下去。
我主要抓了4天左右的数据。从图中可以看出大概有360万条数据,因为数据是在我自己的电脑上爬取的,有时候晚上会断网,所以大约一天可以爬取最新的1条左右的微博数据万(因为我调用的是最新的微博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 依赖库的安装方法
安装 requests 和 pymongo
可以直接用pip安装
pip install requests 和 pip install pymongo
也可以直接在Pycharm中安装
选择文件 -> 设置 -> 项目 -> 项目解释器
可以看到安装好的Python库,点击右边绿色的*+*号
只需安装
3.分析问题3.1 OAuth认证
*授权机制说明(很重要)*
网上很多人都说用新浪微博API发微博什么的,使用请求用户授权Token的方法,但是这种方法显然不适合我们爬取数据,因为我们每次都要请求,每次从新的获取代码。详见新浪微博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参数向新浪微博请求用户的access token;你的 网站 获取到用户的访问令牌后,用户的登录就完成了。
OAuth访问令牌是提供认证服务的网站(如新浪微博)生成的令牌,表示用户的认证信息。在后续的 API 调用中,会传入访问令牌以指示已登录的用户。这样,经过OAuth协议后,你的网站会将用户验证步骤交给新浪微博,新浪微博会通知你用户是否登录成功。
OAuth的安全性通过第4步完成。通过code参数获取access token的过程是由你的网站后台到新浪微博网站完成的,用户看不到获取访问令牌。问。如果用户输入的是假密码,新浪微博会返回错误。
详情请参考廖雪峰老师的文档
一般来说,按照通常的用户授权Token调用请求,会出现这种情况:
获取代码
登录后会跳转到一个链接××××××××
我们只需要code=××××××××××的值
也就是说,每次调用API鉴权,浏览器都会出现一段代码,这显然不利于我们的爬取网站
如何解决问题?首先我们想到的是在Python程序中模拟登录新浪微博,然后就可以得到代码的值了。不过新浪微博的模拟登录比较复杂,既然模拟登录成功了,何必呢?调用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万条数据,这让我很开心……后来我发现了很多重复的数据。找了半天终于找到了解决办法。我根据用户的id和建立时间在mongodb中创建了一个索引(因为我不可能同时发两条微博),最后一天能得到100份左右没有重复数据。上千条信息。
我的博客