爬虫要想爬取需要的信息, 首先第一步就要抓取到页面 html 内容, 然后对 HTML 进行分析, 获取想要的内容. 上一篇随笔《Java 爬虫系列一: 写在开始前》中提到了 HttpClient 可以抓取页面内容.
今天就来介绍下抓取 HTML 内容的工具: HttpClient.
围绕下面几个点展开:
什么是 HttpClient
HttpClient 入门实例
复杂应用
结束语
一, 什么是 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 入门实例
新建一个普通的 maven 项目: 名字随便起, 我的叫: httpclient_learn
修改 pom 文件, 引入依赖
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>4.5.8</version>
- </dependency>
新建 java 类
- 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.tuicool.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);
- }
- }
- }
执行代码, 我们会发现打印出来的其实就是首页完整的 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>
爬虫程序被识别了, 怎么办呢? 别着急, 慢慢往下看
三, 复杂应用
第二个网站访问不了, 是因为网站有反爬虫的处理, 怎么绕过他呢?
1. 最简单的是对请求头进行伪装, 看代码, 加上红框里面的内容后再执行
你会发现返回结果变了, 有真内容了 (红字警告先不管它, 我们起码获取到了 HTML 内容)
那代码中新加的那段内容是哪里来的呢?
请打开谷歌浏览器的 F12, 对就是这里了:
当然我们还可以设置请求的其他头信息, 如 cookie 等
2. 上面说的是伪装成浏览器, 其实如果你伪装了之后, 如果短时间内一直多次访问的话, 网站会对你的 ip 进行封杀, 这个时候就需要换个 ip 地址了, 使用代理 IP
网上有一些免费的代理 ip 网站, 比如 xici
我们选择那些存活时间久并且刚刚被验证的 ip, 我这里选择了 "112.85.168.223:9999", 代码如下
- //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);
执行代码, 能正常返回 HTML 结果. 如果代理 ip 刚好不能用的话, 会报错, 如下显示连接超时, 这个时候需要更换一个新的代理 ip
3. 另外, 程序被识别出来很大原因是短时间内做了太多访问, 这个是正常人不会有的频率, 因此我们也可以放慢爬取的速度, 让程序 sleep 一段时间再爬下一个也是一种反 反爬虫的简单方法.
四, 结束语
这篇简单介绍了下 httpclient 和它的官网, 并用代码说明了如何使用它, 也提到了如果遇到反爬虫的话我们还可以用一些简单的反反爬虫方法进行应对.
对于其他复杂的反反爬虫的方法我还没有研究过, 就是用这几种结合使用. 比如在爬取了一段时间后, 网站需要输入验证码来验证是人在操作, 我没有去管如何突破验证码的事儿, 而是获取代理 ip 池然后在遇到验证码的时候逐个换新的 ip, 这样就可以躲过了验证码. 如果有其他方法, 欢迎留言哦
来源: https://www.cnblogs.com/sam-uncle/p/10908567.html