首页 » 网站建设 » phpeventstream技巧_数据爬取碰着EventStream是个什么器械

phpeventstream技巧_数据爬取碰着EventStream是个什么器械

访客 2024-12-08 0

扫一扫用手机浏览

文章目录 [+]

本日更新的内容因此前事情中采集数据的时候碰着的,目前我碰着的通过EventSource办法给前端供应数据的办法比较少,只见过这一种但是这种办法觉得还是有很多上风。

我们开始之前先看一下这几个问题。

phpeventstream技巧_数据爬取碰着EventStream是个什么器械

数据爬取碰着EventStream是个什么东西?

在一次采集数据的过程中碰着这样一幕,一样平常我们的要求都是http,要求结束往后就开释连接,耗时也很低,大部分我们很随意马虎创造调用的接口就直接获取数据了,但是我在本次采集中没有找到干系的数据接口,这就有些纳闷了,我就想她是如何供应数据的呢?接着我想他肯定是用了websocket或dwr技能推送给前端数据,我就查看干系页面源码末了也没找到,打开调试往后创造有一个特殊耗时的链接,引起了我的把稳。
我就跟进去了,如下图:

phpeventstream技巧_数据爬取碰着EventStream是个什么器械
(图片来自网络侵删)

EventSource办法获取数据

正常http要求

看到这里我创造这里的返回是怎么不想其他的要求,我找了个http链接比拟了一下创造返回内容在EventStream 中,恩这次采集果真和以前的都不同,以前要么是数据接口,要么解析页面,要么接通websocket,这次来了个EventStream ,在这之前我确实没见过,于是乎我网上开始百度了一下原来是html5里的EventSource。
w3cshool先容如下:

HTML5 做事器发送事宜(Server-Sent Events)

HTML5 做事器发送事宜(server-sent event)许可网页得到来自做事器的更新。

Server-Sent 事宜 - 单向通报

Server-Sent 事宜指的是网页自动获取来自做事器的更新。

以前也可能做到这一点,条件是网页不得不讯问是否有可用的更新。
通过做事器发送事宜,更新能够自动到达。

例子:Facebook/Twitter 更新、股价更新、新的博文、赛事结果等。

通过描述我们可以知道他可以接管做事器向客户端推送消流,即完成数据的推送,那么数据推送我们可以用轮询、websocket、wdr、Comet, Ajax推送, 反向Ajax, HTTP流等等办法实现,SSE是不同的技能,Server-Sent的特性是单向吸收,自动吸收,与其他吸收办法都不同。

EventSource与websocket有何差异?

他们都能实现做事端向客户端推送数据,SSE用于web运用程序刷新数据,不须要用户做任何动作。
WebSockets是实现做事端更加繁芜的技能,但它是真的全双工socket, 做事端能推送数据到客户端,客户端也能推送数据回做事端。
SSE事情于存在HTTP/HTTPS协议,支持代理做事器与认证技能。
SSE是文本协议你能轻易地调试它。
如果你须要发送大部二进制数据从做事端到客户端,WebSocket是更好的选择。
如果要双向交互也选用websocket较好。
w3cshool中描述,获取股价等信息,显然EventSource是更好的选择。

WebSocket基于TCP协议,EventSource基于http协议。
EventSource是单向通信,而websocket是双向通信。
EventSource只能发送文本,而websocket支持发送二进制数据。
在实现上EventSource比websocket更大略。
EventSource有自动重连接(不借助第三方)以及发送随机事宜的能力。
websocket的资源占用过大EventSource更轻量。
websocket可以跨域,EventSource基于http跨域须要做事端设置要求头Java后台如何获取爬取数据并入库?

前面说了半天废话,总之EventSource的数据我们须要爬取,而且他能实现数据的推送知道这两点就可以了。
关于前端怎么调用我们直接跳过,如果有和作者一样不知道怎么写得直接上w3cshool,上面有你想要的干系信息,我们接下来重点就看这个数据我们如何采集吧

