自学Java网络爬虫-Day1
网络爬虫
网络爬虫(web crawler)是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
从功能上来讲,爬虫分为采集、处理、储存。从一个或若干初始网页URL开始,不断抽取新的URL放入队列,直到满足停止条件。
学习网络爬虫的原因:
- 实现私人搜索引擎。
- 获取更多数据源。进行大数据分析或数据挖掘时,从数据统计网站或文献资料获取很难满足需求。
- 进行搜索引擎优化(SEO)。
- 利于就业。
入门程序
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协议网站的信息吧。