当前位置: 首页 > news >正文

Java爬虫(HttpURLConnection)详解

文章目录

  • Java爬虫(HttpURLConnection)详解
    • 一、引言
    • 二、准备工作
      • 1、环境配置
      • 2、理解`HttpURLConnection`
    • 三、发送GET请求
      • 1、创建URL对象
      • 2、打开连接
      • 3、设置请求方法
      • 4、连接并读取响应
      • 5、处理返回的数据
    • 四、发送POST请求
      • 1、设置输出
      • 2、发送请求体
      • 3、读取响应
    • 五、设置请求头
    • 六、处理超时
    • 七、使用代理
    • 八、HTTPS请求
    • 九、总结

Java爬虫(HttpURLConnection)详解

一、引言

在Java编程中,网络爬虫是一种自动获取网页内容的程序。HttpURLConnection作为Java标准库中的一个类,提供了一种简单的方式来发送HTTP请求并接收响应。本文将详细介绍如何使用HttpURLConnection来实现基本的网络爬虫功能,包括发送GET和POST请求、设置请求头、处理超时以及使用代理和HTTPS,同时也会涉及到如何处理返回的数据。

二、准备工作

1、环境配置

在开始之前,确保你的Java开发环境已经搭建好。对于HttpURLConnection不需要额外的依赖,因为它是Java标准库的一部分。如果你使用的是IDE(如IntelliJ IDEA或Eclipse),确保你的项目已经正确配置。

2、理解HttpURLConnection

HttpURLConnection继承自URLConnection,专门用于处理HTTP协议的连接。它提供了设置请求方法、管理请求头和读取响应等功能。

三、发送GET请求

1、创建URL对象

首先,我们需要创建一个URL对象,它代表了我们想要请求的网页地址。

URL url = new URL("http://www.example.com");

2、打开连接

通过URL对象的openConnection方法,我们可以打开一个到指定URL的连接。

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

3、设置请求方法

对于GET请求,我们通常不需要设置请求体,但需要设置DoInputtrue以允许读取响应。

connection.setDoInput(true);
connection.setRequestMethod("GET");

4、连接并读取响应

连接到服务器并读取响应体。

connection.connect();
if (HttpURLConnection.HTTP_OK == connection.getResponseCode()) {BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));StringBuilder response = new StringBuilder();String readLine;while (null != (readLine = bufferedReader.readLine())) {response.append(readLine);}bufferedReader.close();// 处理返回的数据handleResponse(response.toString());
}

5、处理返回的数据

private static void handleResponse(String response) {// 这里可以根据需要对返回的数据进行处理// 例如,解析HTML、JSON等System.out.println("Response from server: " + response);
}

四、发送POST请求

1、设置输出

对于POST请求,我们需要设置DoOutputtrue以允许发送请求体。

connection.setDoOutput(true);

2、发送请求体

将请求参数编码为字节流并发送。

String params = "param1=value1&param2=value2";
byte[] bytes = params.getBytes(StandardCharsets.UTF_8);
connection.getOutputStream().write(bytes);

3、读取响应

与GET请求类似,我们读取服务器的响应。

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
StringBuilder response = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {response.append(line);
}
System.out.println(response.toString());
bufferedReader.close();
// 处理返回的数据
handleResponse(response.toString());

五、设置请求头

在发送请求之前,我们可以通过setRequestProperty方法设置请求头。

connection.setRequestProperty("User-Agent", "Mozilla/5.0");

六、处理超时

HttpURLConnection允许我们设置连接超时和读取超时。

connection.setConnectTimeout(10000); // 10秒
connection.setReadTimeout(10000);   // 10秒

七、使用代理

如果需要通过代理服务器发送请求,可以创建一个Proxy对象并将其传递给openConnection方法。

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("proxy.example.com", 8080));
HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);

八、HTTPS请求

对于HTTPS请求,我们可能需要处理SSL证书问题。以下是一个示例,展示如何信任所有证书。

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() { return null; }public void checkClientTrusted(X509Certificate[] certs, String authType) { }public void checkServerTrusted(X509Certificate[] certs, String authType) { }
}};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

九、总结

通过本文,我们学习了如何使用HttpURLConnection来实现基本的网络爬虫功能。这包括了发送GET和POST请求、设置请求头、处理超时以及使用代理和HTTPS,同时也会涉及到如何处理返回的数据。这些技能对于任何需要与Web服务交互的Java开发者来说都是基础且重要的。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • Java爬虫 - URLConnection与HttpURLConnection

相关文章:

Java爬虫(HttpURLConnection)详解

文章目录 Java爬虫(HttpURLConnection)详解一、引言二、准备工作1、环境配置2、理解HttpURLConnection 三、发送GET请求1、创建URL对象2、打开连接3、设置请求方法4、连接并读取响应5、处理返回的数据 四、发送POST请求1、设置输出2、发送请求体3、读取响…...

基于STM32的智能停车管理系统设计

引言 随着城市汽车保有量的增加,停车难问题日益严重,传统停车管理方式效率低下,无法满足现代化需求。为了解决这一问题,本项目基于STM32微控制器设计了一种智能停车管理系统。系统能够通过传感器实时监测停车位的使用情况&#x…...

