Java爬虫系列二:使用HttpClient抓取页面HTML
爬虫要想爬取需要的信息,首先是要爬取对方页面的html,然后通过Joup进行解析,获取想要的参数。
上篇文章提到过使用Jsoup解析通过Http请求获取的页面数据(一)HttpClient可以获取对方页面html
今天围绕以下几点来介绍HttpClient
1、HttpClient是什么
2、Http入门实例
3、复杂使用
一、什么是HttpClient
度娘:
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。 以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的官网: (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等) (2)支持自动转向 (3)支持 HTTPS 协议 (4)支持代理服务器等
这里面提到了官网,那就顺便说下它官网上的一些东西。
根据百度给出的HomePage是这个:http://hc.apache.org/httpclient-3.x/,但是进入后你会发现有句话
大意是:Commons HttpClient这个项目已经不再维护了,它已经被Apache HttpComponents替代了。也就是说我们以后要用的话就用新的。点这个Apache HttpComponents的链接进去能看到它最新的版本是4.5,而且有快速上手的例子和专业的说明文档。有兴趣并且英文好的朋友可以好好研究下哦 ~~
因为英语不太好,所以咱也不能按照官网的来,只能自己来摸索了
二、HttpClient怎样入门
(首先自己先建一个小项目,名字自己起都可以 demo)
1.引入pom文件,引入依赖
代码如下(示例):
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</version>
</dependency>
2.新建一个HttpClient入门实例
代码如下(示例):
package httpclient_learn;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.HttpClientUtils;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpClientTest {
public static void main(String[] args) {
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet("https://www.cnblogs.com/");
try {
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "utf-8");
System.out.println(html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
System.out.println("返回状态不是200");
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
}
}
3、执行代码,打印出来的完成Html代码
<!DOCTYPE html>
<html lang="zh-cn">
<head>
//Java开发老菜鸟备注:由于内容太多,具体不再贴出来了
</head>
<body> //Java开发老菜鸟备注:由于内容太多,具体内容不再贴出来了</body> </html>
好了,到这里就完成了一个简单的小例子。
爬一个网站不过瘾,再来一打。接下来我们换个网站:https://www.tuicool.com/,你会发现结果是这样的:
返回状态不是200
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>系统检测亲不是真人行为,因系统资源限制,我们只能拒绝你的请求。如果你有疑问,可以通过微博 http://weibo.com/tuicool2012/ 联系我们。</p>
</body>
</html>
三、HttpClient复杂应用
第二个网站显示的不是真人行为,被检查出来了,因为第二个网站有反爬虫处理,所以咱们对请求参数做一些处理
1、请求头伪装
红色方块里的是做了一个浏览器伪装,但是如果多次请求某一个网页,对方网站就能察觉到你的IP不对,可能会被封死。
2、使用代理IP
网上有很多免费的代理网站, xici(具体可百度搜索)
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet("https://www.tuicool.com/");
//设置请求头,将爬虫伪装成浏览器
request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
HttpHost proxy = new HttpHost("112.85.168.223", 9999);
RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
request.setConfig(config);
112.85.168.223:9999 就是咱们的代理ip和端口
(执行代码如果显示IP请求超时,记得多换IP)
3、当我们多次请求某一个网站的时候,对方网站也可能会发现,所以在做爬虫的时候,最好不定时、隔断时间进行爬取。
总结
这篇简单介绍了下httpclient和它的官网,并用代码说明了如何使用它,也提到了如果遇到反爬虫的话我们还可以用一些简单的反反爬虫方法进行应对。
对于其他复杂的反反爬虫的方法我还没有研究过,就是用这几种结合使用。 比如在爬取了一段时间后,网站需要输入验证码来验证是人在操作,我没有去管如何突破验证码的事儿,而是获取代理ip池然后在遇到验证码的时候逐个换新的ip,这样就可以躲过了验证码。如果有其他方法,欢迎留言哦