在这个数据为王的时代,爬虫应用地越来越广泛,对于一个萌新程序员来说如果你要做爬虫,那么Python是你的不二之选。但是对于那些老腊肉的Java程序员(亦或者你是程序媛)想使用Java做爬虫也不是不行,只是没有Python那么方便。身为一块Java老腊肉的我在此记录一下自己在使用Java做网络爬虫使用的工具类。

在pom.xml文件中引入commons-lang3 依赖:

     <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.6</version></dependency>

SpiderHttpUtils 工具类完整代码如下:

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Map;import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;import org.apache.commons.lang3.StringUtils;public class SpiderHttpUtils {public static String sendGet(boolean isHttps, String requestUrl, Map<String, String> params,Map<String, String> headers, String charSet) {if (StringUtils.isBlank(requestUrl)) {return "";}if (StringUtils.isBlank(charSet)) {charSet = "UTF-8";}URL url = null;URLConnection conn = null;BufferedReader br = null;try {// 创建连接url = new URL(requestUrl + "?" + requestParamsBuild(params));if (isHttps) {conn = getHttpsUrlConnection(url);} else {conn = (HttpURLConnection) url.openConnection();}// 设置请求头通用属性// 指定客户端能够接收的内容类型conn.setRequestProperty("Accept", "*/*");// 设置连接的状态为长连接conn.setRequestProperty("Connection", "keep-alive");// 设置发送请求的客户机系统信息conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36");// 设置请求头自定义属性if (null != headers && headers.size() > 0) {for (Map.Entry<String, String> entry : headers.entrySet()) {conn.setRequestProperty(entry.getKey(), entry.getValue());}}// 设置其他属性// conn.setUseCaches(false);//不使用缓存// conn.setReadTimeout(10000);// 设置读取超时时间// conn.setConnectTimeout(10000);// 设置连接超时时间// 建立实际连接conn.connect();// 读取请求结果br = new BufferedReader(new InputStreamReader(conn.getInputStream(), charSet));String line = null;StringBuilder sb = new StringBuilder();while ((line = br.readLine()) != null) {sb.append(line);}return sb.toString();} catch (Exception exception) {return "";} finally {try {if (br != null) {br.close();}} catch (Exception e) {e.printStackTrace();}}}public static String requestParamsBuild(Map<String, String> map) {String result = "";if (null != map && map.size() > 0) {StringBuffer sb = new StringBuffer();for (Map.Entry<String, String> entry : map.entrySet()) {try {String value = URLEncoder.encode(entry.getValue(), "UTF-8");sb.append(entry.getKey() + "=" + value + "&");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}result = sb.substring(0, sb.length() - 1);}return result;}private static HttpsURLConnection getHttpsUrlConnection(URL url) throws Exception {HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new X509TrustManager() {public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {// 检查客户端证书}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {// 检查服务器端证书}public X509Certificate[] getAcceptedIssuers() {// 返回受信任的X509证书数组return null;}} };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();httpsConn.setSSLSocketFactory(ssf);return httpsConn;}public static byte[] getFileAsByte(boolean isHttps, String requestUrl) {if (StringUtils.isBlank(requestUrl)) {return new byte[0];}URL url = null;URLConnection conn = null;BufferedInputStream bi = null;try {// 创建连接url = new URL(requestUrl);if (isHttps) {conn = getHttpsUrlConnection(url);} else {conn = (HttpURLConnection) url.openConnection();}// 设置请求头通用属性// 指定客户端能够接收的内容类型conn.setRequestProperty("accept", "*/*");// 设置连接的状态为长连接conn.setRequestProperty("Connection", "keep-alive");// 设置发送请求的客户机系统信息conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 设置其他属性conn.setConnectTimeout(3000);// 设置连接超时时间conn.setDoOutput(true);conn.setDoInput(true);// 建立实际连接conn.connect();// 读取请求结果bi = new BufferedInputStream(conn.getInputStream());ByteArrayOutputStream outStream = new ByteArrayOutputStream();byte[] buffer = new byte[2048];int len = 0;while ((len = bi.read(buffer)) != -1) {outStream.write(buffer, 0, len);}bi.close();byte[] data = outStream.toByteArray();return data;} catch (Exception exception) {return new byte[0];} finally {try {if (bi != null) {bi.close();}} catch (Exception e) {e.printStackTrace();}}}}

Java网页爬虫--基于URLConnection的网页爬虫工具类相关推荐

  1. java抽组件_GitHub - ysc/HtmlExtractor: HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件。...

    HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取. HtmlExtractor是为 ...

  2. 基于AFNetworking的封装的工具类

    基于AFNetworking的封装的工具类MXERequestService // // MXERequestService.h // testAFNetWorking // // Created b ...

  3. java中bitconverter_【Java】BitConverter(数字转字节数组工具类)

    import java.nio.ByteOrder; import java.nio.charset.Charset; /** * 数字转字节数组工具类 */ public class BitConv ...

  4. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  5. java sm3国密算法加密、验证工具类

    java sm3国密算法加密.验证工具类 说明 maven依赖 完整代码 测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出. 工具类也可以直接使用封装 ...

  6. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  7. Java 切割身份证地址,省市区 详细地址工具类

    工具类①: AddressAnalysisUtil.java import org.apache.commons.lang3.StringUtils; import java.util.Arrays; ...

  8. java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)

    java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...

  9. php动态网页学生作品,基于php动态网页技术的办公网站的设计

    建立一个基于php动态网页技术的网络办公平台,主要用于信息的分享与办公的直接化方便化.用户可以用此网站及时的不限地点的对自己工作任务进行了解,工作资料的下载,工作问题进行讨论. 1.课题任务 (1) ...

最新文章

  1. ios4 向 ios5 迁移短信的方式
  2. 用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
  3. 响应式Web设计(一):响应式Web设计的背景
  4. 常见网络命令介绍及使用
  5. 机器学习的练功心法(一)——机器学习概述
  6. aspnet还有人用吗_微信公众号软件安装管家会员真的那么好吗
  7. easyui-datagrid对行写样式
  8. python中pygame学习——碰碰球(简单版)
  9. 哈夫曼编码的理解(Huffman Coding)
  10. 网络诈骗有哪些防范措施
  11. 移动端APP测试总结
  12. 如何让用html制作404页面,网站404页面怎么做?
  13. 《机器学习实战》萌新读书笔记 ② — — 第三章 决策树 内容提要、知识拓展和详细注释代码
  14. 能力提升的僵化、优化、固化过程
  15. 服务拆分理论和原理及方法
  16. 树莓派4b: 初级使用(Ubuntu21.10,Windows11写入SSD,远程连接,软路由搭建,webmin安装,自建Dockerhub,远程管理, 百度云盘,阿里云盘同步等)
  17. 微信聊天气泡设置方法!聊天气泡随意切换!瞬间个性十足!
  18. 清华大学计算机与科学分数线,清华大学各地录取情况及调档线一览
  19. 【力扣-动态规划入门】【第 21 天】377. 组合总和 Ⅳ
  20. 求四点的交点(两线段的交点)

热门文章

  1. 使用selenium模拟登录新浪微博
  2. TP-LINK如何查看有几台设备连接
  3. ​ ​iPhone中的heic格式怎么查看 heic文件怎么打开
  4. UniApp仿支付宝账单筛选
  5. 电路分析第二章 戴维南、诺顿以及置换定理
  6. 奉劝那些想做客户端开发学弟学妹们!呕心沥血,真情实感,字字诛心
  7. 设置输入框el-input图标 / el-input表单只显示number
  8. 根据XML自动生成XSD
  9. 「大数据」告诉你,互联网行业哪个职位比较有“钱途”?
  10. 无法定位程序输入点于动态链接库上的原因