【循环神经网络】

循环神经网络(Recurrent Neural Network, RNN)是一类用于处理序列数据的神经网络,擅长处理具有时间依赖或顺序结构的数据。RNN通过循环连接的结构,使得当前时刻的输出可以受之前时刻信息的影响,因此被广泛应用于自然语…...

优选算法 - 4 ( 链表 哈希表 字符串 9000 字详解 )

一:链表 1.1 链表常用技巧和操作总结 1.2 两数相加 题目链接:两数相加 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* …...

CTF-RE 从0到N: windows反调试-获取Process Environment Block(PEB)信息来检测调试

在Windows操作系统中,Process Environment Block (PEB,进程环境块) 是一个包含特定进程信息的数据结构。它可以被用于反调试中 如何获取PEB指针? 在Windows操作系统中,获取PEB指针的常见方法主要有以下几种。: 1. 使…...

STM32开发基础阶段复习

1.使用寄存器方式点亮LED灯的三个步骤是什么? 首先使能RCC_APB2ENR(外设时钟使能寄存器)对应的GPIO端口时钟,即给LED这个外设使能时钟。 配置对应GPIO端口,配置为通用推挽输出,输出速度可以选择最大。 将GPIO端口输…...

搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试

搜维尔科技:SenseGlove触觉反馈手套开箱场景测试 SenseGlove触觉反馈手套开箱场景测试...

在k8s上部署Crunchy Postgres for Kubernetes

目录 一、前言二、安装Crunchy Postgres for Kubernetes三、部署一个简单的postgres集群四、增加pgbouncer五、数据备份六、备份恢复七、postgres配置参数七、数据导入 一、前言 Crunchy Postgres可以帮助我们在k8s上快速部署一个高可用、具有自动备份和恢复功能的postgres集群…...

大模型(LLMs)进阶篇

大模型(LLMs)进阶篇 一、什么是生成式大模型? 生成式大模型(一般简称大模型LLMs)是指能用于创作新内容,例如文本、图片、音频以及视频的一类深度学习模型。相比普通深度学习模型,主要有两点不…...

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统? 近几年的新笔记本默认开启了raid on模式或vmd选项,安装过程中会遇到问题,新笔记本电脑重装自带的系统建议采用u盘方式安装,默认新笔记本有bitlocker加密机制,如果采用一键重装系统或硬盘方式安装…...

小程序19-微信小程序的样式和组件介绍

在小程序中不能使用 HTML 标签,也就没有 DOM 和 BOM,CSS 也仅支持部分选择器 小程序提供了 WXML 进行页面结构的编写,WXSS 进行页面的样式编写 WXML 提供了 view、text、image、navigator等标签构建页面结构,小程序中标签称为组件…...

Chrome 浏览器开启打印模式

打开开发者工具ctrl shift p输入print 找到 Emulate CSS print media type...

Git回到某个分支的某次提交

1.切换到需要操作的分支&#xff08;<branch-name>是分支名称&#xff09;。 命令如下&#xff1a; git checkout <branch-name> 2.获取代码的提交记录 。命令如下&#xff1a; git log 按q退出当前命令对话。 获取到某次提交或者合并的hash值&#xff08;下文…...

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值&#xff0c;常用来表示对象属性的唯一标识 复杂数据类型 object&#xff0c;数组&#xff0c;函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…...

对象的初步认识

#对象可组织数据&#xff08;如统计数据的表格&#xff09; 下以表格为例 1.设计一个表格:(None为初始值设定&#xff0c;表示无) class a; ##1None ##2None 2.创建一个表格 变量a 3.对对象的属性进行赋值 变量.##1"##" 变量.##2"##" 4.查询对象中…...

layui 输入框带清空图标、分词搜索、关键词高亮

https://andi.cn/page/621858.html...

Vue 3 + TypeScript: 类型安全的前端开发实践

引言 在现代前端开发中&#xff0c;TypeScript 已经成为提升代码质量和开发效率的重要工具。将 Vue 3 与 TypeScript 结合使用&#xff0c;能够为我们的项目带来更好的类型安全性和开发体验。 1. 项目配置 1.1 创建项目 使用 Vue CLI 创建支持 TypeScript 的 Vue 3 项目&am…...

Python爬虫知识体系-----requests-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用1. 安装2. 基本使用3. response常用属性 二、get请求三、post请求四、代理 一、安装和基本使用 1.…...

Swift的可选绑定(Optional binding)

在Swift中&#xff0c;有一种变量称为可选变量&#xff08;Optional&#xff09;&#xff0c;具体说明见Swift初步入门。这种变量的值可以存在也可以为空&#xff08;nil&#xff09;。在Swift中&#xff0c;可以通过将if语句和赋值语句结合&#xff0c;有条件地展开&#xff0…...

硬石电机学习2024116

F4 概况 共模抑制线圈作用是滤波 LD3.3是将5v转为芯片用的3.3V CH340用于板子和电脑通讯 光耦隔离保护主控 16M的外部flash 1M的芯片内部的flash 10kHZ高速的光耦隔离&#xff0c;1M的低俗光耦隔离 F4 stm32概况 stm8和51都是一次可以运算处理8位的 32表示一次处理32位…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...