『壹』 servlet怎麼獲取ajax傳過來的json數據
1.原生AJAX代碼
get請求:
//創建xhr,IE低版本不支持
var xhr = new XMLHttpRequest();
//servlet地址
var url="/Website01/index.view";
xhr.open("get", url, true);
//xhr處理事件,非同步
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
//在這里進行相關處理,通過xhr.responseText獲取後台反饋的文本
...
}
};
//xhr發送數據
xhr.send();
post請求:
post請求需注意要設置請求頭(setRequestHeader)
xhr.setRequestHeader(「Content-type」, 「application/json」);針對JSON數據
在xhr.send()中寫需要發送的JSON數據,例如:
xhr.send(JSON.stringify(data));1
2.Servlet基礎知識
Servlet是用Java編寫的伺服器端程序。其主要功能在於互動式地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個介面,廣義的Servlet是指任何實現了這個Servlet介面的類,一般情況下,人們將Servlet理解為後者。
Servlet運行於支持Java的應用伺服器中(Tomcat)。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web伺服器。
在Java中,新建Servlet類繼承自HttpServlet,重寫doGet方法處理get請求,重寫doPost方法,處理post請求,通過
PrintWriter out = response.getWriter();通過out.write()輸出數據到前台的xhr.responseText,通過out.println()輸出頁面。
3.Servlet處理請求
處理請求通過HttpServletRequest類型,Get請求時查詢字元串直接編碼在請求鏈接中,格式為url+」?key1=value1&key2=value2」,通過getParameter(「key1」)來獲取值。
4.前後端傳遞JSON數據
前端傳遞JSON給Servlet
//程序片段,請求頭不能少
xhr.setRequestHeader("Content-type", "application/json");
var data={"name":"Tom","age":20};
xhr.send(JSON.stringify(data));1234
後端接受前端傳遞的JSON數據
//讀取請求傳遞過來的JSON格式數據,返回JSON字元串
private String readJSONData(HttpServletRequest request) {
StringBuffer json=new StringBuffer();
String lineString=null;
try {
BufferedReader reader=request.getReader();
while ((lineString=reader.readLine())!=null) {
json.append(lineString);
}
} catch (Exception e) {
System.out.println(e.toString());
}
return json.toString();
}
String json=readJSONData(request);
//將json字元串轉為java對象
Gson gson=new Gson();
Person person=gson.fromJson(json, Person.class);
說明
Gson為google處理JSON格式數據的jar包,可將JSON字元串轉換為對應的Java對象,也可將相應的Java對象序列化為JSON字元串。Person為定義的類,包含name和age欄位。readJSONData函數將前端請求中的JSON數據轉為java對象。
後端輸出JSON到前端
//後端程序片段,傳遞json數據給前端
Person person=new Person("Tom",20);
Gson gson=new Gson();
String json=gson.toJson(person);
out.write(json);
//前端程序片段,通過ajax獲取json數據
var xhr = new XMLHttpRequest();
var url="/Website01/index.view";
xhr.open("get", url, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
//獲取後台傳遞過來的字元串並轉換為json
var responseJson=JSON.parse(xhr.responseText);
var name=responseJson.name;
var age=responseJson.age;
}
};
xhr.send(null);
5.表單數據的處理
<form method="post" action="/Website01/index.view">
<label>Name:</label><input type="text" id="name1" name="name"><br>
<label>Age:</label><input type="number" id="age1" name="age"><br>
<input type="submit" id="submit" value="提交">
</form>12345
表單數據可以直接在form屬性中定義請求方法和請求路徑,在點擊submit按鈕後數據會直接提交並跳轉。如上的表單,在點擊按鈕提交後,後台使用request.getParameter(「key」)獲取數據,key值為input標簽的name值,而非id值.,即通過以下代碼獲取表單提交的數據。
String name=request.getParameter("name");
String age=request.getParameter("age");12
以上。
『貳』 如何使用python 抓取雪球網頁
現在關注一個組合,就會有持倉變動的提示了。不過我覺得這事情挺有意思的。比如可以把很多持倉的數據都抓下來,做一些綜合的分析,看看現在網站上被持有最多的股票是哪一支,某一天被調入最多的又是哪一支之類。
於是我決定來抓抓看,順便藉此說說我通常用程序做自動抓取的過程。
Step.1 分析頁面
要抓一個網頁,首先自然是要「研究」這個網頁。通常我會用兩種方式:
一個是 Chrome 的 Developer Tools。通過它裡面的 Network 功能可以看到頁面發出的所有網路請求,而大多數數據請求都會在 XHR 標簽下。點擊某一個請求,可以看到其具體信息,以及伺服器的返回結果。很多網站在對於某些數據會有專門的請求介面,返回一組 json 或者 XML 格式的數據,供前台處理後顯示。
另一個就是直接查看網頁源代碼。通常瀏覽器的右鍵菜單里都有這個功能。從頁面的 HTML 源碼里直接尋找你要的數據,分析它格式,為抓取做准備。
對於雪球上的一個組合頁面 粗略地看了一下它發出的請求,並沒有如預想那樣直接找到某個數據介面。看源代碼,發現有這樣一段:
SNB.cubeInfo = {"id":10289,"name":"誓把老刀挑下位","symbol":"ZH010389" ...此處略過三千字... "created_date":"2014.11.25"}
SNB.cubePieData = [{"name":"汽車","weight":100,"color":"#537299"}];
cubeInfo 是一個 json 格式的數據,看上去就是我們需要的內容。一般我會找個格式化 json 的網站把數據復制進去方便查看。
這應該就是組合的持倉數據。那麼接下來,一切似乎都簡單了。只要直接發送網頁請求,然後把其中 cubeInfo 這段文字取出,按 json 讀出數據,就完成了抓取。甚至不用動用什麼 BeautifulSoup、正則表達式。
Step.2 獲取頁面
分析完畢,開抓。
直接 urllib.urlopen 向目標網頁發送請求,讀出網頁。結果,失敗了……
看了下返回結果:
403 Forbidden
You don't have permission to access the URL on this server. Sorry for the inconvenience.
被拒了,所以這種赤裸裸地請求是不行的。沒關系,那就稍微包裝一下:
send_headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection':'keep-alive',
'Host':'xueqiu.com',
'Cookie':r'xxxxxx',
}
req = urllib2.Request(url, headers=send_headers)
resp = urllib2.urlopen(req)
html = resp.read()
header 數據都可以從 Developer Tools 里拿到。這次順利抓到頁面內容。
一般網站或多或少都會對請求來源做一些阻攔,通過加 header 可以搞定大部分情況。
Step.3 提取數據
因為這個數據比較明顯,直接用通過一些字元串查找和截取操作就可以取出來。
pos_start = html.find('SNB.cubeInfo = ') + len('SNB.cubeInfo = ')
pos_end = html.find('SNB.cubePieData')
data = html[pos_start:pos_end]
dic = json.loads(data)
dic 就是一個包含數據的字典對象。之後想干什麼就隨便你了。
對於復雜一點的情況,可以通過 BeautifulSoup 來定位 html 標簽。再不好辦的,就用正則表達式,基本都可以解決掉。
Step.4 處理數據
因為我想對數據進行持久化存儲,並且做展示和分析,所以我用了 django 里的 ORM 來處理抓下來的數據。
# add Portfolio
portfolio, c = models.Portfolio.objects.get_or_create(code=dic['symbol'])
portfolio.name = dic['name']
portfolio.earnings = dic['total_gain']
portfolio.save()
# add Stock
stocks = dic['view_rebalancing']['holdings']
for s in stocks:
stock, c = models.Stock.objects.get_or_create(code=s['stock_symbol'])
stock.name = s['stock_name']
stock.count += 1
stock.weight += s['weight']
stock.save()
Portfolio 記錄下組合及其收益,Stock則記錄每支股票的被收錄數和總收錄份額。
對於抓取到的,一般也可以存在文件中,或者直接通過 SQL 存入資料庫,視不同情況和個人喜好而定。
Step.5 批量抓取
前面的一套做下來,就完整地抓取了一組數據。要達到目的,還要設計一下批量抓取的程序。
一個要解決的問題就是如何獲得組合列表。這個可以再通過另一個抓取程序來實現。然後根據這些列表來循環抓取就可以了。
若要細究,還要考慮列表如何保存和使用,如何處理抓取失敗和重復抓取,如何控制抓取頻率防止被封,可否並行抓取等等。
Step.6 數據分析
數據有了,你要怎麼用它,這是個很大的問題。可以簡單的統計現象,也可以想辦法深入分析背後隱藏的邏輯。不多說,我也還只是在摸索之中。
『叄』 chrome瀏覽器fitler中的XHR作用是什麼
主要作用是用於篩選所有的XHR類型的請求,達到只看XHR類型請求的目的
XHR這個標簽出現在Chrome瀏覽器的開發者工具Network選項卡中
XHR類型即通過XMLHttpRequest方法發送的請求
filter是一個過濾器,它可以篩選包含輸入關鍵詞的請求,也可以篩選特性類型的請求,如domain、status-code等
『肆』 FormData對象被傳到Server端,Server怎樣提取其中的數據
首先獲取http,並創建一個web服務,監聽本地埠1337,這個可以修改,任何未被佔用的埠都可以用,並堅挺data事件和end事件,整個文件保存為app.js
下面這里貼上測試代碼
////////////////app.js///////
var http = require('http');
var server = http.createServer(function(req,res){
if(req.url!=="/favicon.ico"){
req.on('data',function(data){
console.log("伺服器接收到的數據:"+decodeURIComponent(data));
});
req.on("end",function(){
console.log('客戶端請求數據全部接收完畢');
});
}
res.end();
}).listen(1337,"localhost",function(){
console.log("listened");
});
////////////////index.html///////
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Nodejs的data事件與end事件的回調函數測試用頁面</title>
</head>
<body>
<form id= "form1" action = "http://localhost:1337/"method = "post">
姓名:<input type = 'text' name = "name" value ="dragon"><br/>
年齡:<input type = "number" name = "age" value ="25">
<input type = "submit" value =" 提交"/>
</form>
</body>
</html>
『伍』 怎麼通過ajax從後台獲取json數據
1.第一步:創建非同步對象
var xhr=new XMLHttpRequest ();//創建一個非同步對象。
上面創建非同步對象的方法非IE瀏覽器都支持。IE7以上也支持。
2.第二步:創建http請求(只是打開和url的連接,並不會發送請求。)
var xhr=new XMLHttpRequest();
xhr.open("get","介面的地址","true");
//參數一:發送請求的方式:方式分別有post和get
//參數二:請求地址
//參數三:是否是非同步提交true:非同步,flase:同步提交
//如果使用post請求需要為post請求設置一個請求頭(必須在發送數據之前)設置方法如下:
//xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
3.第三步:發送數據(get和post發送數據的方式不相同)
var xhr=new XMLHttpRequest ();//創建一個非同步對象。
xhr.open("get","介面地址?name=zhangsan","true");
//在發送數據上需要注意的是get和post的發送方式
//get:數據需要拼接到open方法裡面的URL地址里格式為URL?數據。(注意:get方式也還是需要調用send方法如不調用數據將不會發送)
//post:數據直接寫到send方法里即可如下:
// xhr.send("name=zhangsan");
4.第四步:設置監聽請求狀態的回調函數
請求狀態分為5步:
0.未初始化:非同步對象創建出來但是還沒有打開連接,(即未調用open方法)
1.已初始化:非同步對象已經創建並且打開了連接(調用了open方法),但是還沒有發送請求(未調用end方法)
2.已發送數據:已經調用了send方法,但web伺服器響應還未返回
3.正在接收:web伺服器接收完數據並且處理完畢後,向客戶端發送響應結果
4.接收完畢:當web伺服器響應的數據全部接收完畢
以上序號對應readyState的值
完整的是這樣:
var xhr=new XMLHttpRequest ();//創建一個非同步對象。
xhr.open("get","介面地址","true");
//下面的回調函數是會動態監聽請求狀態
xhr.onreadystatechange=function(){
//readyState屬性會記錄下5種請求狀態
if(xhr.readyState == 4){
alert("web伺服器響應的數據全部接收完畢")
}
}
『陸』 xhr格式視頻如何下載
首先打開需要下載的視頻,我選擇的是分析化學之儀器分析的網課視頻,按F12打開控制台
打開XHR,看到video關鍵字了嗎?這次我就告訴你這就是視頻相關內容的非同步載入數據。
哦,原來是JSON數據啊,值得注意的是,每個視頻都要三個清晰度,而quality123分別代表了標清高清與超高清
諷刺的是,高清與超高清的視頻大小竟然是一樣的,我只能呵呵了
看到videoUrl裡面的mp4了嗎?說明這是mp4格式的學習視頻
在瀏覽器中打開,就是我想要的內容了
而其它視頻的格式不一定是這個,不同的格式有不同的處理方法,還要在最後加一步格式轉換
如果是m3u8,還要藉助其他程序轉換
如果要批量爬取,就要用request請求到json數據並得到url,再請求就可以了,用selenium模擬值得一試
操作方法
打開電影網站。示例網站
按下F12召喚開發者工具,去到Network一欄。往下看,有XHR,JS,CSS等等。我們只需要看到XHR這個標簽。點進去以後,你發現左側多了一堆東西,其中有一些內容包含了m3u8字元串。選中那一項,右側就會有Request URL這樣的東西(箭頭所指)。我們把這個URL復制(如果URL不是以m3u8結尾就把多餘的部分去掉)。
回到m3u8x。首先勾選Show options以及One…One。
然後將步驟2得到的m3u8鏈接分別貼上到箭頭所指位置。這里順便科普一下,大家應該留意到一些視頻是可以切換解析度,這個就是Quality URL出現的原因。如果沒法選擇解析度 (URL/path) m3u8 和 Quality URL是一樣。Default Download Folder 和 Name就不用多講了吧。
一切准備就緒之後就點擊Download。如果沒有問題,點擊下載之後應該會彈出類似的界面。點Start Download即可靜待花開。
最後在Default Download Folder能找到一個文件夾,名字就和Name那一欄寫的一樣,裡面就有你要的視頻
『柒』 怎麼獲取XHR中的數據
某個程序,或者某個軟體載入完成。xhr應該是那個程序或者軟體的名字。
『捌』 chrome控制台怎麼抓取對應的json數據
在network裡面,點擊xhr,可以看到數據流,如果是json格式,chrome也支持解析的
『玖』 如何使用 Python 抓取雪球網頁
Step.1 分析頁面
要抓一個網頁,首先自然是要「研究」這個網頁。通常我會用兩種方式:
一個是 Chrome 的 Developer Tools。通過它裡面的 Network 功能可以看到頁面發出的所有網路請求,而大多數數據請求都會在 XHR 標簽下。點擊某一個請求,可以看到其具體信息,以及伺服器的返回結果。很多網站在對於某些數據會有專門的請求介面,返回一組 json 或者 XML 格式的數據,供前台處理後顯示。
Step.2 獲取頁面
分析完畢,開抓。
直接 urllib.urlopen 向目標網頁發送請求,讀出網頁。結果,失敗了……
看了下返回結果:
403 Forbidden
You don't have permission to access the URL on this server. Sorry for the inconvenience.
被拒了,所以這種赤裸裸地請求是不行的。沒關系,那就稍微包裝一下:
send_headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Connection':'keep-alive',
'Host':'xueqiu.com',
'Cookie':r'xxxxxx',
}
req = urllib2.Request(url, headers=send_headers)
resp = urllib2.urlopen(req)
html = resp.read()
header 數據都可以從 Developer Tools 里拿到。這次順利抓到頁面內容。
一般網站或多或少都會對請求來源做一些阻攔,通過加 header 可以搞定大部分情況。
Step.3 提取數據
因為這個數據比較明顯,直接用通過一些字元串查找和截取操作就可以取出來。
pos_start = html.find('SNB.cubeInfo = ') + len('SNB.cubeInfo = ')
pos_end = html.find('SNB.cubePieData')
data = html[pos_start:pos_end]
dic = json.loads(data)
dic 就是一個包含數據的字典對象。之後想干什麼就隨便你了。
對於復雜一點的情況,可以通過 BeautifulSoup 來定位 html 標簽。再不好辦的,就用正則表達式,基本都可以解決掉。
Step.4 處理數據
因為我想對數據進行持久化存儲,並且做展示和分析,所以我用了 django 里的 ORM 來處理抓下來的數據。
# add Portfolio
portfolio, c = models.Portfolio.objects.get_or_create(code=dic['symbol'])
portfolio.name = dic['name']
portfolio.earnings = dic['total_gain']
portfolio.save()
# add Stock
stocks = dic['view_rebalancing']['holdings']
for s in stocks:
stock, c = models.Stock.objects.get_or_create(code=s['stock_symbol'])
stock.name = s['stock_name']
stock.count += 1
stock.weight += s['weight']
stock.save()
Portfolio 記錄下組合及其收益,Stock則記錄每支股票的被收錄數和總收錄份額。
對於抓取到的,一般也可以存在文件中,或者直接通過 SQL 存入資料庫,視不同情況和個人喜好而定。
Step.5 批量抓取
前面的一套做下來,就完整地抓取了一組數據。要達到目的,還要設計一下批量抓取的程序。
一個要解決的問題就是如何獲得組合列表。這個可以再通過另一個抓取程序來實現。然後根據這些列表來循環抓取就可以了。
若要細究,還要考慮列表如何保存和使用,如何處理抓取失敗和重復抓取,如何控制抓取頻率防止被封,可否並行抓取等等。
Step.6 數據分析
數據有了,你要怎麼用它,這是個很大的問題。可以簡單的統計現象,也可以想辦法深入分析背後隱藏的邏輯。不多說,我也還只是在摸索之中。
『拾』 C# 怎麼抓取XHR請求的數據
fiddler2 firefox.firebug.network chrome.network 均可以看到xhr請求的數據