网站调用新浪微博内容(一下怎么模拟登陆新浪微博(图)怎么获取微博数据)
优采云 发布时间: 2022-03-15 01:23网站调用新浪微博内容(一下怎么模拟登陆新浪微博(图)怎么获取微博数据)
最近需要爬取微博的数据进行分析。对于新浪微博,官方提供了API,但是有几个致命的限制(调用次数和授权期限的限制),所以我觉得有必要研究爬虫,直接爬取。通过微博获取微博数据的可行性。
由于模拟登陆微博是爬虫抓取微博信息的第一步,下面介绍如何模拟登陆微博(以新浪微博为例)。
这个过程主要分为两个步骤:
1 脚本模拟登陆新浪微博并保存cookies;
2 获得cookie信息后,使用cookie信息直接访问微博url。
其中,第一步是这里讨论的重点。为了更好的模拟这一步,需要一个好的网络监控工具,可以使用火狐的Firebug和Chrome以及IE自带的开发工具(注意IE必须是IE9以上才有监控网络的功能,Chrome的网络交互消息可以在网络部分查看)。另外前两天发现python支持的包很多,用python自定义自己的网络包比较方便,所以这里我用python作为我的开发语言。
好了,先说一下前提工作,下面开始分析用户在登录新浪微博的过程中进行的操作。在下面的例子中,我使用chrome自带的开发者工具作为我的网络包监控工具。
首先打开它(如果你设置了浏览器自动记住密码并自动登录,需要清除cookie),然后通过网络监控工具,我们会发现在用户登录过程中,浏览器与服务器三遍。它们如下:
一、第一个Get请求获取一些参数
在用户名栏输入你的微博账号,然后确认,这时你会发现当你的焦点离开用户名输入框时,浏览器会自动报"callback=sinaSSOController.preloginCallBack&su=&rsakt=mod& checkpin=1&client =ssologin.js (v1.4.5)&_=83” 发送GET请求,如下:
仔细看这个GET请求的响应内容,你会发现这个JSON字符串中收录了几个参数,可能你不知道它们的含义,但是没关系,现在你只需要知道这些参数会在后续处理。能。
二、发送 POST 请求
这部分是整个登录过程的重点。这部分用于向服务器提交用户信息,服务器会判断用户信息是否正确,从而判断登录是否成功。
通过 Chrome 自带的开发者工具,可以观察到 POST 消息的相关信息(url、headers、data)。下图是我的 POST 消息截图:
网址信息如下:
包头信息如下:
POST的消息数据信息如下:
接下来的工作就比较简单了,我们要做的就是模仿上面消息的内容和格式,用python发送类似的消息。在自己自定义类似的消息之前,我觉得有必要简单解释一下上面消息中DATA表单中每一项的含义。
其中,“su”为加密后的用户名,“sp”为加密后的密码。“servertime”、“nonce”和“rsakv”是上一个GET请求返回的JSON字符串的内容。其他参数不变。然后,重点讨论“su”和“sp”的加密算法。
1. "su" 加密算法
su 是 BASE64 计算出来的用户名: su= base64.encodestring( urllib.quote(username) )[:-1];
2. "sp" 加密算法
sp的加密算法可能会经常变化(考虑到网站的安全性,一段时间后登录消息的格式和加密算法发生变化是正常的),目前新浪使用的是RSA算法(如果你比较js 如果你是牛,可以直接去网页源码找它的加密方式,我没找到,参考网上有)。
这里简单介绍一下RSA算法的解密过程。
2.1 安装RSA模块,下载地址为:
2.2 创建一个 rsa 公钥。公钥的两个参数在新浪微博上都给定了固定值,但都是十六进制字符串。第一个是第一步登录的那个。pubkey,第二个是js加密文件中的'10001'。这两个值需要先从十六进制转换为十进制,但也可以在代码中硬编码。我直接写'10001'为65537
rsaPublickey=int(pubkey,16)
key=rsa.PublicKey(rsaPublickey,65537)#创建公钥
message=str(servertime)+\'\t\'+str(nonce)+\'\n\'+str(password)#拼接明文js加密文件得到
passwd=rsa.encrypt(message,key)#encryption
passwd=binascii.b2a_hex(passwd)#将加密信息转换为十六进制。
如果上述所有步骤对您来说都顺利,您将收到以下响应:
这是一个自动跳转语句,其中收录要跳转的URL。如果登录正确,则该URL中的德语retcode值为0。否则,登录错误。您需要仔细检查上述步骤。
三、跳转到对应的微博页面
我们已经得到了上面要重定向的 url,所以现在我们只需要请求这个 URL。这里要注意一点,为了让服务器知道你是否登录,这一步的请求需要使用上一步操作的cookie信息(因为第二步登录成功的信息会会自动记录在cookie中),所以我们在整个程序开始时,需要打开cookie,以保证cookie在以后的操作中可以正确使用。同时对于python用户,这一步不要自己自定义header,因为urllib2默认会自动打包cookie信息。如果手动自定义标头,则可能会丢失 cookie 信息。
下面附上我的参考代码:
参考文章:
1、
2、
从: