[Java][华为云Java编程创造营][学习笔记][第三阶段][04_Java爬虫实战][一]

举报
John2021 发表于 2021/12/30 05:59:45 2021/12/30
【摘要】 1,爬虫编程 1.1,Java爬虫技术导读 什么是爬虫?爬虫一般指网络爬虫(Web crawler),是一种按照一定的规则,自动地爬取万维网信息的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。 网路爬虫合法吗?网络爬虫技术目前已经应用广泛,虽然互联网世界已经通过自身的协议建立起一定的道德规范(Robots协议),但法律部分还在建立和完善中。 从目前的情况来看,如果抓...

1,爬虫编程

1.1,Java爬虫技术导读

什么是爬虫?

  • 爬虫一般指网络爬虫(Web crawler),是一种按照一定的规则,自动地爬取万维网信息的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。

网路爬虫合法吗?

  • 网络爬虫技术目前已经应用广泛,虽然互联网世界已经通过自身的协议建立起一定的道德规范(Robots协议),但法律部分还在建立和完善中。 从目前的情况来看,如果抓取的数据属于个人使用或科研范畴,基本不存在问题;而如果数据属于商业盈利范畴,就要就事论事,有可能属于违法行为,也有可能不违法。

  • Robots协议(爬虫协议)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。该协议是国际互联网界通行的道德规范,虽然没有写入法律,但是每一个爬虫都应该遵守这项协议。

网络爬虫的约束

  • 除了上述Robots协议之外,我们使用网络爬虫时还要对自己进行约束:
    • 过于快速或者频密的网络爬虫都会对服务器产生巨大的压力,网站可能封锁你的ip,甚至采取进一步的法律行为。因此,你需要约束自己的网络爬虫行为, 将请求的速度限定在一个合理的范围之内。
    • 在爬取网站的时候需要限制自己的爬虫,遵守Robots协议和约束网络爬虫程序的速度;在使用数据的时候必须遵守网站的知识产权。如果违反了这些规定, 很可能会吃官司,并且败诉的概率相当高。
  • 提示:本课程中的爬虫程序仅用于学习、研究用途,请不要用于非法用途。任何由此引发的法律纠纷,请自行负责。

1.2,爬虫技术简介

爬虫技术简介(1)

  • 随着网络的迅猛发展,万维网成为大量信息的载体,而信息的采集是一项重要的工作,如果单纯靠人力进行信息采集,不仅低效繁琐,搜索的成本也会提高。那么如何有效地提取并利用这些信息成为一个巨大的挑战。
  • 爬虫一般指网络爬虫(Web crawler),是一种按照一定的规则,自动地爬取万维网信息的程序或者脚本,可以自动采集所有能够访问到的页面内容,以获取相关数据。

爬虫技术简介(2)

  • 从功能上讲,爬虫一般分为数据采集,处理,存储三个部分。
  • 爬虫能解决什么问题?
    • 1,大数据时代,可以让我们获取更多的数据源
    • 2,实现私人的搜索引擎
    • 3,优化搜索引擎

1.3,Jsoup爬虫技术栈

Jsoup爬虫技术栈(1)

  • Jsoup 是一个Java HTML Parser,能够从URL,文件或字符串中解析HTML。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
  • Jsoup的主要功能:
    • 1,从URL,文件或字符串中抓取和解析HTML
    • 2,使用CSS选择器或者DOM遍历查找和提取数据
    • 3,可操作HTML元素,属性和文本
  • 注意:Jsoup是基于MIT协议发布的,可以放心使用于商业项目

Jsoup准备工作

  • 1,新建maven工程

  • 2,在浏览器打开 maven仓库

  • 3,搜索jsoup

  • 4,

  • 5,

  • 6,

  • 7,将jsoup的坐标输入pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>huaweijava</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.14.3</version>
        </dependency>
    </dependencies>

</project>

Jsoup爬虫技术栈(2)

  • Jsoup解析URL
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Demo1
{
    public static void main(String[] args) throws Exception
    {
        Document document = Jsoup.connect("https://www.huaweicloud.com/").get();
        //获取标题内容
        String title = document.title();
        System.out.println(title);//华为云-提供云计算服务 +智能,见未来-华为云
    }
}
  • Jsoup.connect(String url)方法返回了一个org.jsoup.Connection对象。在Connection对象中,可以使用get()或者post()方法来执行请求,并返回一个org.jsoup.nodes.Document对象,可以通过解析Document对象来获取我们想要的元素。

