天天看点

微博爬虫出错居然还和网络运营商有关

如果大家使用了微博评论超级爬虫 WeiboSuperCommentScrapy,可能会碰到下面的问题:

ticket = ticket_js["ticket"]
KeyError: 'ticket'           

复制

在几个月以前,这个问题的解决办法是因为登录的微博开启了双重登录验证,只需要在微博 app 或者 web 的设置、账号安全、关闭双重登录验证即可,但是近期这个解决办法也失效了,我调试程序发现,com 微博登录的充分必要条件是手机微博扫码登录,可以直接扫码登陆,输入账号密码和验证码之后,跳转的还是那个扫码登录界面,可以说是非常智障的设计了,这不是强迫人下一个微博 app 吗。(此处有看不见的脏话)

微博爬虫出错居然还和网络运营商有关

然后我在想有没有可以绕过这个登录保护,强制扫码登录的流程,巧的是在知乎上看到同一个问题,而且是 8月27日 开始提问的,目前无解,问题地址:https://www.zhihu.com/question/417862407

微博爬虫出错居然还和网络运营商有关

改成扫码登陆后,之前获取 cookie 的工作流程全部都变了,我研究了半个下午,完成了自动化获取实时二维码扫码登录的工作,剩下的就是破解扫码之后前端通过 ajax 和后台进行加密解密的工作流程,然后获取 cookie,但是是明天又要上班了,都是后话了。

我经常在想一个问题,微博所做的越来越多的限制,就是为了保护自己的数据,事实上,微博想让我们拿到的数据,就是没加限制的那部分数据,比如,每个微博评论的前 100 页,而这,就是我之前的 WeiboCommentScrapy.py,也就是 cn 微博的评论爬虫。

于是我又运行起了 WeiboCommentScrapy,由于好久没有更换这里的 cookie,所以需要重新在浏览器登录,复制 cookie 到代码中,但是当我在浏览器中输完账号和密码并点击登录时,意外出现了。

在 chrome 中是这样:

微博爬虫出错居然还和网络运营商有关

在 FireFox 中又是这样:

微博爬虫出错居然还和网络运营商有关

可以确定的是,不是没有连上 Internet 的问题,我开始只是以为微博后台的 bug,然后隔了一天还是这样,不对劲,如果真是 bug 一天了还不上热搜吗?我灵性地把电脑连的 wifi 改成我手机的移动热点,它居然成功了。

微博爬虫出错居然还和网络运营商有关

获取到电脑连接 wifi 和我的移动热点时的分别的 公网 ip 和运营商如下:

微博爬虫出错居然还和网络运营商有关

连着房间wifi时我的电脑公网ip

微博爬虫出错居然还和网络运营商有关

连着移动热点时我的电脑公网ip

cn 微博登录时,登录页面是 weibo.cn,点击登录按钮后跳转到了 security.weibo.com,大概率不是微博登录的服务器的分发策略拒绝了北京移动而接收了北京联通,毕竟用户量那么大,我怀疑是微博对某些 IP 频段的微博爬虫作了限制,具体哪些,我也不知道,所以遇到 cn 微博站无法登录时,或者换个网络就好了。

还有一个问题是,我手机是移动的卡,为何电脑连热点时公网 IP 成了联通的了,我又断开又重连,发现是联通电信随机切换,又陷入了思考,上网查阅资料得知:

通常出现这种情况的宽带是非电信、联通的(拐着弯说移动),分两种 case:

  1. IP 库没有及时更新,此时应该你电脑获得的 IP 地址和网站获得的 IP 总是一致的(最好不用带 CDN 的网站,那些一般 CDN 服务器和你同运营商就无法准确判断,比如 IP138 这类就不行)
  2. 小宽带运营商,移动(铁通)也在此列,由于众所周知的原因目前很多国内资源都存放在电信\联通的网络中,小宽带运营商不可避免的需要和它们互联互通,同时因为处于弱势地位一定是小宽带运营商交钱给电信\联通。

第一种情况是说,IP 是移动的 IP,只不过 IP 查询网站没有及时更新 IP 的归属造成的混淆,第二种就是说是移动是小宽带运营商。(逃)

微博爬虫出错居然还和网络运营商有关

总而言之,com 站已经强制需要扫码登录了,微博的策略应该是会对 com 站的爬虫作更多的限制;而 cn 微博站登不上,导致无法获取 cn 微博的 cookie,导致评论/用户/话题爬虫无法运行,换个网就行。