我们要知道如何采集这个数据,就该当知道这个数据后台发送的事理是什么。
首先他肯定是一个数据连接的要求,

从前真个链接代码我们可以看到她定义了一个后真个做事地址,也便是我们的要求地址,紧接着就会吸收到后台源源不断推送过来的数据。
明白了这点我们就直接通过代码发送仿照要求是不是就可以获取数据了?根据这个思路我们获取数据就可以了。

前端调用代码如下图

我们看到上图提示的代码是用php写的,我们用java写一个推送的,大概便是这样

response.setContentType("text/event-stream"); //这里最主要,定义数据格式response.setCharacterEncoding("UTF-8"); try { PrintWriter writer = response.getWriter(); writer.write("data: 测试数据,测试数据,测试数据 \n\n");//这里须要\n\n,必须要,不然前台吸收不到值,键必须为datawriter.flush(); Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); }

那么以上java代码就相称于我们仿照的一个推送数据做事,也便是说这个数据实在便是个数据输出流,只要进入做事就相称于一个长连接,做事端不关闭那么就可以一贯推送数据,根据这个思路我们写一个吸收程序:

思路:

1.创建要求

2.仿照前端要求,仿照要求验证参数

3.通过while循环读取数据

4.读取数据处理

5.数据入库,代码大概如下

URL realUrl = new URL(url);realUrl.openConnection().setConnectTimeout(3060601000);realUrl.openConnection().setReadTimeout(3060601000);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的要求属性conn.setRequestProperty("accept", "/");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");conn.setRequestProperty("Host", "www.abc.cn");conn.setRequestProperty("Pragma", "no-cache");conn.setRequestProperty("Cache-Control", "no-cache");conn.setRequestProperty("Referer", "http://xxx/index.html");conn.setRequestProperty("Accept-Encoding", " gzip, deflate, sdch");conn.setRequestProperty("Cookie", "+cHCtySezP+hV83LD+/nIFk4h+DnX3JUe0B7f");

// 发送POST要求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection工具对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送要求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的相应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;

String clum ="latitude,longitude,intens,slope,error,location,minisecond,province,"+ "district,country,usedids,cg_ic,height,datetime,hour,minute,second";//获取字段

StringBuffer sb=new StringBuffer();sb.append("insert into thunder ("+clum+")");sb.append(" values("+BaseDao.buildQuestionMarkParam(clum.split(",").length)+")");while ((line = in.readLine()) != null) {String str=line.replace("data: ", "").toLowerCase();str=new String(str.getBytes(),"UTF-8");ThunderModel json = JSON.parseObject(str, ThunderModel.class);//解析数据BaseDao.batch(sb.toString(), JSON.parseArray(JSON.toJSONString(json.getM().get(0).getA())), clum);//数据入库System.out.println("采集成功");}} catch (Exception e) {System.out.println("发送 POST 要求涌现非常!
"+e);e.printStackTrace();System.out.println("正在考试测验重启,如果启动失落败,请手动启动");startThreadData();//出错后重启做事}//利用finally块来关闭输出流、输入流finally{try{if(out!=null){out.close();}if(in!=null){in.close();}}catch(IOException ex){ex.printStackTrace();}}

入库调用代码采取QueryRunner封装

标签:

相关文章

vim支撑php技巧_谁说 Vim 不好用

责编 | 郭芮相信大家在利用各种各样强大的 IDE 写代码时都会把稳到,代码中各种类型的关键字会用独特的颜色标记出来,然后形成一套...

网站建设 2024-12-10 阅读0 评论0

php小偷法式图片技巧_PHP采集 抓取

一、 什么是php采集程序?二、 为什么要采集?三、 采集些什么?四、 如何采集?五、 采集思路六、 采集范例程序七、 采集心得什...

网站建设 2024-12-10 阅读0 评论0