最近在学习python爬虫,并尝试用在微博上。然而时代在变化,网上的资料已经过时,基本上都无法在2021年使用,因此通过参考资料和自己钻研,最终走通了crawling过程。下面我会详细说明整个流程及注意事项,一方面是总结,一方面也为大家提供一个参考,希望能够帮助到大家。
python版本3.9.2
需要一个可以正常使用的Weibo账号及密码。
需要一部能够正常使用的手机用于验证。
可选网页记录工具,我这里使用的是Fiddler,大家也可以使用其他的工具,有助于理解原理。
注意我这里是模拟网页端,和手机端是不一样的。但其实网页端是最难的。
----------------------------------------------------
目录
Python模拟微博登录
相信小伙伴们在使用网页端浏览微博的时候会发现,如果要登录网页版,除了用户名密码外,微博现在必须进行身份验证!如下图。

验证方式有三种:短信验证、私信验证和扫码验证。无论哪种验证方式,都需要手机端进行!所以如果要使用Python模拟登录微博,首次必须借助手机进行验证!有的小伙伴看到这儿可能不高兴了:这不坑爹吗,难道每次爬取数据都要用手机验证下,这也太麻烦了!先别急,一旦通过了第一次验证,我们就能够获取登录Cookie信息,只要把Cookie保存在本地,那么在接下来很长一段时间都可以通过直接读取Cookie进行数据爬取,无需再次手机端验证!其实第一次的手机端验证就是为了获取这个Cookie。这里的三种验证方式我们只选择短信验证和私信验证。扫码验证比较麻烦(其实是博主太懒没有研究),不过原理都是差不多的。
那么重点来了:怎么获取这个Cookie?
获取cookie的过程是比较麻烦的,我会尽量讲清楚。
微博预登录
在登录微博之前,我们需要先进行预登录,不要问为啥,微博就是这样设计的😶。
首先,网页端微博的登录地址在此新浪通行证登录。
这里我们可以把Fiddler打开,看看登录的整个过程发起了哪些请求。这里选择短信登录(注意,微博限制了用户每天短信验证码的使用次数,一天内最多接收10次左右的验证码,所以还是更推荐大家使用私信验证,因为私信验证不限制次数)。Fiddler会显示非常多的请求信息。我们可以使用Host过滤出我们需要分析的请求,如下图。
我们需要的就是使用Python模拟发送这些请求,最终获得Cookie数据。

上图中第一个请求prelogin就是预登录请求,用于获取公钥及其他验证信息。这里相当于是Weibo的第一层防护。
我们详细看下这个请求:

请求头如下图。请求头中唯一需要注意的是Referer参数。在使用Python模拟该请求时,请一定加上Referer,不然无法正常发送请求!

再看下请求的params:

entry、callback、rsakt、client都是固定,_则是当前的毫秒级时间戳。su是base64加密后的用户名,加密方法如下:
def get_su(self):
username_quote = quote_plus(self.username)
username_base64 = base64.b64encode(username_quote.encode("utf-8"))
return username_base64.decode("utf-8")
接下来看下返回body。这里我们把返回的json串格式化仔细看下:

retcode表示返回状态,0表示返回成功。servertime依旧是时间戳,pcid不需要,跳过。nonce为随机数。pubkey为公钥,rsakv是下一步请求中需要使用到的字符串。
返回的这些信息中我们需要使用到的是nonce、servertime、rsakv和pubkey,这些信息都是下一步登录请求中需要使用到的参数。其中nonce、servertime和pubkey是用来对密码

本文详述了使用Python模拟登录微博的全过程,包括预登录、登录、短信验证和私信验证,以及如何获取和保存Cookie。此外,还介绍了如何处理微博的“懒加载”来爬取评论数据,揭示了爬虫与网站开发者之间的博弈。

469

被折叠的 条评论
为什么被折叠?



