Ⅰ Python爬取知乎与我所理解的爬虫与反爬虫
关于知乎验证码登陆的问题,用到了Python上一个重要的图片处理库PIL,如果不行,就把图片存到本地,手动输入。
通过对知乎登陆是的抓包,可以发现登陆知乎,需要post三个参数,一个是账号,一个是密码,一个是xrsf。
这个xrsf隐藏在表单里面,每次登陆的时候,应该是服务器随机产生一个字符串。所有,要模拟登陆的时候,必须要拿到xrsf。
用chrome (或者火狐 httpfox 抓包分析)的结果:
所以,必须要拿到xsrf的数值,注意这是一个动态变化的参数,每次都不一样。
拿到xsrf,下面就可以模拟登陆了。
使用requests库的session对象,建立一个会话的好处是,可以把同一个用户的不同请求联系起来,直到会话结束都会自动处理cookies。
注意:cookies 是当前目录的一个文件,这个文件保存了知乎的cookie,如果是第一个登陆,那么当然是没有这个文件的,不能通过cookie文件来登陆。必须要输入密码。
这是登陆的函数,通过login函数来登陆,post 自己的账号,密码和xrsf 到知乎登陆认证的页面上去,然后得到cookie,将cookie保存到当前目录下的文件里面。下次登陆的时候,直接读取这个cookie文件。
这是cookie文件的内容
以下是源码:
运行结果:
https://github.com/zhaozhengcoder/Spider/tree/master/spider_hu
反爬虫最基本的策略:
爬虫策略:
这两个都是在http协议的报文段的检查,同样爬虫端可以很方便的设置这些字段的值,来欺骗服务器。
反爬虫进阶策略:
1.像知乎一样,在登录的表单里面放入一个隐藏字段,里面会有一个随机数,每次都不一样,这样除非你的爬虫脚本能够解析这个随机数,否则下次爬的时候就不行了。
2.记录访问的和明ip,统计访问次数,如果次数太高,可以认为这个ip有问题。
爬虫进阶策略:
1.像这篇文章提到的,爬虫也可以先解析一下隐藏字段的值,然后再进行模拟登录。
2.爬虫可以使用ip代理池的方式,来避免被发现。同时,也可以爬一会休息一会的方式来降低频率。另外,服务器根据ip访问次数来进行反爬,再ipv6没有全面普及的时代,这个策略会很容易造成误伤。(这个是我个人丛卖的理解)。
通过Cookie限制进行反爬虫渗棚逗:
和Headers校验的反爬虫机制类似,当用户向目标网站发送请求时,会再请求数据中携带Cookie,网站通过校验请求信息是否存在Cookie,以及校验Cookie的值来判定发起访问请求的到底是真实的用户还是爬虫,第一次打开网页会生成一个随机cookie,如果再次打开网页这个Cookie不存在,那么再次设置,第三次打开仍然不存在,这就非常有可能是爬虫在工作了。
反爬虫进进阶策略:
1.数据投毒,服务器在自己的页面上放置很多隐藏的url,这些url存在于html文件文件里面,但是通过css或者js使他们不会被显示在用户看到的页面上面。(确保用户点击不到)。那么,爬虫在爬取网页的时候,很用可能取访问这个url,服务器可以100%的认为这是爬虫干的,然后可以返回给他一些错误的数据,或者是拒绝响应。
爬虫进进阶策略:
1.各个网站虽然需要反爬虫,但是不能够把网络,谷歌这样的搜索引擎的爬虫给干了(干了的话,你的网站在网络都说搜不到!)。这样爬虫应该就可以冒充是网络的爬虫去爬。(但是ip也许可能被识破,因为你的ip并不是网络的ip)
反爬虫进进进阶策略:
给个验证码,让你输入以后才能登录,登录之后,才能访问。
爬虫进进进阶策略:
图像识别,机器学习,识别验证码。不过这个应该比较难,或者说成本比较高。
参考资料:
廖雪峰的python教程
静觅的python教程
requests库官方文档
segmentfault上面有一个人的关于知乎爬虫的博客,找不到链接了
Ⅱ 一步一步教你 https 抓包
在 Mac 上常用的抓包软件是 Charles,网上关于 Charles 的教程很多,这里介绍另一个抓包神器 mitmproxy。mitmproxy 是一款可交互式的命令行抓包工具,它除了可以抓包查看 http/https 请求,还有一个很强大的功能是拦截并修改 request 或者 response,后面我会用实际例子演示如何修改知乎的回答:)
mitmproxy 官网 介绍了用以下命令来安装
我在实际安装过程中遇到了一些坑,首先是 OSX El Capitan 及以上的系统版本在安装时会出现 six 模块依赖错误,具体可以看 这儿 的讨论。还有一个问题是安装过程中会出现权限错误,需要以 root 权限执行。最后用以下命令成功安装,安装不了需要翻一下墙
首先需要配置一下网络环境,将手机和电脑连在同一个 wifi 环境下,然后进入手机的 设置 - 无线局域网,点击当前连接的 wifi 进入详情设置页面,在 http 代理那一栏输入当前连接的 ip 地址,端口填8080,这个 ip 地址可以在电脑上的 系统偏好 - 网络 里查看,配置完成如下图,
网络环境配置完成后我们可以开始实际的抓包了,只需在电脑上打开终端(命令行操作窗口),然后输入 mitmproxy -p 8080 ,如果你看到如下页面说明你已成功进入抓包模式,迈出了第一步,cheer~
接下去你可以用手机打开一些 App,不出意外你能看到一些 http 请求的列表。这时候我们还无法抓到 https 的包,还需要做一些额外配置。
下面的操作是针对 iPhone 手机,其他设备也类似。用 iPhone 打开 Safari 浏览器并输入 mitm.it,这时你会看到如下页面,
选择对应平台并安装证书,安装完成后就可以抓 https 的包了, 官网上 解释了这个工具是如何工作的
好了,到这里我们已经完成了所有的准备工作,接下去就和我一起实际体验一下 https 的抓包过程吧。
这里以知乎为例,用手机打开知乎,我们应该能看到知乎的请求出现在列表里了,类似下图:
键盘上下移动,Enter 键进入查看详情,按 Tab 键切换顶部导航栏,如下图所示,
上面演示的是常规的操作,下面介绍一下 mitmproxy 的另一强大功能,拦截修改 request 和 response。
输入 i ,然后输入 ~s 再按回车键,这时候就进入了 response 拦截模式。如果输入 ~q 则进入 request 的拦截模式,更多的命令可以输入 ? 查看。拦截模式下的页面显示如下图所示,
其中橘红色的表示请求正被拦截,这时 Enter 进入后 再按 e 就可以修改 request 或者 response。修改时是用 vim 进行编辑的,修改完成后按 a 将请求放行,如果要放行所有请求输入 A 即可。
下图是我修改了某个答案的 response 请求将回答者的名字做了修改,因为只修改了 response 并不会影响其他的用户显示:)
上面提到的那些指令在输入 ? 后都能查看到,如下图,另外 官网 上也有很详细的说明
我用上述方式尝试了大多数的 App,包括淘宝、微博,都能抓到 https 的包,有些有加密,有些没有加密。但是做了防中间人攻击的设置,一启用抓包模式就显示网络错误1012,还是做的很不错的,赞一个~
按照上面的过程操作就可以 https 抓包了,如果有遇到问题可以 联系我 ,记得抓完后将手机 wifi 设置里的 http 代理关闭。开始实际体验一下吧,enjoy~