刚刚看到一个用 java 抓 zhihu 用户的文章
一时兴起,准备写一个用 php 抓的脚本= =
然后在第一步就遇到了蛋疼的问题
我以前从来没用过 curl
好在有官方文档,跟着来也不算难
然而。。。
zhihu 是 https 加密过的.....
翻了下 php 的官方手册,写的不甚详细
在请教了万能的 stackoverflow 之后【面向 stackoverflow编程 。。
终于找到了请求 https 加密链接的方法。
===================
首先说一下,我一开始搜到的方法,都是直接粗暴地禁用 ssl ,虽然这样的确可以用
但是有着强迫症的我没法忍受人家明明开了 ssl 你还非不用。。。
= =好像 CURLOPT_VERIFYPEER 设置为 FALSE 是代表不验证 SSL 证书和 host name 的合法性.
也就是说信任所有证书颁发机构
也就是说把这个设置为 FALSE 以后, HTTPS 实质上无法抵御中间人攻击。
所以为了安(qiang)全(po)着(zheng)想,还是设置为 TRUE 吧。
直接贴图,一步一步解释。

#18 初始化 curl
#19 设置链接
#20 设置 HTTP HEADER ,其实打开浏览器,按开 F12 然后把 Request Headers 里除了 cookie 以外的部分一行一行复制进去就好了(这个是个数组,每一行是一项)


#21 设置 cookie ,讲道理我觉得这个理论上应该可以放在 HTTPHEADER 里没必要单独拿出来的吧,不过我没试过,手册里说要单独拿出来就拿出来吧,把刚刚剩下的 cookie 放进来

#22 如果这一项设置成 TRUE ,那么最后执行 curl_exec 的时候会返回结果,否则只会返回 TRUE 、 FALSE, 而把结果粗暴的直接显示在页面上(相当于自动帮你 echo 了)。所以如果需要对返回的数据做进一步地处理,一定要设置成 TRUE 。
#23 这一项如果设置成 FALSE ,那么 #24 和 #25 都不需要了,相当于此时 https 的作用仅用于防止最简单的 http 流量劫持。
#24 #25 这两项我并不知道有啥差别,反正目前设置成一样的能正常工作。最后再来讲这个证书是咋来的(图比较多)
#26 设置编码格式,由于知乎使用了gzip压缩,如果不设置这一项,拿到的数据就是乱码。当然也可以拿到数据以后再解码,不过我觉得这样设置比较方便= =
#27 #28 #29 输出数据及调试语句
然后就是说这个证书的问题= =
curl 需要的证书只是一个根证书,然后从这个根证书下来的信任链上的所有证书都被信任。
所以可以定期维护一个根证书文件(本文中使用的是 Mozilla 的 CA 列表,也就是火狐使用的 CA 列表)。
根据官网上的教程
找个喜欢的地方放证书文件,然后可以用这个命令下载(也可以手动下载替换)
curl --remote-name --time-cond cacert.pem https://curl.haxx.se/ca/cacert.pem
使用命令下载的好处就是你可以把它放在 crontab 里定时更新,不需要老是手动更新。
相应的,上面 #24 中的证书路径也要替换为下载下来的这个文件
25 我目前测试下来是可以直接注释掉也没有问题。。。
======= 以下为 原先暴力取得证书的方法 =======
以 Chrome Stable x64 v57 版本为例
打开知乎,按 F12 ,然后选择这个
security 选项卡下的 view certificate 按钮

选中 证书路径 选项卡 下的根证书(最顶上那个),然后点查看证书

选择 详细信息,点 复制到文件

会弹出一个 证书导出向导,其他的步骤就 下一步下一步 ,然后自己选一个喜欢的目录存放就好
但是这一步需要注意,选择 Base64 编码格式的证书,不然 PHP 不识别。

导出以后在 PHP 里用就行了
来看一下效果

=== EOF ===
我终于沦落到开始写科普类文章的地步了【捂脸
网友评论