别人家的程序员是如何使用 Java 进行 Web 抓取的?

教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇 文章目录1:网络爬虫介绍2:HttpClients类介绍2.1 HttpGet参数问题2.2 HttpPost参数问题2.3 连接池技术问题3:Jsoup介绍4:动手实践如何抓取网页上数据并保存到自己数据库中 有一句话说的好,只要精神不滑坡,办法总比困难多——阿俊(这句话可以形容我这三天学习知识的态度) 就在前天,我的一个项目进入到了省赛,想下定决心把自己的一部分未完成的功能完善起来(想爬取网页上的各种数据到自己的所对应的页面上显示),这个问题在我脑子里回旋许久,于是打开电脑就在网上查阅各种资料,而我第一次 阅读详情

 

 

Web抓取非常有用,它可以收集信息供多种用途使用,如数据分析、统计、提供第三方信息,还可以给深神经网络和深度学习提供数据。

 

Web抓取是什么?

 

有一种非常广泛的误解,人们似乎把Web抓取和Web爬虫当成了同一种东西。所以我们先明确这一点。

两者有个非常显著的区别:

Web爬虫,指搜索或“爬”网页以获得任意信息的过程。通常是搜索引擎如Google、Yahoo或Bing的功能,以便给我们显示搜索结果。

Web抓取,指从特定的网站上利用特别定制的自动化软件手机信息的过程。

 

注意!

 

尽管Web抓取本身是从网站获取信息的合法方式,但如果使用不当,可能会变成非法。

有几种情况需要特别注意:

  • Web抓取可以被认为是拒绝服务攻击:发送太多请求来获取数据会给服务器带来太多压力,从而限制了正常用户访问网站的能力。
  • 无视版权法和服务条款:因为许多人、许多组织和公司都开发Web抓取软件来收集信息,给许多网站如Amazon、eBay、LinkedIn、Instagram、Facebook等带来了不小的麻烦。因此,绝大多数网站都禁止使用抓取软件获取他们的数据,你必须获得书面许可才能收集数据。
  • Web抓取可被恶意使用:抓取软件的行为很像机器人,一些框架甚至提供能够自动填写并提交表单的工具。因此可以被用作自动垃圾发送工具,甚至能攻击网站。这也是CAPTCHA存在的原因之一。

如果你想开发一个强大的抓取软件,请务必考虑以上几点,遵守法律和法规。

 

Web抓取框架

 

就像许多现代科技一样,从网站提取信息这一功能也有多个框架可以选择。最流行的有JSoup、HTMLUnit和Selenium WebDriver。我们这篇文章讨论JSoup。

 

JSoup

JSoup是个开源项目,提供强大的数据提取API。可以用它来解析给定URL、文件或字符串中的HTML。它还能操纵HTML元素和属性。

使用JSoup解析字符串

