‘壹’ 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请求的数据