网页主动探测工具使用

  单位的项目是IBatis做的,每个查询的SQL里面都有很多判断
   上次优化SQL之后,其中的一个分支报错,但是作为dba,不可能排查每一个分支.
   所以,干脆用爬虫爬过所有的网页,主动探测程序的异常.
   这样有两个好处 
   1.可以主动查看网页是否异常 (500错误,404错误) 
   2.可以筛查速度较慢的网页,从这个方向也可以定位慢SQL吧.(也有服务器资源不足,造成网络超时的情况) 
   前提, 
   必须是互联网公司,大多数网页不用登录也可以浏览 
   首先,建表 
   CREATE SEQUENCE seq_probe_id INCREMENT BY 1 START WITH 1 NOMAXvalue NOCYCLE CACHE 2000; 
   create table probe( 
   id int primary key, 
   host varchar(40) not null, 
   path varchar(500) not null, 
   state int not null, 
   taskTime int not null, 
   type varchar(10) not null, 
   createtime date default sysdate not null 
   ) ; 
   其中host是域名,path是网页的相对路径,state是HTTP状态码,taskTime是网页获取时间,单位是毫秒,type是类型(html,htm,jpg等) 
   程序结构

  程序分三个主要步骤,再分别用三个队列实现生产者消费者模式.
   1.连接.根据连接队列的目标,使用Socket获取网页,然后放入解析队列
   2.解析.根据解析队列的内容,使用正则表达式获取该网页的合法连接,将其再放入连接队列.然后将解析的网页放入持久化队列 
   3.持久化.将持久化队列的内容存入数据库,以便查询。 
   程序使用三个步骤并行,每个步骤可以并发的方式.

