按照一定的规则,自动地抓取万维网信息的程序或者脚本,目的是自动高效地获取互联网中我们感兴趣的信息并为我们所用。可以自动地抓取万维网信息的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。功能上讲可以分为三个方面:数据采集,处理,储存。爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。
用途
1:实现搜索引擎
2:在大数据时代,让我获取更多的数据源
3:搜索引擎优化(SEO)
第一步:pom.xml文件添加依赖
org.apache.httpcomponents httpclient 4.5.3 org.slf4j slf4j-log4j12 1.7.25
第二步:添加log4j文件
log4j.rootLogger=DEBUG,A1 log4j.logger.cn.itcast = DEBUG log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
第三步:爬取某个页面
public static void main(String[] args) throws Exception { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet("页面地址"); CloseableHttpResponse response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() == 200) { String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content); } }
HTTPClient:使用Java的HTTP协议访问互联网的网页并使用其客户端 HttpClient实现网页数据的抓取
若每次请求都创建HttpClient,会出现频繁创建与销毁的问题,可使用连接池解决:
public static void main(String[] args) { PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); // 设置最大连接数 cm.setMaxTotal(200); // 设置每个主机的并发数 cm.setDefaultMaxPerRoute(20); doGet(cm); doGet(cm); } private static void doGet(PoolingHttpClientConnectionManager cm) { CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build(); HttpGet httpGet = new HttpGet("http://www.itcast.cn/"); CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet); // 判断状态码是否是200 if (response.getStatusLine().getStatusCode() == 200) { // 解析数据 String content = EntityUtils.toString(response.getEntity(), "UTF-8"); System.out.println(content.length()); } } catch (Exception e) { e.printStackTrace(); } finally { //释放连接 if (response == null) { try { response.close(); } catch (IOException e) { e.printStackTrace(); } //不能关闭HttpClient //httpClient.close(); } } }
Jsoup :java的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
使用步骤:
加入Jsoup依赖
org.jsoup jsoup 1.10.3 junit junit 4.12 org.apache.commons commons-lang3 3.7 commons-io commons-io 2.6
使用Jsoup解析url(可以直接输入url,它会发起请求并获取数据,封装为Document对象):
@Test public void testJsoupUrl() throws Exception { // 解析url地址 Document document = Jsoup.parse(new URL("http://www.itcast.cn/"), 1000); //获取title的内容 Element title = document.getElementsByTag("title").first(); System.out.println(title.text()); }
PS:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html解析工具使用
解析字符串(准备html文件):
@Test public void testJsoupString() throws Exception { //读取文件获取 String html = FileUtils.readFileToString(new File("D:\\jsoup.html"), "UTF-8"); // 解析字符串 Document document = Jsoup.parse(html); //获取title的内容 Element title = document.getElementsByTag("title").first(); System.out.println(title.text()); }
解析文件,并封装为Document对象
@Test public void testJsoupHtml() throws Exception { // 解析文件 Document document = Jsoup.parse(new File("D:\\jsoup.html"),"UTF-8"); //获取title的内容 Element title = document.getElementsByTag("title").first(); System.out.println(title.text()); }