之前就听说过利用网络爬虫来获取页面,感觉还挺有意思的,要是能进行一下偏好搜索岂不是可以满足一下窥探欲。

后来从一本书上看到用HttpClient来爬取页面,虽然也有源码,但是也没说用的HttpClient是哪个版本的,而且HttpClient版本不一样,导致后面很多类也不一样。于是下载了最新的HttpCient版本,并且对着tutorial和网上的文档试着写一个简单的获取页面的例子,最终证明是可行的,但是也遇到了不少问题,而且这个例子也十分简单。

import java.io.IOException;
import java.net.UnknownHostException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileOutputStream; import org.apache.http.HttpEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.message.AbstractHttpMessage; public class Simplest {
private void Get() {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
String HostName = "http://www.baidu.com";
HttpGet httpget = new HttpGet(HostName);
System.out.println(httpget.getURI());
//HttpGet httpget = new HttpGet("http://www.lietu.com");
CloseableHttpResponse response = httpclient.execute(httpget);
System.out.println("Successful!");
System.out.println(response.getProtocolVersion()); //Protocol Version
System.out.println(response.getStatusLine().getStatusCode()); //Status Code
System.out.println(response.getStatusLine().getReasonPhrase());
System.out.println(response.getStatusLine().toString()); //get entity
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream input = entity.getContent();
String filename = HostName.substring(HostName.lastIndexOf('/')+1);
System.out.println("The filename is: " + filename);
OutputStream output = new FileOutputStream(filename); int tempByte=-1;
while ((tempByte=input.read())>0) {
output.write(tempByte);
} if (input != null) {
input.close();
} if (output != null) {
output.close();
}
}
} catch(UnknownHostException e) {
System.out.println("No such a host!");
} catch(IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
Simplest a = new Simplest();
a.Get();
System.out.println("This is a test");
}
}

代码倒是不长,刚开始搞这个啥也不懂,不过最后还是获取了页面,感觉挺有意思的。

代码编译需要两个jar包,httpclient-4.5.2.jar和httpcore-4.4.4.jar将其和源文件Simplest.java放到同一个目录下。

编译过程为:javac -cp httpcore-4.4.4.jar:httpclient-4.5.2.jar Simplest.java

运行过程为:java -cp .:httpclient-4.5.2.jar:httpcore-4.4.4.jar:Simplest:commons-logging-1.2.jar Simplest

之前也搜了好久在命令行怎么导入jar包之类的,基础不牢就是这样的。

接下来的工作就是从简单到复杂,不断扩充爬虫的能力和功能了,包括页面信息提取等。

利用HttpClient写的一个简单页面获取的更多相关文章

  1. apue编程之参考du代码利用递归写的一个简单的du命令的源代码

    #include <stdio.h> #include <stdlib.h> #include <glob.h> #include <string.h> ...

  2. Extjs6(三)——用extjs6.0写一个简单页面

    本文基于ext-6.0.0 一.关于border布局 在用ext做项目的过程中,最常用到的一种布局就是border布局,现在要写的这个简单页面也是运用border布局来做.border布局将页面分为五 ...

  3. 自己写的一个简单PHP采集器

    自己写的一个简单PHP采集器 <?php //**************************************************************** $url = &q ...

  4. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  5. 写了一个简单的CGI Server

    之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看 ...

  6. 写了一个简单可用的IOC

    根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录    只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免 ...

  7. 写了一个简单的 Mybatis

    写了一个简单的 Mybatis,取名 SimpleMybatis . 具备增删改查的基本功能,后续还要添加剩下的基本数据类型和Java集合类型的处理. 脑图中有完整的源码和测试的地址 http://n ...

  8. 基于Spring aop写的一个简单的耗时监控

    前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...

  9. 今天写了一个简单的新浪新闻RSS操作类库

    今天,有位群友问我如何获新浪新闻列表相关问题,我想,用正则表达式网页中取显然既复杂又不一定准确,现在许多大型网站都有RSS集合,所以我就跟他说用RSS应该好办一些. 一年前我写过一个RSS阅读器,不过 ...

随机推荐

  1. Eclipse Xml编译错误Referenced file contains errors - spring-beans-4.0.xsd

    本文转自:http://josh-persistence.iteye.com/blog/2125420 在eclipse中,有时候在xml文件中,特别是于Spring相关的配置文件中,会出现一些不影响 ...

  2. HDUOJ----1166敌兵布阵(线段树单点更新)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. DP较为完整的知识

    数位DP 这类题,才刚刚接触,记得去年网络赛,就有道这样的题,我完全不会, 对于这类题基本方法是,是利用数的位数来构造转移方程. 下面给出两篇论文的链接: <数位计数问题解法研究> < ...

  4. Python中 append 和 extend 的区别

    Python中Lists 的两个方法: append 和 extend : list.append(object) 向列表中添加一个对象object.append 接受一个参数,这个参数可以是任何数据 ...

  5. 【LeetCode】153. Find Minimum in Rotated Sorted Array (3 solutions)

    Find Minimum in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you ...

  6. SecureCRT 详细使用教程和技巧

    SecureCRT 常用技巧 0.在secureCRT里切换不同的窗口:ctrl+tab.    复制:[ctrl] + [shift] + c    粘贴:[ctrl] + [shift] + v  ...

  7. Python学习笔记014——生成器Generator

    1 生成器定义 在Python中,一边循环一边计算的机制,称之为生成器(generator). 生成器是一个迭代器. 含有yield语句的函数是生成器函数,该函数被调用时返回一个生成器对象(yield ...

  8. AR_销售订单收款基本操作(流程)

    2014-06-04 Created By BaoXinjian

  9. AP_建立银行信息总行、分行、账户(设定)

    2014-06-04 Created By BaoXinjian

  10. Python center() 方法

    描述 center() 方法返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格. 语法 center() 方法语法: S.center(width[,fillch ...