$new_page$

  但是通常来说,解析持久化可以分别用单线程的方式执行.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Probe {
private static final BlockingQueue<Task> CONNECTLIST = new LinkedBlockingQueue<Task>();
private static final BlockingQueue<Task> PARSELIST = new LinkedBlockingQueue<Task>();
private static final BlockingQueue<Task> PERSISTENCELIST = new LinkedBlockingQueue<Task>();
private static ExecutorService CONNECTTHREADPOOL;
private static ExecutorService PARSETHREADPOOL;
private static ExecutorService PERSISTENCETHREADPOOL;
private static final List<String> DOMAINLIST = new CopyOnWriteArrayList<>();
static {
CONNECTTHREADPOOL = Executors.newFixedThreadPool(200);
PARSETHREADPOOL = Executors.newSingleThreadExecutor();
PERSISTENCETHREADPOOL = Executors.newFixedThreadPool(1);
DOMAINLIST.add("域名");
}
public static void main(String args[]) throws Exception {
long start = System.currentTimeMillis();
CONNECTLIST.put(new Task("域名", 80, "/static/index.html"));
for (int i = 0; i < 600; i++) {
CONNECTTHREADPOOL.submit(new ConnectHandler(CONNECTLIST, PARSELIST));
}
PARSETHREADPOOL.submit(new ParseHandler(CONNECTLIST, PARSELIST, PERSISTENCELIST, DOMAINLIST));
PERSISTENCETHREADPOOL.submit(new PersistenceHandler(PERSISTENCELIST));
while (true) {
Thread.sleep(1000);
long end = System.currentTimeMillis();
float interval = ((end - start) / 1000);
int connectTotal = ConnectHandler.GETCOUNT();
int parseTotal = ParseHandler.GETCOUNT();
int persistenceTotal = PersistenceHandler.GETCOUNT();
int connectps = Math.round(connectTotal / interval);
int parseps = Math.round(parseTotal / interval);
int persistenceps = Math.round(persistenceTotal / interval);
System.out.print(" 连接总数:" + connectTotal + " 每秒连接:" + connectps + " 连接队列剩余:" + CONNECTLIST.size()
+ " 解析总数:" + parseTotal + " 每秒解析:" + parseps + " 解析队列剩余:" + PARSELIST.size() + " 持久化总数:"
+ persistenceTotal + " 每秒持久化:" + persistenceps + " 持久化队列剩余:" + PERSISTENCELIST.size());
}
}
}
class Task {
public Task() {
}
public void init(String host, int port, String path) {
this.setCurrentPath(path);
this.host = host;
this.port = port;
}
public Task(String host, int port, String path) {
init(host, port, path);
}
private String host;
private int port;
private String currentPath;
private long taskTime;
private String type;
private String content;
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public String getCurrentPath() {
return currentPath;
}
public void setCurrentPath(String currentPath) {
this.currentPath = currentPath;
this.type = currentPath.substring(currentPath.indexOf(".") + 1,
currentPath.indexOf("?") != -1 ? currentPath.indexOf("?") : currentPath.length());
}
public long getTaskTime() {
return taskTime;
}
public void setTaskTime(long taskTime) {
this.taskTime = taskTime;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
class ParseHandler implements Runnable {
private static Set<String> SET = new ConcurrentSkipListSet<String>();
public static int GETCOUNT() {
return COUNT.get();
}
private static final AtomicInteger COUNT = new AtomicInteger();
private BlockingQueue<Task> connectlist;
private BlockingQueue<Task> parselist;
private BlockingQueue<Task> persistencelist;
List<String> domainlist;

本文选自:http://www.spasvo.com/news/html/2014122144836.html

时间: 2024-10-06 11:31:08

网页主动探测工具使用的相关文章

OSSIM中主动与被动探测工具(pads+pf0+arpwatch)组合应用

OSSIM中主动与被动探测工具(pads+pf0+arpwatch)组合应用 OSSIM不仅降低了大家涉足IDS的门槛,而且为各种复杂的应用提供了一种快捷的平台,其中核心技术之一就是基于插件的事件提取,系统内置的180插件,几乎囊括了各大硬件设备厂商和各种网络应用.下面对OSSIM3 下把一些不起眼的小工具组合起来,就能为你解决大问题.下面就对pads+p0f+arpwatch的使用进行简单说明. 工具介绍 对于下面介绍的这些开源工具,在OSSIM中无需安装配置,你只要懂得如何应用就OK. Ar

OSSIM中主动与被动探测工具(arpwatch+p0f+pads)组合应用

OSSIM中主动与被动探测工具(pads+pf0+arpwatch)组合应用 OSSIM不仅降低了大家涉足IDS的门槛,而且为各种复杂的应用提供了一种快捷的平台,其中核心技术之一就是基于插件的事件提取,系统内置的180插件,几乎囊括了各大硬件设备厂商和各种网络应用.下面对OSSIM3 下把一些不起眼的小工具组合起来,就能为你解决大问题.下面就对pads+p0f+arpwatch的使用进行简单说明. 工具介绍 对于下面介绍的这些开源工具,在OSSIM中无需安装配置,你只要懂得如何应用就OK. Ar

phantomjs介绍-(js网页截屏、javascript网页解析渲染工具)

phantomjs介绍-(js网页截屏.javascript网页解析渲染工具) phantomjs 是一个基于js的webkit内核无头浏览器 也就是没有显示界面的浏览器,这样访问网页就省去了浏览器的界面绘制所消耗的系统资源,比较适合用于网络测试等应用 .利用这个工具,我们可以轻松的搭建一个接口用于获取我们想要的url的整页截屏. PhantomJS is a headless WebKit with JavaScript API. It has fast and native support

教你3步免积分下载门素材网页特效无需工具

比如你要下载这个效果,可是积分太贵了,怎么办? 教你免积分下载(此方法仅供学习,建议大家尊重别人的劳动成果,付费购买,谢谢!) 第一步: 找到你要下载的JS特效或者其它 第二步,用火狐或者谷歌审查元素,找到源代码 第三步:找到引入的网页文件,新窗口打开 第四步:你要的特效出来啦!纯净版的,没有任何广告和其它,和你付积分下载的一样,此时你可以用工具偷下来或者直接ctrl+s直接保存为html,完工! 教你3步免积分下载门素材网页特效无需工具,布布扣,bubuko.com

郑州尚学堂:php实现网页缓存的工具类分享

PHP是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域.PHP 独特的语法混合了C.Java.Perl以及PHP自创的语法.它可以比CGI或者Perl更快速地执行动态网页.今天给大家分享php实现网页缓存的工具类的代码及使用方法,非常的实用,希望可以对有需求的小伙伴带来帮助. php程序在抵抗大流量访问的时候动态网站往往都是难以招架,所以要引入缓存机制,一般情况下有两种类型缓存 一.文件缓存 二.数据查询结果缓存,使用内存来实现高速

网页版截图工具上线啦

最近由于公司的一些事情再加上忙着开发完善这个网页版截图工具,所以有差不多一个星期没有和大家分享一下代码学习上的心得,就在今天也就是愚人节,终于上线了.这款网页截图工具被定义为beta版本,目前工具还存在着几个bug没有时间解决, 这些Bug会在下个版本v2.0得到解决,同时如果是有什么好的功能或者是建议的话,也希望大家在下面进行留言(大家快来做做测试工程师) 一.为什么会有这款工具? 其实这款工具在目前市面是还是比较少见的,但是为什么我会制作这款工具呢,一个原因是公司应该说是半个月前,老板想要对

使用PHP+Swoole实现的网页即时聊天工具:PHPWebIM

使用PHP+Swoole实现的网页即时聊天工具 全异步非阻塞Server,可以同时支持数百万TCP连接在线 同时支持websocket+comet2种兼容协议,可用于所有种类的浏览器包括IE 拥有完整的UI界面 支持单聊/群聊/组聊等功能 支持发送表情 支持永久保存聊天记录 基于Server PUSH的即时内容更新,登录/登出/状态变更/消息等会内容即时更新 最新的版本已经可以原生支持IE系列浏览器了,基于Http长连接 安装 swoole扩展 pecl install swoole swool

如何使用浏览器的网页全文翻译工具

如果你正在使用谷歌浏览器,那就很方便了,点击右侧的图标,进入扩展程序 ? 如果没有安装任何扩展,下面会出现这个,点击那个"浏览该程序库" ? 然后就进入了网上商店 ? 在左边搜索翻译,右侧就有了,如果已经添加了这个应用,则会显示绿色,否则显示蓝色,点击添加(个人认为谷歌浏览器有点诡异,有时候"添加至CHROME"并不是超链接,不能点,就算能点,也会弹出什么错误之类的,装好了也要弹出错误,你自己试试就知道了) ? 如果你出现莫名其妙的问题,比如Chrome Web S

网页开发者调式工具Firefox插件

在调试HTML等时,我用的是Firefox,下述是它常用的插件: 毫无疑问,比起其他浏览器,Chrome虽有着明显的优势,但是它的劲敌Firefox却是很多前端攻城师和研发人员的挚爱,为了尽可能地提高用户体验,Firefox的社区在插件开发和运用上有着丰富的经验,说它是网站开发者的首选浏览器也并不为过. 本文集合了20款为开发者而生的优质插件,在这些插件的帮助下,网页开发者可以创造出令人惊艳.极富创意的网站页面.接下来,让我们一起看看这些插件吧. 1.Firebug 作为开发领域最著名的插件,F