解析字符串是JSoup的最简单的使用方式。

 
public class JSoupExample { public static void main(String[] args) { String html = "<html><head><title>Website title</title></head><body><p>Sample paragraph number 1 </p><p>Sample paragraph number 2</p></body></html>"; Document doc = Jsoup.parse(html); System.out.println(doc.title()); Elements paragraphs = doc.getElementsByTag("p"); for (Element paragraph : paragraphs) { System.out.println(paragraph.text()); } } 

这段代码非常直观。调用parse()方法可以解析输入的HTML,将其变成Document对象。调用该对象的方法就能操纵并提取数据。

在上面的例子中,我们首先输出页面的标题。然后,我们获取所有带有标签“p”的元素。然后我们依次输出每个段落的文本。

运行这段代码,我们可以得到以下输出:

 
Website title Sample paragraph number 1 Sample paragraph number 2 

使用JSoup解析URL

解析URL的方法跟解析字符串有点不一样,但基本原理是相同的:

 
public class JSoupExample { public static void main(String[] args) throws IOException { Document doc = Jsoup.connect("https://www.wikipedia.org").get(); Elements titles = doc.getElementsByClass("other-project"); for (Element title : titles) { System.out.println(title.text()); } } } 

要从URL抓取数据,需要调用connect()方法,提供URL作为参数。然后使用get()从连接中获取HTML。这个例子的输出为:

 
Commons Freely usable photos & more Wikivoyage Free travel guide Wiktionary Free dictionary Wikibooks Free textbooks Wikinews Free news source Wikidata Free knowledge base Wikiversity Free course materials Wikiquote Free quote compendium MediaWiki Free & open wiki application Wikisource Free library Wikispecies Free species directory Meta-Wiki Community coordination & documentation 

可以看到,这个程序抓取了所有class为other-project的元素。

 

 

 

这种方法是最常用的,因此我们看一些通过URL进行抓取的其他例子。

抓取指定URL的所有链接

 
public void allLinksInUrl() throws IOException { Document doc = Jsoup.connect("https://www.wikipedia.org").get(); Elements links = doc.select("a[href]"); for (Element link : links) { System.out.println("\nlink : " + link.attr("href")); System.out.println("text : " + link.text()); } } 

运行结果是一个很长的列表:

 
Link : //en.wikipedia.org/ Text : English 5 678 000+ articles Link : //ja.wikipedia.org/ Text : 日本語 1 112 000+ 記事 Link : //es.wikipedia.org/ Text : Español 1 430 000+ artículos Link : //de.wikipedia.org/ Text : Deutsch 2 197 000+ Artikel Link : //ru.wikipedia.org/ Text : Русский 1 482 000+ статей Link : //it.wikipedia.org/ Text : Italiano 1 447 000+ voci Link : //fr.wikipedia.org/ Text : Français 2 000 000+ articles Link : //zh.wikipedia.org/ Text : 中文 1 013 000+ 條目 <!--A bunch of other languages --> Text : Wiktionary Free dictionary Link : //www.wikibooks.org/ Text : Wikibooks Free textbooks Link : //www.wikinews.org/ Text : Wikinews Free news source Link : //www.wikidata.org/ Text : Wikidata Free knowledge base Link : //www.wikiversity.org/ Text : Wikiversity Free course materials Link : //www.wikiquote.org/ Text : Wikiquote Free quote compendium Link : //www.mediawiki.org/ Text : MediaWiki Free & open wiki application Link : //www.wikisource.org/ Text : Wikisource Free library Link : //species.wikimedia.org/ Text : Wikispecies Free species directory Link : //meta.wikimedia.org/ Text : Meta-Wiki Community coordination & documentation Link : https://creativecommons.org/licenses/by-sa/3.0/ Text : Creative Commons Attribution-ShareAlike License Link : //meta.wikimedia.org/wiki/Terms_of_Use Text : Terms of Use Link : //meta.wikimedia.org/wiki/Privacy_policy Text : Privacy Policy 

与此相似,你还可以得到图像的数量、元信息、表单参数等一切你能想到的东西,因此经常被用于获取统计数据。

使用JSoup解析文件

 
public void parseFile() throws URISyntaxException, IOException { URL path = ClassLoader.getSystemResource("page.html"); File inputFile = new File(path.toURI()); Document document = Jsoup.parse(inputFile, "UTF-8"); System.out.println(document.title()); //parse document in any way } 

如果要解析文件,就不需要给网站发送请求,因此不用担心运行程序会给服务器增添太多负担。尽管这种方法有许多限制,并且数据是静态的,因而不适合许多任务,但它提供了分析数据的更合法、更无害的方式。

得到的文档可以用前面说过的任何方式解析。

设置属性值

除了读取字符串、URL和文件并获取数据之外,我们还能修改数据和输入表单。

例如,在访问亚马逊时,点击左上角的网站标志,能返回到网站的首页。

如果想改变这个行为,可以这样做:

 
public void setAttributes() throws IOException { Document doc = Jsoup.connect("https://www.amazon.com").get(); Element element = doc.getElementById("nav-logo"); System.out.println("Element: " + element.outerHtml()); element.children().attr("href", "notamazon.org"); System.out.println("Element with set attribute: " + element.outerHtml()); } 

获取网站标志的id后,我们可以查看其HTML。还可以访问它的子元素,并改变其属性。

 
Element: <div id="nav-logo"> <a href="/ref=nav_logo/135-9898877-2038645" class="nav-logo-link" tabindex="6"> <span class="nav-logo-base nav-sprite">Amazon</span> <span class="nav-logo-ext nav-sprite"></span> <span class="nav-logo-locale nav-sprite"></span> </a> <a href="/gp/prime/ref=nav_logo_prime_join/135-9898877-2038645" aria-label="" tabindex="7" class="nav-logo-tagline nav-sprite nav-prime-try"> Try Prime </a> </div> Element with set attribute: <div id="nav-logo"> <a href="notamazon.org" class="nav-logo-link" tabindex="6"> <span class="nav-logo-base nav-sprite">Amazon</span> <span class="nav-logo-ext nav-sprite"></span> <span class="nav-logo-locale nav-sprite"></span> </a> <a href="notamazon.org" aria-label="" tabindex="7" class="nav-logo-tagline nav-sprite nav-prime-try"> Try Prime </a> </div> 

默认情况下,两个<a>子元素都指向了各自的链接。将属性改变为别的值之后,可以看到子元素的href属性被更新了。

添加或删除类

除了设置属性值之外,我们还可以修改前面的例子,给元素添加或删除类:

 
public void changePage() throws IOException { Document doc = Jsoup.connect("https://www.amazon.com").get(); Element element = doc.getElementById("nav-logo"); System.out.println("Original Element: " + element.outerHtml()); <!--Setting attributes --> element.children().attr("href", "notamazon.org"); System.out.println("Element with set attribute: " + element.outerHtml()); <!--Adding classes --> element.addClass("someClass"); System.out.println("Element with added class: " + element.outerHtml()); <!--Removing classes --> element.removeClass("someClass"); System.out.println("Element with removed class: " + element.outerHtml()); } 

运行代码会给我们以下信息:

 
Original Element: <div id="nav-logo"> <a href="/ref=nav_logo/135-1285661-0204513" class="nav-logo-link" tabindex="6"> <span class="nav-logo-base nav-sprite">Amazon</span> <span class="nav-logo-ext nav-sprite"></span> <span class="nav-logo-locale nav-sprite"></span> </a> <a href="/gp/prime/ref=nav_logo_prime_join/135-1285661-0204513" aria-label="" tabindex="7" class="nav-logo-tagline nav-sprite nav-prime-try"> Try Prime </a> </div> Element with set attribute: <div id="nav-logo"> <a href="notamazon.org" class="nav-logo-link" tabindex="6"> <span class="nav-logo-base nav-sprite">Amazon</span> <span class="nav-logo-ext nav-sprite"></span> <span class="nav-logo-locale nav-sprite"></span> </a> <a href="notamazon.org" aria-label="" tabindex="7" class="nav-logo-tagline nav-sprite nav-prime-try"> Try Prime </a> </div> Element with added class: <div id="nav-logo" class="someClass"> <a href="notamazon.org" class="nav-logo-link" tabindex="6"> <span class="nav-logo-base nav-sprite">Amazon</span> <span class="nav-logo-ext nav-sprite"></span> <span class="nav-logo-locale nav-sprite"></span> </a> <a href="notamazon.org" aria-label="" tabindex="7" class="nav-logo-tagline nav-sprite nav-prime-try"> Try Prime </a> </div> Element with removed class: <div id="nav-logo"> <a href="notamazon.org" class="nav-logo-link" tabindex="6"> <span class="nav-logo-base nav-sprite">Amazon</span> <span class="nav-logo-ext nav-sprite"></span> <span class="nav-logo-locale nav-sprite"></span> </a> <a href="notamazon.org" aria-label="" tabindex="7" class="nav-logo-tagline nav-sprite nav-prime-try"> Try Prime </a> </div> 

可以把新的代码以.html形式保存到本机,或者通过HTTP请求发送大欧网站上,不过要注意后者可能是非法的。

 

结论

在许多情况下Web抓取都很有用,但使用时务必要遵守法律。本文介绍了流行的Web抓取框架JSoup,以及使用它解析信息的几种方式。

这里是程序员秘密聚集地,各位还在架构师的道路上挣扎的小伙伴们速来。“

加QQ群:611481448(名额有限哦!)

DeepSeek Harness:从模型到Agent的工程化框架与部署实践 AI Agent的落地离不开模型与工具链的协同。大模型负责推理决策,而Agent框架则负责将模型输出转化为实际可执行的工具调用与任务闭环。DeepSeek Harness作为围绕DeepSeek模型构建的开源Agent开发框架,正是这套协同机制的核心载体。它通过插件机制将外部能力封装为结构化工具列表,借助会话管理、执行沙箱和反馈循环,让模型能自主调用工具、执行代码并处理批量任务。理解Harness的架构原理和插件注册机制,有助于开发者从“会调API”跨越到“会做Agent”的工程实践。本文深入拆解其插件调用 阅读详情

相关推荐

Java抓取网页数据Demo

Java抓取网页数据的两种方法:(1)抓取原网页 (2)抓取网页JS返回数据

Java爬虫:通过有道翻译获取单词和词组意思

注意:这个不是调用有道翻译的api而是使用爬虫进行信息爬取的。经测试有道对于手机网页版的单词的查询并没有设置时间间隔的反爬虫机制(so 速度还是很快的);使用HttpClient-4.5.5进行请求,使用jsoup-1.11.2进行解析。下面附上调用函数:public static String getTranslate(String word)throws Exception { word=w...

mumoing的博客 1600

java web网站常用抓取其他网站内容

java web网站常用抓取其他网站内容,很详细很经典,

如何使他人访问本地的Java Web应用

近期偶尔要展示一下项目的功能,想到把程序打包发给别人跑很不方便,就上网查了一下如何让别人远程访问本地的项目,总结了两个非常简便但是不持久化的方法。 1.同一局域网下 注意:此种情况下,本机(运行Java Web服务的PC机)和客户机(想要访问Java Web服务)必须在同一局域网内,例如都连着同一个无线路由器。 将项目部署到Tomcat上并启动,并在命令行通过ipconfig命令查看无线局域...

EasonYi的博客 2万+

C++面向对象程序设计大作业:魔兽世界(三):开战

C++面向对象程序设计大作业:魔兽世界(三):开战问题描述问题分析代码 问题描述 问题来自于北京大学郭炜老师的C++慕课的大作业 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2,3 … N ( N <= 20)。红魔军的司令部算作编号为0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。 两军的司令部都会制造武士。武士一共有dragon 、ninja、iceman、lion、wolf 五种。每种武士都有

RedRum_1965的博客 4036

Android 13 Hotseat定制化修改——001 hotseat布局方向

一.背景由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher...

Java_fenxiang的博客 1102

别人家的程序员是如何利用JAVA进行Web抓取的?

Web抓取非常有用,它可以收集信息供多种用途使用,如数据分析、统计、提供第三方信息,还可以给深神经网络和深度学习提供数据。 Web抓取是什么? ...

184

5款高性价比LDO芯片实测对比:从TPS7A4501到LM2940,哪款更适合你的项目?

本文通过实测对比了TPS7A4501、TPS72301、LM2937、LM2940等五款高性价比LDO芯片的核心性能。文章详细分析了跌落电压、输出噪声、静态电流及热性能等关键指标,并结合电池供电物联网节点、高精度数据采集等典型应用场景,提供了清晰的选型指南,帮助工程师根据项目需求选择最合适的LDO芯片。

weixin_29305337的博客 116

java抓取网页数据_使用Electron构建跨平台的抓取桌面程序

使用Electron构建跨平台的抓取桌面程序谈起桌面应用开发技术, 我们会想到.Net下的WinForm, Java下的JavaFX以及Linux下的QT. 这些技术对于Web应用程序员来说一般比较陌生, 因为大多Web应用程序员的开发技能是前端的JavaScript和后端的Java,PHP等语言. 如果Web应用程序员想开发桌面应用怎么办? 主流的桌面应用开发技术的学习曲线不低, 上手比较困难....

weixin_39921087的博客 707

ESP32-BLE学习1-建立简单的server

start 学习之前,我想尝试使用ESP32的demo建立一个简单的server与手机接进行最基本的数据通信。 这里有BLE的简单讲解BLE资料 因为BLE的连接是具有主从机特性的,就像SPI,USB一些请求只能由主机端发起,连接也需要主机端发起。所以手机要想连上ESP32,就得将ESP32设置为从机模式。 从资料上可以看到,从机端通过Notify通知主机,所以从机就是GATT Server。 在进行ESP32 的demo学习之前,得大体看下ESP32的蓝牙组成,ESP32支持经典蓝牙和低功耗蓝牙4.2,

Spark的博客 1842

DeepSeek API调用太复杂?OneAPI一站式聚合解决方案

本文介绍了OneAPI如何作为一站式聚合解决方案,简化DeepSeek API的调用流程。通过统一接口、智能路由和模型映射等核心功能,OneAPI大幅降低了多API适配的复杂性,提升开发效率。文章还提供了详细的部署指南和高阶使用技巧,帮助开发者快速实现API聚合管理。

weixin_27215337的博客 381

跨界学习打造多语言编程技能之路:Java 程序员如何高效掌握 Python 编程

作为一名 Java 程序员,你可能已经在面向对象编程、JVM 生态系统以及丰富的框架方面构建了坚实的知识基础。然而,在当前的软件开发领域,多语言技能变得越来越重要,掌握多种编程语言已经成为一种趋势,Python 正是其中的一个很好的选择。随着 Python 在软件开发和数据科学领域的广泛应用,越来越多的 Java 程序员也开始意识到学习 Python 的重要性。它以简洁的语法、强大的库支持以及广泛的应用场景赢得了开发者的青睐。

灸哥漫谈 Calvin 1316

1.Fay-UE5数字人工程导入(UE数字人系统教程)

ue5数字人系列教程(含源文件工程)

1万+

Java后端程序员3年工作经验总结(一)

1.引言  工作已经3年有余,这3年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西。这3年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统维护和发布当救火队员的苦恼。遂决定梳理一下自己所学的东西,为大家分享一下。  经过3年意识到以前也有很多认识误区,比如:  偏爱收集,经常收集各种资料视频塞满一个个硬盘,然后心满意足的看着容量不行动。  不重基础,总觉得很多基础东西...

刘成 3万+

博图软件V15.1安装教程

博途软件安装

m0_46266496的博客 1万+

js逆向第3例:蝉妈妈大屏实时数据formDataSign加密

蝉妈妈大屏抖音直播实时数据是抓取抖音直播间数据的实时数据,有类似需求的公司但没有能力去搞定抖音,抓取蝉妈妈数据也是一个不错的选择。接下来就是调试找到加密点,说句题外话蝉妈妈的所有js文件打包方式用的都是webpack5,那如何区分打包方式可以阅读这篇文章。时间戳 ,经过观察发现加密参数是实时变化的。这个函数扣下来,在浏览器控制台中测试一下。言归正传,打断点找到变量。继续打断点向上找又发现了。查看请求参数,可以看到。请求的内容,那么这个。

花臂不花Home 1540

如何一键抓取全国二手房和租房数据? (全部源码)

最近又要租房了,哪里的性价比更高?买房却不知道全国市场的趋势如何?程序员自有办法,抓取网络的房产交易和租房数据来分析啊! 用Python写起来麻烦,用商业软件速度慢还收费,开源的图形化爬虫Hawk,已经在其任务市场里内置了全国链家和我爱我家的工程任务。一键即可加载市场任务,一键在全国几十个城市之间切换,还能一键导出数据到Excel,txt等各种文本类型,心动了么? Hawk,由沙漠之鹰历时五年个人...

weixin_30547797的博客 472

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

17年春节各语言程序员努力指数

新年第一天上班,学习了python,自定一个题目查看过年期间,各种语言程序员发表博客情况,看下程序员的努力情况,具体办法是抓取cnblogs中各个博客发表日期,查看放假期间方标数量对比下,纯属娱乐,如有不适,敬请谅解,呵呵! import re import urllib2 import datetime def getHtml(url): res = urll...

dingti6779的博客 184

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

electron 样式不加载_使用Electron构建跨平台的抓取桌面程序

使用Electron构建跨平台的抓取桌面程序谈起桌面应用开发技术, 我们会想到.Net下的WinForm, Java下的JavaFX以及Linux下的QT. 这些技术对于Web应用程序员来说一般比较陌生, 因为大多Web应用程序员的开发技能是前端的JavaScript和后端的Java,PHP等语言. 如果Web应用程序员想开发桌面应用怎么办? 主流的桌面应用开发技术的学习曲线不低, 上手比较困难....

weixin_42519126的博客 231

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

第二十七期:网络爬虫程序员被抓,我们还敢爬虫吗?细数那些Java爬虫技术

最近,某大数据科技公司因为涉嫌非法抓取某招聘网站用户的简历信息,公司被查封,负责编写抓取程序的程序员也将面临坐牢。 作者:架构之路来源 最近,某大数据科技公司因为涉嫌非法抓取某招聘网站用户的简历信息,公司被查封,负责编写抓取程序的程序员也将面临坐牢。 事情的大概经过是这样的: 某大数据科技公司老板丢给一个小小的程序员一个网站,告诉他把这个网站的数据抓取下来,咱们做一做分析。这个小...

歌谣的博客 1万+
上一篇: Java程序员卧底从阿里、京东、美团面试回来,这些面试题你会吗?
下一篇: 挑逗Java程序员的那些Scala绝技
java1856905
博客等级 码龄8年 100粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值