java-网络爬虫 1

Java中的网络爬虫

1. 网络爬虫的基本概念

网络爬虫(Web Crawler)是一种自动化程序,通常用于遍历网页并提取所需数据。网络爬虫广泛应用于搜索引擎、数据采集、信息监控等领域。它通过模拟浏览器的行为,访问网页、解析内容、提取数据并存储到本地或数据库中。

2. 网络爬虫的基本流程

一个简单的网络爬虫通常包括以下几个步骤:

  1. 1. 发送HTTP请求:向目标网页发送HTTP请求,获取网页内容。
  2. 2. 解析HTML内容:解析返回的HTML内容,提取所需的数据。
  3. 3. 处理数据:对提取的数据进行处理和存储。
  4. 4. 处理链接:提取网页中的链接,继续爬取其他网页。

3. 使用Java进行网络爬虫开发

Java提供了多种库和工具,可以用来开发网络爬虫。常用的包括:

  • • java.net:提供基本的网络通信功能。
  • • JSoup:一个强大的HTML解析库,用于解析、操作和清理HTML。
  • • HttpClient:Apache的HTTP客户端库,用于发送HTTP请求。

4. 使用java.net包开发简单爬虫

以下示例展示了如何使用Java内置的java.net包发送HTTP请求并获取网页内容。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class SimpleCrawler {public static void main(String[] args) {String url = "http://example.com";try {URL obj = new URL(url);HttpURLConnection connection = (HttpURLConnection) obj.openConnection();connection.setRequestMethod("GET");int responseCode = connection.getResponseCode();System.out.println("Response Code : " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String inputLine;StringBuilder response = new StringBuilder();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();// 打印响应内容System.out.println(response.toString());} catch (Exception e) {e.printStackTrace();}}
}

在上述代码中,通过HttpURLConnection发送HTTP GET请求,并读取响应内容。

5. 使用JSoup解析HTML内容

JSoup是一个用于解析、操作和清理HTML的Java库。它提供了强大的选择器语法,类似于jQuery,用于提取HTML文档中的数据。

5.1 解析网页内容

以下示例展示了如何使用JSoup解析网页内容并提取特定的元素。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;public class JsoupExample {public static void main(String[] args) {String url = "http://example.com";try {Document doc = Jsoup.connect(url).get();// 获取网页标题String title = doc.title();System.out.println("Title: " + title);// 获取所有的链接Elements links = doc.select("a[href]");for (Element link : links) {System.out.println("Link: " + link.attr("href"));System.out.println("Text: " + link.text());}} catch (Exception e) {e.printStackTrace();}}
}

在上述代码中,使用Jsoup.connect(url).get()获取网页内容,并使用选择器提取所有的链接。

5.2 处理表格数据

以下示例展示了如何使用JSoup提取网页中的表格数据。

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;public class TableParser {public static void main(String[] args) {String url = "http://example.com/table";try {Document doc = Jsoup.connect(url).get();Element table = doc.select("table").first();Elements rows = table.select("tr");for (Element row : rows) {Elements cells = row.select("td");for (Element cell : cells) {System.out.print(cell.text() + "\t");}System.out.println();}} catch (Exception e) {e.printStackTrace();}}
}

在上述代码中,使用选择器提取网页中的表格数据,并逐行打印。

6. 使用HttpClient发送HTTP请求

Apache HttpClient是一个功能强大的HTTP客户端库,用于发送HTTP请求和处理HTTP响应。它支持高级功能,如代理、认证、重定向等。

6.1 发送GET请求

以下示例展示了如何使用HttpClient发送HTTP GET请求并获取响应内容。

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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;public class HttpClientExample {public static void main(String[] args) {String url = "http://example.com";try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpGet request = new HttpGet(url);try (CloseableHttpResponse response = httpClient.execute(request)) {HttpEntity entity = response.getEntity();if (entity != null) {String result = EntityUtils.toString(entity);System.out.println(result);}}} catch (Exception e) {e.printStackTrace();}}
}

在上述代码中,使用HttpGet对象发送HTTP GET请求,并使用EntityUtils.toString方法读取响应内容。

6.2 发送POST请求

以下示例展示了如何使用HttpClient发送HTTP POST请求。

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class HttpClientPostExample {public static void main(String[] args) {String url = "http://example.com/api";try (CloseableHttpClient httpClient = HttpClients.createDefault()) {HttpPost post = new HttpPost(url);String json = "{\"key1\":\"value1\",\"key2\":\"value2\"}";StringEntity entity = new StringEntity(json);post.setEntity(entity);post.setHeader("Accept", "application/json");post.setHeader("Content-type", "application/json");try (CloseableHttpResponse response = httpClient.execute(post)) {HttpEntity responseEntity = response.getEntity();if (responseEntity != null) {String result = EntityUtils.toString(responseEntity);System.out.println(result);}}} catch (Exception e) {e.printStackTrace();}}
}

在上述代码中,通过HttpPost对象发送HTTP POST请求,并设置请求头和请求体。

7. 处理Cookie和Session

在一些网站上,爬虫需要处理Cookie和Session来模拟用户的登录状态和会话。HttpClient提供了相关的功能来处理Cookie和Session。

import org.apache.http.client.CookieStore;
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.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.cookie.BasicClientCookie;public class CookieExample {public static void main(String[] args) {String url = "http://example.com";CookieStore cookieStore = new BasicCookieStore();BasicClientCookie cookie = new BasicClientCookie("sessionid", "123456");cookie.setDomain("example.com");cookie.setPath("/");cookieStore.addCookie(cookie);RequestConfig globalConfig = RequestConfig.custom().setCookieSpec("standard").build();try (CloseableHttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).setDefaultRequestConfig(globalConfig).build()) {HttpGet request = new HttpGet(url);try (CloseableHttpResponse response = httpClient.execute(request)) {System.out.println("Response Code : " + response.getStatusLine().getStatusCode());}} catch (Exception e) {e.printStackTrace();}}
}

在上述代码中,通过CookieStore管理Cookie,并在请求中携带这些Cookie。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何识别商业电子邮件诈骗

复制此链接到微信打开阅读全部已发布文章 不要关闭它标签!我知道很少有词组比商业、电子邮件和妥协更无趣。 但这不是一篇无聊的文章:这是一篇关于电子邮件骗子的文章,根据联邦调查局的说法,他们每年通过诈骗人们赚取 260 亿美元…

AU音频重新混合音频,在 Adobe Audition 中无缝延长背景音乐,无缝缩短BGM

导入音频,选中音频,并且点 New Multitrack Session 的图标 设计文件名和存储路径,然后点 OK 点 Essential Sound 面板点 Music (如果没有这个面板 点菜单栏 Windows > Essential Sound 调出来) 点 Duration 展…

利用定时器1产生全双工软件串口

代码; /*《AVR专题精选》随书例程3.通信接口使用技巧项目:使用AVR定时器1和外中断实现全双工软件串口文件:softuart.c说明:软件串口驱动文件作者:邵子扬时间:2012年12月16日*/ #include "softuart.h"// 内部…

Pytorch调试出错记录

一、搭建环境: LINUX-64 1、 nvidia-smi :NVIDIA-SMI 470.63.01 Driver Version: 470.63.01 CUDA Version: 11.4 2、安装conda:下载最新版上传安装 3、安装pytorch(安装成功,但可能报错) : conda in…

软件功能测试和性能测试包括哪些测试内容?又有什么联系和区别?

软件功能测试和性能测试是保证软件质量和稳定性的重要手,无论是验证软件的功能正确性,还是评估软件在负载下的性能表现,这些测试都是必不可少的。 一、软件功能测试   软件功能测试是指对软件的各项功能进行验证和确认,确保软件…

【递归、搜索与回溯】floodfill算法一

floodfill算法一 1.floodfill算法简介2.图像渲染3.岛屿数量4.岛屿的最大面积 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.floodfill算法…

【ATU Book - i.MX8系列 - OS】NXP i.MX Linux Desktop (Ubuntu) BSP 开发环境架设

一、概述 谈论嵌入式系统的开发环境,不得不提起近年来相当实用的 Yocto 建构工具。此工具拥有极为灵活的平台扩展性,广泛的软体套件与社群支持、多平台支援整合性,能够满足开发者特定需求和多种热门的嵌入式系统架设,已成为当今顶…

实战篇:GY-906红外测温模块 + 万年历(定时器计数中断版本) -STM32篇

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布: https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

如何使用LangChain自定义agent的制作(2) - 让大模型帮我们生成sql

文章目录 前言一、 安装依赖包二、 设置数据库连接三、 扫描数据库结构四、 生成 SQL 查询五、 执行 SQL 查询六、 运行示例七、 封装成类总结 前言 前一篇文章中,我们一起写了一个agent,为了简化代码是直接传递sql的,这一篇文章我们将通过大…

第10章 启动过程组 (制定项目章程)

第10章 启动过程组 9.1制定项目章程,在第三版教材第356~360页; 文字图片音频方式 视频12 第一个知识点:主要输出 1、项目章程(重要知识点) 项目目的 为了稳定与发展公司的客户群(抽象,非具体) 可测量的项目…

仓颉语言与ArkTS互操作

在 OpenHarmony 系统上,ArkTS 具备完整广泛的生态,为复用 ArkTS 生态,仓颉支持与 ArkTS 高效跨语言互通。 仓颉-ArkTS 互操作基于仓颉 CFFI 能力,通过调用 ArkTS 运行时接口,为用户提供库级别的 ArkTS 互操作能力。 …

深入理解Netty的Pipeline机制:原理与实践详解

深入理解Netty的Pipeline机制:原理与实践详解 Netty是一个基于Java的高性能异步事件驱动的网络应用框架,广泛应用于高并发网络编程。(学习netty请参考:深入浅出Netty:高性能网络应用框架的原理与实践)Nett…

探索Agent AI智能体的未来

随着人工智能(AI)技术的飞速发展,Agent AI智能体正成为一种改变世界的新力量。这些智能体不仅在当前的技术领域中发挥着重要作用,而且在未来将以更深远的影响改变我们的生活、工作和社会结构。本文将探讨Agent AI智能体的现状、潜…

微信小程序-伪类选择器

一.伪类选择器 结构伪类常见书写方式: 第一类:找第几个孩子 1. :first-child 找第一个孩子2. :last-child 找最后一个孩子3. :nth-child(),正着找数字:写数字几就是找第几个孩子,2n或者even:找偶数2n1或者o…

“论微服务架构及其应用”写作框架,软考高级,系统架构设计师

论文真题 论微服务架构及其应用近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic)软件架构面临着越来越多的挑战,已逐渐…

一个关于空格的Sql Server面试题

引子 先上题目: 回答下面sql 的输出结果 declare s1 varchar(10) declare s2 varchar(10) set s1a b set s2a b if s1s2 select true 答案是 true 那么上面的 s1 和 s2 是否相等的呢? 我们再看看下面的sql declare s1 varchar(10) declare s2 …

【建议收藏】Android中高级大厂面试源码秘籍,为你备战2021金三银四,直通大厂

首先来说下为什么要读源码,有学习源码的必要吗? 为什么要阅读源码? 关于为什么阅读和学习源码,我个人认为可能有以下几点: (一)吊打面试官,应对面试 为了找到更好的工作&#xff…

异地局域网纯软件组网如何设置?

在现代社会中,随着企业的不断扩张和分布,异地办公成为一种常见的工作模式。随之而来的是,如何实现异地局域网的组网设置成为了一个挑战。在这种情况下,采用纯软件组网方案是一种有效的解决方案。本文将介绍异地局域网纯软件组网设…

双非本,3年时间从外包到阿里P6(Android岗),看我是怎么逆袭成功的?

而在小公司,因为我也在小公司呆过,所以我有最直接的感受。整个部门技术人员没几个,我又大学刚毕业,带我的人,问啥啥不会,只有一个大佬,跳槽来的,是我们技术总监,有问题谁…