当前位置:首页 > 资讯 > 正文

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

系列目录:

JAVA微博爬虫基础篇——简单的微博爬虫(手动cookie)

JAVA微博爬虫中级篇——商业接口(无须cookie)

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

文章这东西写起来是真的麻烦。我语文特不好,什么语句、语义不通之类的是常有的,请务必不要在意(你们在意也没用)。 我第一次用markdown写点东西,打算试试水,因此排版方面会比较乱。

语文不行,排版不行,写这些话的时候我自己都在想:“那你写这东西干嘛?直接放代码不是更方便?”。 人嘛,总是要试试的,不试过怎么知道你自己就是不行。

最后,本篇讲的是微博爬虫的基础实现,适用范围:小规模使用

现在市面有很多大数据或者做舆情分析的公司。这些公司难免都要用到爬虫,自然也涉及到微博爬虫了。虽然微博有自己的商业接口可以提供数据,但是里面有很多限制,比如:频次、字段缺失、不满足需求。尤其是频次,我之前的公司里就几个商业接口,大家共用频次限制死死的,采集量大的时候完全用不过来。

这时候就需要爬虫了,但是微博反爬机制是真的秀,所有内容都是FW.view()填充,动态cookie加密,验证码、封IP等等,尤其是搞了一个Sina Visitor System(新浪访客系统)。如果没有微博的cookie,爬虫取回来的页面全部变成Sina Visitor System了。微博cookie,必须登录后才能获取,而且你爬取过多,账号就会被冻结。

用cookie爬容易被冻结账号,所以要有很多小号;不用cookie,就是Sina Visitor System页面,根本爬不到内容。我手头没小号,所以我只能研究如何跳过这个机制。

之前我接手公司某个需求需要爬微博页面,数据量级大致在二千万左右但只有一周的时间。光用商业接口是根本来不及的。还好,有万能的搜索引擎告诉我有这么一篇文章

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)
我很想放大佬原贴地址,但是有太多盗贴我也分辨不了。原贴中具体的实现方式由于微博的更新,已经不可用了。但是还有一帮人盗贴,实在是看不下去,所以,我打算发这篇文章纠正一下

Sina Visitor System(新浪访客系统),在请求微博页面判断有没有微博cookie?有,就跳转,没有且不是爬虫,就创造一个游客cookie,以便访问。

我用微博的“发现-找人-领域页(d.weibo.com/1087030002_…)”来举例,“1087030002_2975_2017_0”是这个页面的路径名,第一次是302重定向,然后经过一系列的请求跳转,最后变成200。

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

我们稍微比较一下两个“1087030002_2975_2017_0”请求的区别,请求头信息都差不多。最大的不同是,第一次请求是set-cookie,也就是没有cookie的值,第二次多了cookie,里面有三个值YF-Page-G0、SUB、SUBP。也就是说,这个cookie就是我们需要获取的游客cookie。

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

