一、前言
说起爬虫,很多人第一反应是使用 Python 语言。但是 Java 爬虫方面也是相当成熟的,使用 Jsoup、HttpClient、HtmlUnit 就可以实现基本的需求。
【爬虫商业应用】
①爬虫还是一个可以盈利的技术,很多网站的收集的内容的重要来源就是使用爬虫技术。
②内容丰富后,可以大大提高个人网站的日流量,通过帮Google等打广告获取资金。
③收集各种优质的资源,聚合在一起,还可以拿出来在淘宝、个人网站等拍卖获利
④等等…
说到底,爬虫是一个实实在在地可以用来赚钱的技术。
当然在做项目的时候,也是有帮助的,比如做一篇文章的缩略图,就可以使用 Java爬虫的图片爬取技术。
二、代码测试
1、写在前面
下面列举一个 Jsoup+HttpClient 爬虫的简单的例子,
注意 ①HttpClient请求、②IP代理、③模拟浏览器、④超时处理 的简单应用即可
先创建一个 SpringBoot 工程,当然创建一个Java工程/Maven工程也可以的
2、简单的需求
① 现在要爬出 CSDN 一个菜单栏的信息(当然,实际应用肯定不会像我这么无聊,应是爬虫一些url、文件、图片等资源点)
② CSDN 首页图、爬取的目标(红色边框的内容)
3、实现
①代码
package com.cun.test;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
* 1、使用 HttpClient 获取网页文档对象
* 2、使用 Jsoup 获取所需的信息
* 3、注意事项:
* ① 设置连接超时:其实就是让它不再继续,做无意义的尝试
* ② 爬虫时被屏蔽了,就更换代理 IP
* ③ 有些网站是设置只能浏览器才能访问的,这时候就要模拟浏览器
* ④ 有些网站的编码不一定是UTF-8,也有可能是GBK
* @author linhongcun
*
*/
public class JsoupHttpClient {
public static void main(String[] args) throws ClientProtocolException, IOException {
// ============================= 【HttpClient】 ====================================
// 创建httpclient实例
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建httpget实例
HttpGet httpget = new HttpGet("https://www.csdn.net/");
// 模拟浏览器 ✔
httpget.setHeader("User-Agent",
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");
// 使用代理 IP ✔
HttpHost proxy = new HttpHost("118.114.77.47", 8080);
RequestConfig config = RequestConfig.custom().setProxy(proxy)
//设置连接超时 ✔
.setConnectTimeout(10000) // 设置连接超时时间 10秒钟
.setSocketTimeout(10000) // 设置读取超时时间10秒钟
.build();
httpget.setConfig(config);
// 执行get请求
CloseableHttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
// 获取返回实体
String content = EntityUtils.toString(entity, "utf-8");
// ============================= 【Jsoup】 ====================================
//获取响应类型、内容
System.out.println("Status:"+response.getStatusLine().getStatusCode());
System.out.println("Content-Type:"+entity.getContentType().getValue());
// 解析网页 得到文档对象
Document doc = Jsoup.parse(content);
Elements elements = doc.getElementsByTag("a"); // 获取tag是a的所有DOM元素,数组
for (int i = 3; i < 17; ++i) {
Element element = elements.get(i); // 获取第i个元素
String title = element.text(); // 返回元素的文本
System.out.println("<a>:" + title);
}
response.close(); // response关闭
httpclient.close(); // httpClient关闭
}
}
②效果
三、小结
1、Java爬虫使用技术主要是 HttpClient+Jsoup 组合,或者是使用 HtmlUnit
前者在爬取网站的速度一般比后者快,
因为不解析 JS、Ajax 等,这也是前者的缺点,也是后者有优点
2、爬虫方面,是必须使用缓存技术的,如使用 Ehcache/Redis(推荐),因为有一些 url 爬出过了就不要再爬取了。
3、动态代理 IP,百度一下,就有很多网站了,上面的 代理IP 就是去网上获取
比如这个 专为爬虫而生
4、以后去别人的 网站上爬取信息,可以先爬取这类网站的 代理IP、端口号 到数据库中,如果作废了一个,就替换另外一个 IP、端口号。