自学Java网络爬虫-Day1

自学Java网络爬虫-Day1

网络爬虫

网络爬虫(web crawler)是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
从功能上来讲,爬虫分为采集、处理、储存。从一个或若干初始网页URL开始,不断抽取新的URL放入队列,直到满足停止条件。

学习网络爬虫的原因:

  1. 实现私人搜索引擎。
  2. 获取更多数据源。进行大数据分析或数据挖掘时,从数据统计网站或文献资料获取很难满足需求。
  3. 进行搜索引擎优化(SEO)。
  4. 利于就业。

入门程序

1. 环境准备

  • JDK1.8
  • IntelliJ IDEA
  • 配置好的Maven

2. 创建程序

1.文件->New->项目->Maven。
2.Name:webcrawler,GroupId:com.qdu,完成。
自学Java网络爬虫-Day1_第1张图片
3.导入httpclient和slf4j依赖。(使用HttpClient技术抓取网页数据)自学Java网络爬虫-Day1_第2张图片
4.main包resources目录下新建文件。
文件名为log4j.properties,以便对日志显示进行设置。

内容如下:

log4j.rootLogger=DEBUG,A1
#log4j.logger.cn.itcast=DEBUG
log4j.logger.com.qdu=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

3. 第一个程序CrawlerFirst

1.main包java目录下新建包com.qdu.crawler.test。
自学Java网络爬虫-Day1_第3张图片
2.在包下新建Class类,Name:CrawlerFirst。
自学Java网络爬虫-Day1_第4张图片
注意:上边三个http的网址都是可以运行成功的,最后一个https是http+ssl,运行失败。目前不知道如何解决。
3.执行一下程序。

  • 成功截图
    发出的是GET请求,最后一行返回200,http成功。自学Java网络爬虫-Day1_第5张图片
    得到网站内容:
    自学Java网络爬虫-Day1_第6张图片
  • 失败截图
    发出的是GET请求,最后一行返回302,https失败。自学Java网络爬虫-Day1_第7张图片

4. 第二个程序HttpGetTest(HttpClient-Get)

在包下新建Class类,Name:HttpGetTest。

自学Java网络爬虫-Day1_第8张图片
注意:关闭释放响应和浏览器。

运行结果:
在这里插入图片描述

5. 第三个程序HttpGetParamTest(HttpClient-Get带参数)

在游侠网搜索lol的相关游戏信息。
复制之前创建好的HttpGetTest改为HttpGetParamTest。

自学Java网络爬虫-Day1_第9张图片
自学Java网络爬虫-Day1_第10张图片

运行成功:
在这里插入图片描述
自学Java网络爬虫-Day1_第11张图片

6. 第四个程序HttpPostTest(HttpClient-Post)

复制之前创建好的HttpGetTest改为HttpPostTest。

自学Java网络爬虫-Day1_第12张图片

运行成功:
自学Java网络爬虫-Day1_第13张图片
发出的是POST请求,返回200。

7. 第五个程序HttpPostParamTest(HttpClient-Post带参数)

在游侠网搜索lol的相关游戏信息或在传智中搜索Java视频。
url地址中没有参数,参数在表单中提交。
复制之前创建好的HttpPostTest改为HttpPostParamTest。

自学Java网络爬虫-Day1_第14张图片
注:这里两个网站都成功提取内容,并能正确输出内容长度。

运行结果:
自学Java网络爬虫-Day1_第15张图片
倒数第二行为参数。

8. 第六个程序HttpClientPoolTest(连接池)

每次请求都创建HttpClient,解决频繁创建和销毁问题。
新建HttpClientPoolTest类。
package com.qdu.crawler.test;
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.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;
import java.io.IOException;

public class HttpClientPoolTest {
     
    public static void main(String[] args) {
     
        //创建连接池管理器
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        //设置最大连接数
        cm.setMaxTotal(100);
        //设置每个主机的最大连接数
        cm.setDefaultMaxPerRoute(10);
        //使用连接池管理器发起请求
        doGet(cm);
        doGet(cm);
    }
    private static void doGet(PoolingHttpClientConnectionManager cm) {
     
        //不是每次创建新的HttpClient,而是从连接池中获取HttpClient对象
        CloseableHttpClient httpClient = HttpClients.custom()
        								.setConnectionManager(cm).build(); 
        HttpGet httpGet = new HttpGet("http://www.itcast.cn");
        CloseableHttpResponse response = null;
        try {
     
            response = httpClient.execute(httpGet);
            if (response.getStatusLine().getStatusCode() == 200){
     
                String content = EntityUtils.toString(response.getEntity(),"utf8");
                System.out.println(content.length());
            }
        } catch (IOException e) {
     
            e.printStackTrace();
        }finally {
     
            if (response!=null){
     
                try {
     
                    response.close();
                } catch (IOException e) {
     
                    e.printStackTrace();
                }
                //不能关闭HttpClient,由连接池管理HttpClient
                //httpClient.close();
            }
        }
    }
}

9. 第七个程序HttpConfigTest(请求参数)

因为网络或目标服务器,导致请求完成时间很长,因此需要自定义相关时间。
复制之前创建好的HttpGetTest改为HttpConfigTest。
package com.qdu.crawler.test;
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 java.io.IOException;

public class HttpConfigTest {
     
    public static void main(String[] args) {
     
        //创建HttpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();

        //创建HttpGet对象,设置url访问地址
        HttpGet httpGet = new HttpGet("http://www.itcast.cn");

        //配置请求信息
        RequestConfig config = RequestConfig.custom()
        					.setConnectTimeout(1000) //创建连接的最长时间,单位毫秒
                            .setConnectionRequestTimeout(500)//设置获取连接的最长时间,单位毫秒
                            .setSocketTimeout(10*1000)  //设置数据传输的最长时间,单位毫秒
                            .build();
        //给请求设置请求信息
        httpGet.setConfig(config);
        CloseableHttpResponse response = null;
        try {
     
            //使用HttpClient发起请求,获取response
            response = httpClient.execute(httpGet);
            
            //解析响应
            if (response.getStatusLine().getStatusCode() == 200){
     
                String content = EntityUtils.toString(response.getEntity(),"utf8");
                System.out.println(content.length());
            }
        } catch (IOException e) {
     
            e.printStackTrace();
        }finally {
     
            //关闭response
            try {
     
                response.close();
            } catch (IOException e) {
     
                e.printStackTrace();
            }
            //关闭浏览器
            try {
     
                httpClient.close();
            } catch (IOException e) {
     
                e.printStackTrace();
            }
        }
    }
}

希望能早点学会提取用https协议网站的信息吧。

你可能感兴趣的:(网络爬虫,java,爬虫)