以谷歌浏览器为例。想看到这些请求先清空缓存(主要是cookie,F12打开开发者模式,在Network下面勾选 Preserve log,最后ctrl+R重新加载

接下来,我们具体讨论下,他是怎么设置cookie的。先将第二个请求出来,在Postman中SEND一下。你会发现这个就是Sina Visitor System(新浪访客系统)。而且他还用中文注释,这是赤果果的挑衅(ノ`⊿´)ノ。

我们一眼就能看到,incarnate()方法是给用户赋予访客身份的。它发送了一个get请求,一对比,发现这是上面的第6个请求。也就是说,我们能成功发送第6个请求,就能成功获取cookie。

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

通过js我们可以知道,发送第6个请求,有以下几个参数:

a、t、w、c、gc、cb、from、_rand。其中a、cb、from是定值,_rand是随机数。

我们再看下第6个请求的详情,gc是空的,也就是说,我们只需要知道t(tid)、w(where)、c(conficence)三个参数就可以了

我测试过,发送请求时gc填不填无所谓,一样能成功

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

但是tid是什么呢? 这三个参数又是在哪赋值的?经过仔细的查找,我发现它在body标签中,导入了一个js文件,一对比发现是我们的第三个请求

既然这tid和三个参数在那里找不到,那就只能到这个js里面去找一下。1984行的源码。用tid一搜,就找到了。

如图:w(where) -> recover,看来w(where)在这里等价于recover

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

接下来,就是整理源码。为了方便截图,我改变了js部分代码的位置,但具体实现是没变的。

往下翻一下,我们可以找到这个方法,这个明显就是获取tid的方法。跟Network里的请求比对一下,发现这就是第5个请求。

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

这是一个POST请求,传了两个值,一个是cp,定值为:gen_callback;另一个是fp,他是通过 getFp()方法生成,我看了下大致是获取浏览器类型,窗口大小,字体之类的常量。应该是为了判断是否为爬虫设置的。也就是说,只要不改浏览器配置这些值不会变的。测试的时候,直接进去就可以了

然后,我们用postman发送模拟请求https://passport.weibo.com/visitor/genvisitor(第五个请求),他的返回值为

tid就找到了,只剩w(where)和c(conficence),我们继续看源码,发现他在后面回调的时候进行了处理。w(where) 在"new_tid"为true的时候是3,false的时候是2。

c(conficence) 可能有,可能没有,没有默认为100

虽然我这里没有,但是 data下面有几率出现一个叫 “conficence”的字段,我测试的时候他的值都是95

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

至此,我们找到了发送第6个请求(passport.weibo.com/visitor/vis…)的全部参数,模拟发下请求。得到结果。ok,sub和subp就全部得到。

把这两个参数,加上最开始的YF-Page-G0,就可以得到完整的游客cookie。将这个cookie填入请求头,再次发起https://d.weibo.com/1087030002_2975_2017_0。完美成功

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

JAVA微博爬虫高级篇——自动获取微博cookie(无须账号、每日百万量级)

上面是原理,因此没有放代码。下面给大家放一个用java实现的版本。爬虫一般用Python比较合适,但这次选用java。没有什么理由,就是懒。java版本的之前完成需求的时候就已经写好了,ctrl cv 就够了。python还得从头开始写,太懒了~~

不过,要是光学爬虫。那我还是推荐使用python

接下来的代码,都是从原有项目里拆分的,我稍微改造了下,有些冗余我就不优化了。不用照抄,有些实现完全就是无用的

maven依赖导入jar包。我使用的连接工具用httpclient,解析html页面用jsoup,各位自行选用合适的就好。具体依赖如下


这边加入了ssl校验、代理IP、cookie等等一些连接配置,显得有些复杂了,大家可以自己增减。



通过getTidAndC方法返回的请求结果, 我们可以得到三个参数。 再通过这三个参数获取cookie

YF-Page-G0 的参数,通过发送请求,获取set_cookie的值得到的。这样就获得完整的游客cookie


最后,就是调用测试了。

只要调用getCookie(),就能获取完整的游客cookie。然后就能获取页面数据

我想你们已经发现了,这几个方法都是我以前做测试留下的测试文件,实在懒得改就随意了。下列代码>的运行结果,上面已经发了,就不再发了。


  • 微博的大部分页面都可以用这个方法爬到,搜索和评论没办法拿到全部数据。上限好像是20页?
  • 该方法极其容易被封ip,大规模使用时必须要设置代理ip
  • 同一个ip获取cookie,每5次可能会失败一次,自行做好判断
  • 每个ip的最初几次一般都是失败的,请多试几次
  • 截止  2020年3月8日14点10分13秒,方法并未失效,之后我就不知道了

这个具体实现代码不能说太多,公司项目已经上线,保密协议生效中,博主也就不给自己找麻烦。大抵的思路,就是设置多个线程,提供不同的代理ip,做个错误提醒,异常处理,设置合理的频次让IP存活更久之类的常规操作。

博主曾经开过8个线程,一天大致能爬200w左右的数据量。这方面的话,等什么时候保密协议过了,我还记得的话,再继续更新吧。

转贴,留个全尸就可以了,标明出处和作者,,其余随意 有什么问题可以联系我,或者有什么错误。欢迎斧正。 最后妇女节快乐

1、根据步骤也看不到请求跳转的,没有302重定向直接到200的。

那是因为你cookie可能没清干净。可以试试F12 —— Appllication —— 展开storage下的cookies —— 右键clear

2、有时候tid会返回带符号的 例如+ 或者/ 这些 把这些符号去除之后就会提示tid错误,不去除也是。

这种情况只能重新获取cookie

3、cookie中不加入YF-Page-G0也能成功

我测试的时候cookie中不加入YF-Page-G0无法获取到值。请自行斟酌

4、为什么我这一直报错

最新文章