爬虫直接爬去微博的方式获取微博数据的可行性
优采云 发布时间: 2021-06-21 05:32爬虫直接爬去微博的方式获取微博数据的可行性
最近需要爬取微博的数据进行分析。对于新浪微博,官方提供了API,但是有几个致命的限制(调用次数限制和授权期限限制),所以我觉得有必要研究一下爬虫直接爬到微博获取微博的可行性数据。
由于模拟登录微博是爬虫爬取微博信息的第一步,下面介绍模拟登录微博的方法(以下以新浪微博为例)。
这个过程有两个主要步骤:
1 脚本模拟登录新浪微博并保存cookies;
2 获得cookie信息后,使用cookie信息直接访问微博网址。
其中,第一步是这里讨论的重点。为了更好地模拟这一步,需要一个好的网络监控工具。可以使用Firefox的Firebug和Chrome以及IE自带的开发工具(注意IE必须是IE9以上才能有网络监控功能。Chrome的网络交互消息可以在网络部分查看)。另外,前两天发现python支持的包比较多,用python自定义自己的网络消息也比较方便,所以这里使用python作为我的开发语言。
好的,我们先说前置工作。下面我们来分析一下用户在登录新浪微博时进行的操作。在下面的例子中,我使用 chrome 自带的开发者工具作为我的网络数据包监控工具。
首先打开(如果你之前设置了浏览器自动记住密码并自动登录,需要明确cookie),然后通过网络监控工具,我们会发现在用户登录的过程中过程中,浏览器和服务器有3个交互如下:
一、First Get请求获取一些参数
在用户名字段中输入您的微博帐户,然后确认。这时候你会发现,当你的焦点离开用户名输入框时,浏览器会自动向“(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 公钥。公钥的两个参数在新浪微博上都是固定值,但都是16进制字符串。第一个是第一步登录的公钥,第二个是js加密文件中的'10001'。这两个值需要从十六进制转换为十进制,但也可以写在代码中。我直接把‘10001’写成65537
<p style="line-height:21px; font-family:tahoma,helvetica,arial; white-space:normal; color:rgb(69,69,69)">rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password)#拼接明文 js加密文件中得到
passwd = rsa.encrypt(message, key)#加密
passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
</p>
如果上述所有步骤进展顺利,您将得到以下响应:
这是一个自动重定向语句,其中收录要重定向的 URL。如果您登录正确,则此网址中的德语retcode值为0。否则,您需要仔细检查上述步骤。
三、跳转到对应的微博页面
上面我们已经得到了要重定向的url,所以现在我们只需要请求这个url。这里需要注意的一点是,为了让服务器知道你是否登录,这一步的请求需要用到上一步操作的cookie信息(因为第二步的登录是否成功的信息会会自动记录在cookie中),所以我们在整个程序开始时就打开cookie,以确保在以后的操作中可以正确使用cookie。同时,对于python用户,这一步不要自己自定义header,因为urllib2默认会自动打包cookie信息,如果手动自定义header,可能会遗漏cookie信息。
在下面附上我的参考代码:
参考文章:
1、
2、
转载: