使用fiddler拦截数据包,把数据包发送到指定服务器,优点是不需要逆向,hook的代码都不用了,只需要抓包找到相应的数据链接即可,缺点是这是个半自动的爬取方案
想要实现fiddler数据转发,需要使用fiddler script,这是fiddler功能的扩展,用代码去控制fiddler
fiddlersite.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| import uvicorn from fastapi import FastAPI from pydantic import BaseModel
""" FiddlerObject.log("xiaojianbang1"); //过滤无关请求,只关注特定请求 //这里填写目标返回包的url里的特定字符串 if (oSession.fullUrl.Contains("comment/productPageComments.action")) { FiddlerObject.log("xiaojianbang2"); var html = oSession.GetResponseBodyAsString() FiddlerObject.log(html); //这里填写返回包里的特定字符串 if(html.Contains("comments")){ //数据统计开始:把内容通过ajax http发送其它地方 var _xhr = new ActiveXObject('Microsoft.XMLHTTP'); var url = 'http://127.0.0.1:8000/sendData'; //发送的数据参数 var jsonString = oSession.GetResponseBodyAsString(); var requestHeaders = oSession.oRequest.headers.ToString(); var responseHeaders=oSession.oResponse.headers.ToString(); var str='{}';//构造自己的JSON http请求的信息及返回的结果 var data = Fiddler.WebFormats.JSON.JsonDecode(str); data.JSONObject["requestHeaders"]=requestHeaders; data.JSONObject["responseHeaders"]=responseHeaders; data.JSONObject["responseBody"] = jsonString; data.JSONObject["url"] = oSession.fullUrl; data.JSONObject["response_code"] = oSession.responseCode; if(oSession.oRequest.headers.Exists("Cookie")){ data.JSONObject["requestCookie"] = oSession.oRequest.headers['Cookie']; }else{ data.JSONObject["requestCookie"] = 'request no Cookie'; }; if(oSession.oResponse.headers.Exists("Cookie")){ data.JSONObject["responseCookie"] = oSession.oResponse.headers['Cookie']; }else{ data.JSONObject["responseCookie"] = 'response no Cookie'; }; jsonString = Fiddler.WebFormats.JSON.JsonEncode(data.JSONObject)
FiddlerObject.log(jsonString); _xhr.onreadystatechange=function(){ if (_xhr.readyState==4){ FiddlerObject.log(_xhr.responseText); } }; _xhr.open('POST', url, true); _xhr.send(jsonString); //----数据统计结束----- }else{ //弹窗报错 FiddlerObject.alert("抓取出错!"); } // if end } // if controll end """
class Item(BaseModel): url: str response_code: str responseBody: str requestHeaders: str responseHeaders: str requestCookie: str responseCookie: str
app = FastAPI()
@app.post("/sendData") async def post_info1(request_data: Item): print("url:", request_data.url) print("response_code:", request_data.response_code) print("responseBody:", request_data.responseBody) print('requestHeaders:',request_data.requestHeaders) print('responseHeaders:',request_data.responseHeaders) print('requestCookie:',request_data.requestCookie) print('responseCookie:',request_data.responseCookie) return 'ok'
if __name__ == '__main__': uvicorn.run(app=app, host='127.0.0.1', port=8000)
|
安装fiddler,打开options->https,把选项都勾上
简单来说就是把收到的返回包再给转发到本地服务器,然后本地服务器把返回包里的数据提取出来
fiddler script是一个扩展,可以在发送请求之前对请求包做出一些操作,比如修改header信息,也可以在收到返回包之后对返回包做出操作,比如直接转发给别的服务器,这里用到的就是onBeforeResponse
(在fiddlerscript框里选择go to,再选择onBeforeResponse
),把上面注释里的代码丢到onBeforeResponse
代码里(直接加在已有的代码的后面,不需要删除代码)