声明:本篇文章仅做学习交流之用,任何人不得拷贝、剽窃代码用于非法用途,违者后果自负。
本文将不对一些基础概念进行解释,如不理解请自行百度。
注:本教程中,先放图,后放说明,如果看图没看明白,往下看图的解释和说明!
首先讲一下python里面涉及到网页获取的两个库:urllib和requests库。在urllib库里存在urllib.request方法,该方法里请求页面时参数选择有常见的url,header等,例如:
request.Request的参数里可选method,进而选择post,get等方法。
而requests库里则直接提供了post,get等方法,例如:
二者的主要区别是:
requests可以直接构造get,post请求并发起,而urllib.request只能先构造get,post请求,再发起。如果在获取请求对象时,不需要过多参数传递,例如一些简单的爬虫构造,爬取一些网页资源,可直接选择urllib.request;如果需要包装发送的包进行交互操作等,使用requests库更加灵活可靠。这里笔者推荐使用后者进行涉及POST发包等操作的python爬虫设计,requests库模拟浏览器行为更加出色。
回到正题,如何使用requests库实现微博的各种功能?
为简洁起见,这里将直接跳过一些入门部分,进入分析环节。如果你对接下来的一些名词不够了解,请自行百度做好准备工作后再阅读,或找个牛人,不懂就问。
cookie,请求头,检查元素,request method
微博的网页端有两种,一种是直接百度"微博"导向的电脑网页端微博,另一种是在可电脑网页上浏览的手机网页版微博。如果你分不清这两句话,可以看看这两张图片的对比。
它们的区别主要是后者是.cn结尾,前者.com结尾。且后者多了个m.的前缀。这个m就是mobile即移动端的意思。本文选择后者即移动端的网页版微博的地址进行操作。原因为:后者对于爬虫等的防护比较薄弱,且python模拟时涉及到的操作比较简单。
注:以下的操作的前提是登录个人账号。原因很简单:点赞,评论,转发等等,这些操作必须由账号主体完成。
如果网页没有登录账号,不可能完成一个完整的点赞行为。但是不登录就可以浏览一些热门微博,说明在不设置cookie的时候可以爬取一部分微博内容。如果你能想到这一点,说明你有一定的代码天分。事实是确实可以爬到一部分结果,但是没有登陆之后的内容丰富。另外,回到这些操作,点赞,评论,转发,删除微博。点赞微博需要明确点赞的微博是哪条(对应微博ID),那说明在post提交的数据里一定有对应微博ID的字段(每一条微博都有一个独一无二的ID确定自己)。如果你能想到这一点,那么你的代码天分++;微博点赞不只是点赞一种方式,还可以选择自己的心情(例如愤怒,大笑等),这在post提交的数据里也是可选的。如果你能想到这一点,那么你微博玩太多了。
接着发散一下思维,分析一下评论操作。评论也需要对某条微博(回复评论的更加复杂一点,但是方法大致雷同,本文不赘述)进行操作,而且评论具有文本内容(不考虑带图)。那么评论的post发送的data里应该有一个标记微博ID和记录评论内容的字段。如果你能想到这点,那么你没有什么进步。如果你刚才没想到但是现在想到了,那么孺子可教也。
转发操作呢?转发操作不仅需要标记转发的微博,而且转发的用户可以在转发的同时发表自己的看法,因此post提交的data的内容和评论比较接近,都是微博ID和文本两个。(实际上form-data里是三个,其中两个重复)
删除微博不需要表明你的态度,因为你不可能在删除微博的同时还进行什么额外的操作,因此只需要指明删除的是哪条微博就可以了。即微博ID。
好了,看了这么多,上面的分析其实没什么用。因为在实际观测微博客户端的操作之前,这都只是猜测而已。真正的方法是使用检查元素里的network来查看浏览器行为。
即:
如果你找不到network,或者你的页面是中文而你不会将其切换成英文,那么你可以先试试百度来学习一些更多的浏览器的检查元素功能的相关知识。至少对你而言,这个教程你不该往下进行了。
有一个按钮是clear,如果你将鼠标悬停它会显示自己的名字,可以清空监测的包,我建议点一下,然后进行操作,这样看起来比较干净利落。上图就是清空之后的情况。
接下来我的操作是点赞了图中的微博,可以看出右边检测到了一条post操作,名字叫create,如果你出现了好几条操作,首先看看自己是不是进成桌面版微博了,网址对不对,如果网址对了,那么那些操作可能是页面自动额外加载的内容,不用在意。
status code 200表明响应良好,request method 是POST也就是提交了数据,这是我们预料之中的内容,说明这一条对应的浏览器操作,只要用python模拟了,就可以实现点赞操作了。
response headers是服务器返回的内容,这里可以先不看,只看自己给服务器发了什么。
request headers就是请求头,也就是自己的浏览器给微博服务器提交data时的身份证。这里面最重要的就是cookie,保存了个人账号的信息,也就是只要你复制了这段cookie就等于登录了自己的账号(更改密码可能会改变cookie,我没有试过)这也是为什么所有的教程都不会展示cookie,至于最后的XSRF-TOKEN,这是身份令牌,每过一段时间会更新一次。
那你可能会说,令牌更新了cookie不就变了吗?那不还是用不了。理论上确实是这样,所以一个cookie不能一直用下去。但是我可以更新这个令牌,从而让自己的cookie永久可用。至于如何更新令牌,这里我先埋个伏笔,本文不会泄露天机。
headers是个人身份证,而发送的data在哪呢?往下滑可以找到form data栏,这里就是发送的数据,有的浏览器例如edge可能会放到payload里,都一样,只要标题是form data表单数据就可以了。
这里有一个ID,一个attitude,一个st。逐个分析一下,ID就是微博的ID了,验证方法极为简单,点进微博详情,在地址栏可以找到这串数字。
attitude即态度,heart就是喜欢。而这个st,看着形式是不是和刚才提到的XSRF-TOKEN比较接近呢?其实就是XSRF-TOKEN
为什么不一样呢?其实应该是一样才对,两个对应才说明是“真用户”“真即时操作”,这里的不一样,某种程度上藏着更新token的答案。(也就是说,点赞时token过期也是可以通过的)
_spr可能标记了屏幕尺寸,垃圾信息,直接忽略。
接下来构造代码。
有人可能会问,这个headers应该放哪些东西,浏览器的request headers很多。我的经验是,从cookie开始下面的尽量都放进去,有的删除之后post提交依旧可以成功,有的就不行。但是缺少的关键字多了之后,容易被微博服务器屏蔽。
可以看到我这里没有放XSRF-TOKEN,不放对于点赞是否成功没有影响,你可以选择加上。但是这个内容会变化,所以你需要维护headers。而我将cookie独立设置也是便于更新维护。
接下来构造发送的表单数据data
接着该发送post请求了。post请求需要一个网址,不知你还记不记得,在请求的时候有一个URL,刚才没有提到:
在进行python模拟操作的时候,一般操作的URL从来不是网页上显示的简单的链接,而是浏览器实际请求的链接。就比如这里在点赞的时候并不是请求与点赞微博相关的链接,而是一条固定的api的链接。这也是我们要请求的链接。
代码栏输入result.然后按tab补全,你可以看到它可以显示的一些参数。你可以依次输出,看看都是什么玩意,然后想一下有什么用处。
如果你在输出结果里看到ok:1,那说明点赞成功了,不出意外在前面的字段还能找到自己的名字也就是框中的screen_name字段(如果是英文可以直接看到,如果是中文则为unicode编码,复制后用unicode转中文即可查到)
打开手机端微博查看最近点赞,如果有那条目标微博,说明成功了。注:你可以选择一条已经点赞的微博发起点赞请求,并不会取消,因为取消赞和点赞是两种不同的提交内容。而且假如那条已经点赞过的微博是一段时间之前操作的,当你运行程序之后,你会发现微博显示:你刚刚赞过那条微博(点赞时间更新)。
如果你想批量点赞怎么办?把需要操作的微博ID放进TXT中,然后每次读一行处理。注意设置频率,因为程序运行的时候速度是非常快的,过快会被微博服务器处理,你会发现自己被403 forbidden了。
点赞的部分到此结束了,评论、删除、转发,大致类似,我将截图放在下方,大家看一看就懂。
评论微博
注意data应该变为:
转发微博
因此这里的data应该变为
这里的mid和id是一致的,如果你能想到,会不会在某些情况这二者不一致呢?说明你做事相当谨慎,可能对于程序员而言这两个字段各有用途,但是据我的观察,在返回的大量信息中二者均为一致。
删除微博
发微博
visible是微博可见性,如果是1则代表仅自己可见,6代表好友圈可见。如果不设置该字段,则微博为公开。你也可以试试其他数字会有什么结果。发送微博不需要设置微博ID,因为并不存在目标微博。
注意:以上操作均需要对api进行修改,也就是目标url需要调整。例如发送微博时的目标URL为:
将其复制,进行替换,才能发送微博成功。评论,转发,删除的api各自不同,需自行操作。