百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

手把手教你从零开始用Java写爬虫

liuian 2025-01-07 14:14 20 浏览


本文将手把手地教大家从零开始用Java写一个简单地爬虫!

目标

爬取全景网图片,并下载到本地

收获

通过本文,你将复习到:

  • IDEA创建工程
  • IDEA导入jar包
  • 爬虫的基本原理
  • Jsoup的基本使用
  • File的基本使用
  • FileOutputStream的基本使用
  • ArrayList的基本使用
  • foreach的基本使用

说明

爬虫所用的HTM解析器为Jsoup。Jsoup可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup相关API整理见文末附录一。

开始

一、前端分析

1、使用Chrome或其他浏览器,打开全景网,按F12进入调试模式,分析网页结构。(这里选的是“创意”=>“优山美地”)

2、找规律,看图片对应的结构是什么。可以发现,每个图片的结构都如下图红框所示。

3、找到结构后再找图片链接。进一步分析后发现,图片链接可以是下图红框部分。

4、复制到浏览器打开看看验证下。(好吧,访问这个URL直接给我下载了...)

5、前端部分分析完毕,接下来就可以用Java编码了!


二、爬取思路

通过Java向全景网发送GET请求,以获取HTML文件。Jsoup解析后寻找class=item lazy的a标签,他的child节点(即<img>)就是我们要找的目标节点了,搜索到的应当是一个ArrayList。然后遍历集合,从中搜寻图片的URL,并下载到本地保存。(更深一步,可以下载完一页后,继续下载后一页,直至全部下完。本文直讲下载第一页。提示一下,链接后面的topic/1其实就是当前页数)


三、Java编码

1、先下载Jsoup jar包,并导入到IDEA工程中。

2、新建Java工程。

3、简单测试下get请求,若请求成功,则进入下一步;若报错,检查URL是否带了中文。

注意:链接没给,否则文章审核不过,注意自己添加!!!

package com.sxf;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class Main {
    public static void main(String[] args) {
        try {
            Document doc = Jsoup.connect("").get(); //这里加链接
            System.out.println(doc);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}


4、寻找class为item lazy的元素,找到他的child节点,返回ArrayList。并将图片的URL单独提取出来。

注意:链接没给,否则文章审核不过,注意自己添加!!!

注意:链接没给,否则文章审核不过,注意自己添加!!!


5、我们先尝试用Jsoup下载一张图片试试效果。

注意:链接没给,否则文章审核不过,注意自己添加!!!

// 获取response
Connection.Response imgRes = Jsoup.connect(URLS.get(0)).ignoreContentType(true).execute();
FileOutputStream out = (new FileOutputStream(new java.io.File("demo.jpg")));
// imgRes.body() 就是图片数据
out.write(imgRes.bodyAsBytes());
out.close();

可以看到在当前工程路径下,生成了demo.jpg图片,并且显示正常!

6、接下来,我们要创建一个文件夹,用来专门存放图片。

File相关API整理见文末附录二。

//当前路径下创建Pics文件夹
File file = new File("Pics");
file.mkdir();
System.out.println(file.getAbsolutePath());


7、接下来开始遍历图片并下载。由于图片较多,为了简单起见,我们保存图片时候的名称,就从1开始依次增吧。

// 遍历图片并下载
int cnt = 1;
for (String str : URLS) {
    System.out.println(">> 正在下载:"+str);
    // 获取response
    Connection.Response imgRes = Jsoup.connect(str).ignoreContentType(true).execute();
    FileOutputStream out = (new FileOutputStream(new java.io.File(file, cnt+".jpg")));
    // imgRes.body() 就是图片数据
    out.write(imgRes.bodyAsBytes());
    out.close();
    cnt ++;
}

运行结果


到此编码部分也结束了,完整代码见文末附件三!


附录一

Jsoup(HTML解析器)

继承关系:Document继承Element继承Node。TextNode继承Node。
->java.lang.Object
  ->org.jsoup.nodes.Node
    ->org.jsoup.nodes.Element
      ->org.jsoup.nodes.Document
html文档:Document
元素操作:Element
节点操作:Node

官方API:https://jsoup.org/apidocs/org/jsoup/nodes/Document.html
  
一、解析HTML并取其内容
  Document doc = Jsoup.parse(html);

二、解析一个body片断
  Document doc = Jsoup.parseBodyFragment(html);
  Element body = doc.body();

三、从一个URL加载一个Document
  Document doc = Jsoup.connect("http://example.com")
    .data("query", "Java")
    .userAgent("Mozilla")
    .cookie("auth", "token")
    .timeout(3000)
    .post();
  String title = doc.title();

四、从一个文件加载一个文档
  File input = new File("/tmp/input.html");
  // baseUri 参数用于解决文件中URLs是相对路径的问题。如果不需要可以传入一个空的字符串
  Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");  

五、使用DOM方法来遍历一个文档
  1、查找元素
  getElementById(String id)
  getElementsByTag(String tag)
  getElementsByClass(String className)
  getElementsByAttribute(String key) // 和相关方法
  // 元素同级
  siblingElements()
  firstElementSibling()
  lastElementSibling()
  nextElementSibling()
  previousElementSibling()
  // 关系
  parent()
  children()
  child(int index)

  2、元素数据
  // 获取属性attr(String key, String value)设置属性
  attr(String key)
  // 获取所有属性
  attributes()
  id()
  className()
  classNames()
  // 获取文本内容text(String value) 设置文本内容
  text()
  // 获取元素内HTMLhtml(String value)设置元素内的HTML内容
  html()
  // 获取元素外HTML内容
  outerHtml()
  // 获取数据内容(例如:script和style标签)
  data()
  tag()
  tagName()

  3、操作HTML和文本
  append(String html)
  prepend(String html)
  appendText(String text)
  prependText(String text)
  appendElement(String tagName)
  prependElement(String tagName)
  html(String value)
  
六、使用选择器语法来查找元素(类似于CSS或jquery的选择器语法)
  //带有href属性的a元素
  Elements links = doc.select("a[href]"); 
  //扩展名为.png的图片
  Elements pngs = doc.select("img[src$=.png]");
  //class等于masthead的div标签
  Element masthead = doc.select("div.masthead").first(); 
  //在h3元素之后的a元素
  Elements resultLinks = doc.select("h3.r > a"); 

七、从元素抽取属性、文本和HTML
  1、要取得一个属性的值,可以使用Node.attr(String key) 方法
  2、对于一个元素中的文本,可以使用Element.text()方法
  3、对于要取得元素或属性中的HTML内容,可以使用Element.html(), 或 Node.outerHtml()方法
  4、其他:
    Element.id()
    Element.tagName()
    Element.className()
    Element.hasClass(String className)


附录二

File类

*java.io.File类用于表示文件或目录。*
创建File对象:
// 文件/文件夹路径对象
File file = new File("E:/...");
// 父目录绝对路径 + 子目录名称
File file = new File("..." ,"");
// 父目录File对象 + 子目录名称  
File file = new File("...","...");
file.exists():判断文件/文件夹是否存在
file.delete():删除文件/文件夹
file.isDirectory():判读是否为目录
file.isFile():判读是否为文件夹
file.mkdir():创建文件夹(仅限一级目录)
file.mkdirs():创建多及目录文件夹(包括但不限一级目录)
file.createNewFile():创建文件
file.getAbsolutePath():得到文件/文件夹的绝对路径
file.getName():得到文件/文件夹的名字
file.String():同样是得到文件/文件夹的绝对路径等于file.getAbsolutePath()
file.getParent():得到父目录的绝对路径


附录三

完整代码

package com.sxf;
?
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
?
public class Main {
    public static void main(String[] args) {
        try {
            Document doc = Jsoup.connect("https://www.quanjing.com/creative/topic/1").get();
            // 寻找class为item lazy的元素,返回ArrayList。
            Elements items = doc.getElementsByClass("item lazy");
            ArrayList<String> URLS = new ArrayList<>();
            // 将图片的URL单独提取出来。
            for (Element i : items) {
                URLS.add(i.child(0).attr("src"));
            }
            // 当前路径下创建Pics文件夹
            File file = new File("Pics");
            file.mkdir();
            String rootPath = file.getAbsolutePath();
            System.out.println(">> 当前路径:"+rootPath);
            // 遍历图片并下载
            int cnt = 1;
            for (String str : URLS) {
                System.out.println(">> 正在下载:"+str);
                // 获取response
                Connection.Response imgRes = Jsoup.connect(str).ignoreContentType(true).execute();
                FileOutputStream out = (new FileOutputStream(new java.io.File(file, cnt+".jpg")));
                // imgRes.body() 就是图片数据
                out.write(imgRes.bodyAsBytes());
                out.close();
                cnt ++;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

相关推荐

GANs为何引爆机器学习?这篇基于TensorFlow的实例教程为你解惑!

「机器人圈导览」:生成对抗网络无疑是机器学习领域近三年来最火爆的研究领域,相关论文层出不求,各种领域的应用层出不穷。那么,GAN到底如何实践?本文编译自Medium,该文作者以一朵玫瑰花为例,详细阐...

高丽大学等机构联合发布StarGAN:可自定义表情和面部特征

原文来源:arXiv、GitHub作者:YunjeyChoi、MinjeChoi、MunyoungKim、Jung-WooHa、SungKim、JaegulChoo「雷克世界」编译:嗯~...

TensorFlow和PyTorch相继发布最新版,有何变化

原文来源:GitHub「机器人圈」编译:嗯~阿童木呀、多啦A亮Tensorflow主要特征和改进在Tensorflow库中添加封装评估量。所添加的评估量列表如下:1.深度神经网络分类器(DNNCl...

「2022 年」崔庆才 Python3 爬虫教程 - 深度学习识别滑动验证码缺口

上一节我们使用OpenCV识别了图形验证码躯壳欧。这时候就有朋友可能会说了,现在深度学习不是对图像识别很准吗?那深度学习可以用在识别滑动验证码缺口位置吗?当然也是可以的,本节我们就来了解下使用深度...

20K star!搞定 LLM 微调的开源利器

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还没开始微调就已经因为...

大模型DeepSeek本地部署后如何进行自定义调整?

1.理解模型架构a)查看深度求索官方文档或提供的源代码文件,了解模型的结构、输入输出格式以及支持的功能。模型是否为预训练权重?如果是,可以在预训练的基础上进行微调(Fine-tuning)。是否需要...

因配置不当,约5000个AI模型与数据集在公网暴露

除了可访问机器学习模型外,暴露的数据还可能包括训练数据集、超参数,甚至是用于构建模型的原始数据。前情回顾·人工智能安全动态向ChatGPT植入恶意“长期记忆”,持续窃取用户输入数据多模态大语言模型的致...

基于pytorch的深度学习人员重识别

基于pytorch的深度学习人员重识别Torchreid是一个库。基于pytorch的深度学习人员重识别。特点:支持多GPU训练支持图像的人员重识别与视频的人员重识别端到端的训练与评估简单的re...

DeepSeek本地部署:轻松训练你的AI模型

引言:为什么选择本地部署?在AI技术飞速发展的今天,越来越多的企业和个人希望将AI技术应用于实际场景中。然而,对于一些对数据隐私和计算资源有特殊需求的用户来说,云端部署可能并不是最佳选择。此时,本地部...

谷歌今天又开源了,这次是Sketch-RNN

前不久,谷歌公布了一项最新技术,可以教机器画画。今天,谷歌开源了代码。在我们研究其代码之前,首先先按要求设置Magenta环境。(https://github.com/tensorflow/magen...

Tensorflow 使用预训练模型训练的完整流程

前面已经介绍了深度学习框架Tensorflow的图像的标注和训练数据的准备工作,本文介绍一下使用预训练模型完成训练并导出训练的模型。1.选择预训练模型1.1下载预训练模型首先需要在Tensorf...

30天大模型调优学习计划(30分钟训练大模型)

30天大模型调优学习计划,结合Unsloth和Lora进行大模型微调,掌握大模型基础知识和调优方法,熟练应用。第1周:基础入门目标:了解大模型基础并熟悉Unsloth等工具的基本使用。Day1:大模...

python爬取喜马拉雅音频,json参数解析

一.抓包分析json,获取加密方式1.抓包获取音频界面f12打开抓包工具,播放一个(非vip)视频,点击“媒体”单击打开可以复制URL,发现就是我们要的音频。复制“CKwRIJEEXn-cABa0Tg...

五、JSONPath使用(Python)(json数据python)

1.安装方法pipinstalljsonpath2.jsonpath与Xpath下面表格是jsonpath语法与Xpath的完整概述和比较。Xpathjsonpath概述/$根节点.@当前节点...

Python网络爬虫的时候json=就是让你少写个json.dumps()

大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和...