Jsoup爬虫技术栈(3)

  • Jsoup解析字符串
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Demo2
{
    public static void main(String[] args) throws Exception
    {
        String html = "<html>" +
                "<head>" +
                "<title>" +
                "Firstparse" +
                "</title>" +
                "</head>" +
                "<body>" +
                "<p>" +
                "Parsed HTML into a doc." +
                "</p>" +
                "</body>" +
                "</html>";
        Document document = Jsoup.parse(html);
        //获取标题内容
        System.out.println(document.title());//Firstparse
    }
}
  • Jsoup.parse(String str)方法可以解析HTML字符串,并返回一个Document对象,可以通过解析Document对象来获取我们想要的元素。

Jsoup爬虫技术栈(4)

  • Jsoup解析文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Huawei</title>
</head>
<body>

</body>
</html>
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;

public class Demo3
{
    public static void main(String[] args) throws Exception
    {
        Document document = Jsoup.parse(new File("src\\main\\java\\com\\huawei\\demo3\\jsoup.html"), "UTF-8");
        //获取标题内容
        String title = document.title();
        System.out.println(title);//Huawei
    }
}
  • Jsoup.parse(File file,String charSetName)方法可以加载并解析一个HTML文件,并返回一个Document对象,可以通过解析Document对象来获取我们想要的元素。

Jsoup爬虫技术栈(5)

  • 使用选择器语法查找元素
    • Jsoup元素支持类似于CSS(或jQuery)的选择器语法,来实现非常强大和灵活的查找功能。Jsoup提供了select(Stirng selector)方法,可以实现指定元素的过滤,或链式选择访问,该方法将返回一个Elements集合对象,并提供一组方法来抽取和处理结果。
  • selector选择器概述:
    • tagname:按照标签查找元素
    • #id:通过id查找元素
    • .class:通过类名查找元素
    • [attribute]:利用属性名查找元素
    • [attr=value]:利用属性值查找元素

Jsoup爬虫技术栈(6)

  • selector选择器使用案例:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.File;

public class Demo4
{
    public void testSelector() throws Exception
    {
        //解析文件
        Document document = Jsoup.parse(new File("src\\main\\java\\com\\huawei\\demo3\\jsoup.html"), "UTF-8");
        //1,通过标签查找元素,比如:span
        Element tagElement = document.select("span").first();
        //2,通过id查找元素,比如:Huaweicloud_school
        Element idElement = document.select("#Huaweicloud_school").first();
        //3,通过class查找元素,比如class_a
        Element classElement = document.select(".class_a").first();
        //4,通过属性查找元素,比如[myAttr]
        Element attrElement = document.select("[myAttr]").first();
        //5,通过属性值查找元素,比如[class=course]
        Element varElement = document.select("[class=course]").first();
        System.out.println(varElement.text());
    }
}

Jsoup爬虫技术栈(7)

  • selector选择器的组合使用:
    • el#id:元素+id
    • el.class:元素+class
    • el[attr]:元素+属性名
    • 任意组合:例如 元素[属性名].class
    • ancestor chile:查找某个元素下子元素
    • parent > chile:查找某个父元素下的直接子元素

Jsoup爬虫技术栈(8)

  • Elements提供了一系列类似于DOM的方法来提取和操作他们的数据:
    • id():从元素中获取id
    • className():从元素中获取className
    • attr(String str):从元素中获取属性str的值
    • attributes():从元素中获取所有属性attributes
    • text():从元素中获取文本内容

Jsoup爬虫技术栈(9)

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import java.io.File;
import java.util.Set;

public class Demo5
{
    public void testData() throws Exception
    {
        //解析文件
        Document document = Jsoup.parse(new File("src\\main\\java\\com\\huawei\\demo3\\jsoup.html"), "UTF-8");
        //根据id获取元素
        Element element = document.getElementById("test");
        String str = "";
        //从元素中获取数据
        //1,从元素中获取id的值
        str = element.id();
        //2,从元素中获取class的值
        str = element.className();
        Set<String> classSet = element.classNames();
        //3,从元素中获取属性的值attr
        str = element.attr("class");
        //4,从元素中获取文本的内容
        str = element.text();
        System.out.println("获取到的数据是:" + str);
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。