记一次 Fiddler 无法抓包 PyCharm 的问题
前言
之前尝试分析某条的反爬虫策略,结果遇到了 Fiddler 无法抓取 PyCharm 发出的请求的怪事。请求可以正常发出与获取响应,但就是在 Fiddler 看不到记录。
因此笔者可以确定是自身环境的问题,不是网站的手段(它哪里做得到让我抓不到,但是又能有响应呢!)
几天后,又看到一位新人提出了一个小问题,想帮帮忙。但是软件还是抓不到数据,于是就动手解决一下(善良就是好)。
经过一步步排查,笔者最终发现问题所在(原来是笔者自己以前给自己挖的坑😨,都给忘了)。读者可以根据我的思路进行检查。
归根结底,笔者此次问题是因为软件的设置问题。
排查问题
代理设置问题
首先网上看一下有没有相关方法。
看到有说代理的问题,我想到了是不是我的 Fiddler 设置代理的时候出现了问题,没有成功设置系统代理。
网上的大部分都是在代码里手动将请求发送到 Fiddler 代理上的,而我的一般都是直接设置成系统代理,所以我一般都可以直接抓包的。但是现在唯独抓不到 PyCharm 的包,就浏览器还是可以正常抓包。
还是看一下吧,在系统设置看了一下,代理设置正常:
看一下 Fiddler 设置里的端口,也是 8888。
说明系统代理应该没有问题,那么会不会是 PyCharm 没走这个端口呢?
于是手动在代码里设置上代理:
import requests
data = requests.get(url='https://www.baidu.com',
proxies={'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888'}).text
print(data)
PyCharm 还是正常的获取到了响应,但是笔者的 Fiddler 里还是没有显示任何从 PyCharm 进程里获取到的数据!
规则设置问题
既然代理设置没有问题,那么会不会是被我用的什么 Fiddler 规则隐藏了呢?
这个问题应该是不大可能的,因为以前好像都是可以的获取到的(实际上以前获取到的都是 http 的请求,这时候笔者还没注意到)。
但是,尝试看看,万一是在什么地方不小心开启了多余的太广泛的规则,或者发生 bug 了呢。
首先,我们确定是要抓取的是 All Processes 所有进程,左下角:
再看一下左下角的 Filters ,这些设置的过滤器是没有问题的:
在右边的窗口也是有 Filters 选项卡的,记得自己看看。笔者因为自己从没使用过该功能,所以此处便没有查验。
在 Rules 里看一下启用的规则:
全部关了看看。就在笔者关闭掉这些规则以后,发现了一些端倪:
由于关闭了 Hide CONNECTs,显示出来了 Tunnel to。而这些便是与 https 建立连接相关的!
说明可以抓取到一定的数据,但是不知为何无法抓取到完整的请求。
Fiddler HTTPS 抓取设置问题
笔者打开软件设置看了一下,发现了自己以前给自己挖的坑:
那路或多!软件被设置了只解密来自浏览器的 https 连接!
先前被遗忘的记忆涌来,这是我之前自己设置的😑,还有印象。
将之修改为 ...from all processes,点击 OK 保存,这下总行了吧!
在 PyCharm 运行一下代码,报异常:
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)')))
证书问题,在代码里设置一下 requests 的 verify
参数,关闭证书检验:
import requests
data = requests.get(url='https://www.baidu.com', verify=False,
proxies={'http': 'http://127.0.0.1:8888', 'https': 'http://127.0.0.1:8888'}).text
print(data)
再运行一下,终于获取到了😭:
后记
笔者现在想起来了,原来是之前要用抓包的时候,要抓的 PyCharm 的都是 http 的包,以及一些浏览器插件的特殊需要,顺带可以不用为 https 请求的代码设置 verify
,所以就设置仅解密来自浏览器的 https 请求。
当时还稍微心理暗示了一下自己,要记得这里设置了仅浏览器,然而现在都忘了。
所以实际上,笔者抓不到的是 PyCharm 以及其它【非浏览器进程】的 【https 请求】!
诶,自己挖的坑,噙着泪也要给它填上,仅以此文纪念此番逝去的记忆。