最近GFW为了刷存在感,搞得大家是头晕眼花,修改hosts 几乎成了每日必备工作。

索性写了一个小程序,给办公室的同事们分享,其中有个内容 就是抓取网络上的hosts,废了一些周折。

我是在一个博客上抓取的。但是这位朋友的博客应该是在做防盗链,但他的方式比较简单就是5位数的一个整形随机数。这里折腾一下就ok了。

要命的是他这个链接的流类型 居然是gzip。这个郁闷好久,一直以为是编码格式导致解析不出来结果,后来发现是gzip搞的。

主要的一段代码做个记录吧。

 /**
* 网络工具类 用于抓取http://serve.netsh.org上的hosts数据
*
* @author tone
*/
public class NetUtil { private final static String ENCODING = "UTF-8";
private final static String GZIPCODING = "gzip";
private final static String HOST = "http://serve.netsh.org/pub/hosts.php";
private final static String COOKIE = "hostspasscode=%s; Hm_lvt_e26a7cd6079c926259ded8f19369bf0b=1421846509,1421846927,1421847015,1421849633; Hm_lpvt_e26a7cd6079c926259ded8f19369bf0b=1421849633";
private final static String OFF = "off";
private final static String ON = "on";
private final static int RANDOM = 100000;
private static String hostspasscode = null;
private static NetUtil instance; public static NetUtil getInstance() {
if (instance == null) {
instance = new NetUtil();
}
return instance;
} private NetUtil() {
hostspasscode = createRandomCookies();
} /**
* 获取html内容
*
* @param gs
* @param wk
* @param twttr
* @param fb
* @param flkr
* @param dpbx
* @param odrvB
* @param yt
* @param nohl
* @return
*/
public String getHtmlInfo(boolean gs, boolean wk, boolean twttr, boolean fb,
boolean flkr, boolean dpbx, boolean odrv,
boolean yt, boolean nohl) throws Exception {
HttpURLConnection conn = null; String result = ""; //String cookie = "hostspasscode="+hostspasscode+"; Hm_lvt_e26a7cd6079c926259ded8f19369bf0b=1421846509,1421846927,1421847015,1421849633; Hm_lpvt_e26a7cd6079c926259ded8f19369bf0b=1421849633";
String cookie = String.format(COOKIE, hostspasscode); //URL url = new URL("http://serve.netsh.org/pub/hosts.php?passcode=13008&gs=on&wk=on&twttr=on&fb=on&flkr=on&dpbx=on&odrv=on&yt=on&nolh=on");
URL url = new URL(createUrl(hostspasscode, gs, wk, twttr, fb, flkr, dpbx, odrv, yt, nohl));
//System.out.println(cookie);
// System.out.println(url.toString()); conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5 * 1000);
conn.setDoOutput(true);
//get方式提交
conn.setRequestMethod("GET");
//凭借请求头文件
conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
conn.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
conn.setRequestProperty("Connection", "keep-alive");
conn.setRequestProperty("Cookie", cookie);
conn.setRequestProperty("Host", "serve.netsh.org");
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"); // conn.setRequestProperty("Referer", "http://serve.netsh.org/pub/gethosts.php");
// conn.setRequestProperty("X-Requested-With", "XMLHttpRequest"); conn.connect(); String encoding = conn.getContentEncoding(); result = readStream(conn.getInputStream(), encoding);
//测试进度条显示
// result = readStream(new FileInputStream(new File("/home/tone/Resident.Evil.Damnation.2012.1080p.BluRay.x264.DTS-WiKi.mkv")), "11"); conn.disconnect();
if (nohl) {
result=getLocalHost()+result;
} return result;
} /**
* 读取将InputStream中的字节读以字符的形式取到字符串中,如果encoding是gzip,那么需要先有GZIPInputStream进行封装
*
* @param inputStream InputStream字节流
* @param encoding 编码格式
* @return String类型的形式
* @throws IOException IO异常
*/
private String readStream(InputStream inputStream, String encoding) throws Exception {
StringBuffer buffer = new StringBuffer();
ProgressMonitorInputStream pmis = null; InputStreamReader inputStreamReader = null;
GZIPInputStream gZIPInputStream = null;
if (GZIPCODING.equals(encoding)) {
gZIPInputStream = new GZIPInputStream(inputStream);
inputStreamReader = new InputStreamReader(ProgressUtil.getMonitorInputStream(gZIPInputStream, "获取网络数据"), ENCODING); } else { inputStreamReader = new InputStreamReader(ProgressUtil.getMonitorInputStream(inputStream, "获取网络数据"), ENCODING);
} char[] c = new char[1024]; int lenI;
while ((lenI = inputStreamReader.read(c)) != -1) { buffer.append(new String(c, 0, lenI)); }
if (inputStream != null) {
inputStream.close();
}
if (gZIPInputStream != null) {
gZIPInputStream.close();
}
if (pmis!=null) {
gZIPInputStream.close();
} return buffer.toString(); } /**
* 生成随机Cookies数组
*
* @return 五位随机数字
*/
private String createRandomCookies() { return String.valueOf(Math.random() * RANDOM).substring(0, 5); } /**
* 生成链接字符串
*
* @param hostspasscode
* @param gs
* @param wk
* @param twttr
* @param fb
* @param flkr
* @param dpbx
* @param odrvB
* @param yt
* @param nohl
* @return
*/
private String createUrl(String hostspasscode, boolean gs, boolean wk, boolean twttr, boolean fb,
boolean flkr, boolean dpbx, boolean odrv,
boolean yt, boolean nohl) {
StringBuffer buffer = new StringBuffer();
buffer.append(HOST);
buffer.append("?passcode=" + hostspasscode);
if (gs) {
buffer.append("&gs=" + ON);
} else {
buffer.append("&gs=" + OFF);
}
if (wk) {
buffer.append("&wk=" + ON);
} else {
buffer.append("&wk=" + OFF);
}
if (twttr) {
buffer.append("&twttr=" + ON);
} else {
buffer.append("&twttr=" + OFF);
}
if (fb) {
buffer.append("&fb=" + ON);
} else {
buffer.append("&fb=" + OFF);
}
if (flkr) {
buffer.append("&flkr=" + ON);
} else {
buffer.append("&flkr=" + OFF);
}
if (dpbx) {
buffer.append("&dpbx=" + ON);
} else {
buffer.append("&dpbx=" + OFF);
}
if (odrv) {
buffer.append("&odrv=" + ON);
} else {
buffer.append("&odrv=" + OFF);
}
if (yt) {
buffer.append("&yt=" + ON);
} else {
buffer.append("&yt=" + OFF);
}
if (nohl) {
buffer.append("&nohl=" + ON);
} else {
buffer.append("&nohl=" + OFF);
}
return buffer.toString();
} private String getLocalHost() throws Exception { StringBuffer buffer=new StringBuffer();
String hostName=OSUtil.getInstance().getLocalhostName();
buffer.append("#LOCALHOST begin"+"\n");
buffer.append("127.0.0.1\tlocalhost"+"\n");
if (hostName!=null&&!"".equals(hostName)) {
buffer.append("127.0.1.1\t"+hostName+"\n");
} buffer.append("#LOCALHOST end"+"\n");
return buffer.toString(); } }

