当前位置:首页 > 知识

java爬虫 fiddler

用Java写爬虫抓数据,爬虫最烦的爬虫不是写代码,是爬虫抓不到。明明浏览器里能看到的爬虫数据,HttpClient发出去就是爬虫返回403,或者拿到的爬虫HTML里压根没有你要的字段。这时候Fiddler就派上用场了。爬虫

Fiddler本质上是爬虫个中间人代理。它把自己塞在你和服务器之间,爬虫所有HTTP/HTTPS流量都从它手里过一遍。爬虫这意味着你能看到浏览器到底发了什么请求——header里带了什么cookie、爬虫参数怎么拼的爬虫、有没有referer校验。爬虫Java代码抓不到的爬虫东西,先让浏览器走Fiddler抓一遍,爬虫照着抄就行。

我拿一个真实场景说。之前要抓某电商平台的商品评论,用Jsoup直接请求接口,返回的JSON永远是空的。打开Fiddler,浏览器里刷新评论页,找到对应的XHR请求,一看就明白了:请求头里有一个X-Request-Sign字段,值是MD5加密的,参数里还带了一个时间戳。这两个东西是前端JS动态生成的,你光用HttpClient硬怼,服务器直接把你当机器人。

找到问题之后,思路就清晰了。要么用Java执行那段JS算出签名,要么用Selenium驱动浏览器让JS自己跑。Fiddler在这里的作用不是帮你解决问题,是帮你定位问题。很多人写爬虫卡住,不是技术不够,是根本不知道对方服务器在校验什么。

HTTPS抓包需要额外配置。Fiddler默认不解密HTTPS流量,你得在Tools > Options > HTTPS里勾上Decrypt HTTPS traffic,然后信任Fiddler的根证书。这一步不做,抓到的全是CONNECT隧道,看不到任何明文内容。Java代码里如果用了HTTPS,同样要处理证书信任问题,否则握手阶段就断了。

// Java端信任所有证书的简化写法(仅用于测试) SSLContext ctx = SSLContext.getInstance("TLS"); ctx.init(null, new TrustManager[]{ new X509TrustManager() {  public void checkClientTrusted(X509Certificate[] chain, String authType) { } public void checkServerTrusted(X509Certificate[] chain, String authType) { } public X509Certificate[] getAcceptedIssuers() {  return new X509Certificate[0]; } }}, new SecureRandom()); HttpClient client = HttpClients.custom().setSSLContext(ctx).build();

这段代码生产环境别用,但调试阶段能帮你排除证书干扰。配合Fiddler看请求,效率翻倍。

另一个容易被忽略的点:Fiddler能改请求。Composer面板里手动构造请求,或者用AutoResponder把线上JS替换成本地文件,调试加密逻辑特别方便。有时候你不需要完全模拟浏览器,只需要搞清楚某个参数的生成规则,Fiddler的断点功能(Rules > Automatic Breakpoints)可以让你在请求发出前暂停,逐个检查参数。

Java爬虫和Fiddler的配合,说到底就是“看”和“仿”两个字。Fiddler负责看,看清楚请求的每一个细节;Java负责仿,把这些细节用代码复现出来。中间遇到加密参数,再补一点JS逆向量或者直接上浏览器自动化。这套组合拳打下来,大部分公开数据都能拿到。

最后提一句,Fiddler抓包只适合调试阶段。正式跑爬虫的时候,你不会开着Fiddler去抓几万条数据。它的价值在于帮你理解目标站点的请求逻辑,理解完了,代码写对,直接跑就行。

分享到: