自学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,完成。
文件名
3.导入httpclient和slf4j依赖。(使用HttpClient技术抓取网页数据)在这里插入图片描述
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。
在这里插入图片描述
2.在包下新建Class类,Name:CrawlerFirst。
在这里插入图片描述
注意:上边三个http的网址都是可以运行成功的,最后一个https是http+ssl,运行失败。目前不知道如何解决。
3.执行一下程序。

  • 成功截图
    发出的是GET请求,最后一行返回200,http成功。在这里插入图片描述
    得到网站内容:
    在这里插入图片描述
  • 失败截图
    发出的是GET请求,最后一行返回302,https失败。在这里插入图片描述
4. 第二个程序HttpGetTest(HttpClient-Get)
在包下新建Class类,Name:HttpGetTest。

在这里插入图片描述
注意:关闭释放响应和浏览器。

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

5. 第三个程序HttpGetParamTest(HttpClient-Get带参数)
在游侠网搜索lol的相关游戏信息。
复制之前创建好的HttpGetTest改为HttpGetParamTest。

在这里插入图片描述
在这里插入图片描述

运行成功:
在这里插入图片描述
在这里插入图片描述

6. 第四个程序HttpPostTest(HttpClient-Post)
复制之前创建好的HttpGetTest改为HttpPostTest。

在这里插入图片描述

运行成功:
在这里插入图片描述
发出的是POST请求,返回200。

7. 第五个程序HttpPostParamTest(HttpClient-Post带参数)
在游侠网搜索lol的相关游戏信息或在传智中搜索Java视频。
url地址中没有参数,参数在表单中提交。
复制之前创建好的HttpPostTest改为HttpPostParamTest。

在这里插入图片描述
注:这里两个网站都成功提取内容,并能正确输出内容长度。

运行结果:
在这里插入图片描述
倒数第二行为参数。

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协议网站的信息吧。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值