这篇博客主要记录一下工作中使用到的点滴技术,也会对最基础的内容作讲解,当然讲的东西不只是工作内的内容,希望对各位读者有帮助。
这里说一句话:如果想要优雅的使用
HttpClient
进行抓取,应该同时掌握较好的关于HTTP协议
的内容。就我个人的学习路程来看,对HTTP协议
的内容和理解越深刻具体,对HttpClient
的使用与理解就越容易。
HttpClient基础学习(GET/POST)
关于官方性质的概念就不在这里介绍了,这里主要是以java语言为基础写的一些偏向于基础的教程。
首先是一个关于基本GET
请求的代码介绍,读者可直接粘贴复制运行代码,当然需要下载jar
包,或者和我一样使用maven
进行项目的jar
包管理。
HttpClient Maven
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.3</version>
</dependency>
使用GET
请求的代码。
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
//确定一个url,此处是我博客的链接
String url = "http://blog.csdn.net/mlong54";
//创建一个HttpClient对象
HttpClient httpClient = HttpClients.createDefault();
//这种创建方式的好处是可以在httpClientBuilder中添加我们需要的各种信息,关于详细内容会在以后的博客中更新,
//如果读者是第一次接触HttpClient,那么可以将信息配置到下面的请求中就像我做的那样
// HttpClientBuilder httpClientBuilder = HttpClients.custom();
// HttpClient httpClient = httpClientBuilder.build();
//创建一个GET请求,并为它添加头信息(此处添加了USer-Agent,主要介绍一下头信息的添加方法)
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
try {
//使用HttpCLient发起GET请求,并获得返回的响应实体
HttpResponse httpResponse = httpClient.execute(httpGet);
//打印响应的状态行信息, 例:HTTP/1.1 200 OK(HTTP协议版本,HTTP状态码,HTTP状态码解释)
System.out.println(httpResponse.getStatusLine());
//获取响应的实体信息,以输入流(InputStream)的形式获取页面源码(个人认为实体就是页面源代码的对象)
HttpEntity httpEntity = httpResponse.getEntity();
//通过指定的编码格式,将流转换为String,编码格式可以直接指定也可以从页面提取
String content = IOUtils.toString(httpEntity.getContent(), "utf-8");
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
}
}
另外介绍一下POST
请求的代码书写方式,关于POST
请求,比GET
请求要复杂一下但也那么难理解。另外,POST
请求与GET
请求最大的区别就在于POST
请求需要携带参数,这里的参数包括但不限于用户名密码、页面编号、数据的条数、时间戳、起始/结束位置以及加密的数据等等,POST
可以携带的参数的种类主要由网站的开发者决定,他们喜欢带啥参数就带啥参数。
这里的大部分代码与GET
请求一样,所以不再做解释。
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
public class HttpPostTest {
public static void main(String[] args) {
//找不到网址,只能意思意思了
String url = "localhost:8000";
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
//这里是对POST请求添加参数的地方,参数以key-value的形式添加
List<NameValuePair> list = new ArrayList<NameValuePair>();
list.add(new BasicNameValuePair("name", "value"));
list.add(new BasicNameValuePair("username", "admin"));
list.add(new BasicNameValuePair("password", "admin"));
try {
//添加方式是转化为Entity
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list);
httpPost.setEntity(entity);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
System.out.println(httpResponse.getStatusLine());
String content = IOUtils.toString(httpEntity.getContent());
System.out.println(content);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里简单介绍了一下,基本的GET
和POST
请求的发送方式,也没有简化代码,如果读者需要copy使用代码的话,尽量结合自己的情况进行修改,如果有任何问题可以给我留评论或者私信。
以上。