crawler

                                              Web Crawler:网络爬虫

   按照一定的规则,自动地抓取万维网信息的程序或者脚本,目的是自动高效地获取互联网中我们感兴趣的信息并为我们所用。可以自动地抓取万维网信息的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。功能上讲可以分为三个方面:数据采集,处理,储存。爬虫从一个或若干初始网页的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());
}

 

 

 

 

 

 

你可能感兴趣的:(crawler)