Java HttpURLConnection 抓取网页内容 解析gzip格式输入流数据并转换为String格式字符串的更多相关文章

  1. 网络爬虫Java实现抓取网页内容

    package 抓取网页; import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream; ...

  2. 【Azure 环境】在Windows环境中抓取网络包(netsh trace)后,如何转换为Wireshark格式以便进行分析

    问题描述 如何在Windows环境中,不安装第三方软件的情况下(使用Windows内置指令),如何抓取网络包呢?并且如何转换为Wireshark 格式呢? 操作步骤 1) 以管理员模式打开CMD,使用 ...

  3. iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  4. iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据

    网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...

  5. paip.抓取网页内容--java php python

    paip.抓取网页内容--java php python.txt 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...

  6. 使用Jsoup函数包抓取网页内容

    之前写过一篇用Java抓取网页内容的文章,当时是用url.openStream()函数创建一个流,然后用BufferedReader把这个inputstream读取进来.抓取的结果是一整个字符串.如果 ...

  7. 使用Python中的urlparse、urllib抓取和解析网页(一)(转)

    对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过Python 语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...

  8. HTTPCLIENT抓取网页内容

    通过httpclient抓取网页信息. public class SnippetHtml{ /** * 通过url获取网站html * @param url 网站url */ public Strin ...

  9. 爬虫学习一系列:urllib2抓取网页内容

    爬虫学习一系列:urllib2抓取网页内容 所谓网页抓取,就是把URL地址中指定的网络资源从网络中读取出来,保存到本地.我们平时在浏览器中通过网址浏览网页,只不过我们看到的是解析过的页面效果,而通过程 ...

随机推荐

  1. TFS 2010 使用手册(二)项目集合与项目

    1.项目集合 1.1 项目集合创建 打开TFS管理控制台,点击“团队项目集合”. 图1点击“团队项目集合” 图2 点击“创建集合” 然后按照向导一步步完成项目集合的创建. 1.2 项目集合的删除 选中 ...

  2. 关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结

    遇到此问题先需确认几个问题: 1)MS DTC是否设置正确? 2)是否启用了防火墙?是否对DTC做了例外? 3)是否做了hosts映射?是否跨网域通信? 开发分布式事务,碰到一个错误“与基础事务管理器 ...

  3. 【谷歌市场安装】Google Play 闪退问题解决

    Google Play 安装后闪退,是因为手机没有内置GMS(Google Mobile Service) 框架. 由于谷歌退出了中国市场,国产手机很多都没有内置GMS, 导致Google Play ...

  4. Backbone.js学习之初识hello-world

    说了好久好久要学习Backbone.js,现在终于下定决心开始学习了.然后呢,就根据我的学习进度在这里做个简单的记录,方便新人,也方便我自己以后回忆. 准备 用bower下载这几个库或框架也是醉了.. ...

  5. 纯css3 transforms 3D文字翻开翻转3D开放式效果

    详细内容请点击 在线预览立即下载 在本教程中,将基于CSS3创建的一个实现一个有趣的3D开放式效果.教程的目的是展示我们如何能带来一些生活上使用CSS3 . html: <ul class=&q ...

  6. 【CSS3】---层模型position之fixed固定定位、absolute绝对定位和relative相对定位

    什么是层模型? 什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧.但是在网 ...

  7. 一场ACM一场梦——我的一年

    听着裁判倒计时比赛结束,看着全场鲜艳的气球,今天的结果是the last result i can image. 过几天给校赛出题,去年此时的我,还从来没有过竞赛的经验,只因为在大学开学前看了一点点c ...

  8. WPF非UI线程获取修改控件属性值的方法

    public class InvokeHelper { #region delegates private delegate object MethodInvoker(Control control, ...

  9. jQuery Ajax应用

    jQuery Ajax应用 本章主要了解jQuery的Ajax与传统的Ajax的区别,掌握JQuery的Ajax常用的方法与Ajax相关的函数. 详细内容,请点击jQuery Ajax应用查看:

  10. 使用strtotime和mktime时参数为0时返回1999-11-30的时间戳问题

    先看例子 代码如下 复制代码 <?php $time = date('Y-m-d',strtotime('00-00-00 00:00:00')); echo $time; //输出 1999- ...