用java实现一个简单的网络爬虫

文章目录

  • 什么是URL
  • 实现爬虫的一些预备知识
    • 一.URL
    • 二.URLConnection
    • 三.正则表达式
    • Pattern 与 Matcher
  • 实现网络爬虫

什么是URL

Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL(Uniform Resource Locator, 统一资源定位器)。它是www的统一资源定位标志,简单地说URL就是web地址,俗称“网址”。
URL是对互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源的地址。URL它具有全球唯一性,正确的URL应该是可以通过浏览器打开此网页的,但如果您访问外网,会提示网页无法打开,这并不能说明这个URL是错误的。只不过在国内不能访问而已。

实现爬虫的一些预备知识

一.URL

URL url = new URL(net);

这行代码是在 Java 中创建一个 URL 对象,URL 是一个表示统一资源定位符的类。它通常用于表示互联网上的资源,例如网页、图片、视频等。

在上面的代码中,net 是一个字符串,表示要访问的 URL 地址。URL 类的构造函数接受一个字符串参数,用于指定要访问的 URL。也可以直接写地址。

二.URLConnection

URLConnection 是用于表示 URL 连接的抽象类,它是所有 URL 连接类的超类。URLConnection 类提供了一些方法来获取与 URL 连接相关的信息,并进行网络操作,例如打开连接、读取响应数据等。

下面是 URLConnection 类的一些常用方法:

openConnection() 方法:用于创建一个 URL 连接对象。
connect() 方法:用于打开 URL 连接并准备读取数据。
getInputStream() 方法:用于获取与 URL 连接关联的输入流,从中可以读取响应数据。
getOutputStream() 方法:用于获取与 URL 连接关联的输出流,从中可以写入请求数据。
setRequestMethod() 方法:用于设置请求方法,例如 GET、POST 等。
setRequestProperty() 方法:用于设置请求头信息。
getResponseCode() 方法:用于获取 HTTP 响应码。
getResponseMessage() 方法:用于获取 HTTP 响应消息。

三.正则表达式

这个大家自己找几篇文章了解一下。

Pattern 与 Matcher

在 Java 中,Pattern 和 Matcher 是用于进行正则表达式匹配的类。

Pattern 类表示一个正则表达式的编译结果,可以用于在输入字符串上执行匹配操作。Pattern 类提供了一些静态方法来创建 Pattern 对象,例如 compile() 方法用于编译正则表达式,matches() 方法用于检查输入字符串是否与正则表达式匹配,等等。

下面是一个简单的示例代码,演示了如何创建 Pattern 对象并进行匹配操作:

import java.util.regex.*;

public class PatternExample {
    public static void main(String[] args) {
        // 编译正则表达式
        Pattern pattern = Pattern.compile("foo\\d+");

        // 在输入字符串上执行匹配操作
        String input = "foo123bar";
        boolean isMatch = pattern.matcher(input).matches();
        System.out.println(isMatch);  // 输出 true
    }
}

在上面的代码中,首先使用 Pattern.compile() 方法编译正则表达式 foo\d+,然后使用 matcher() 方法创建一个 Matcher 对象。接着,使用 matches() 方法在输入字符串 foo123bar 上执行匹配操作,并将结果存储在一个布尔型变量中。最后,将匹配结果输出到控制台。

_Matcher 类表示一个输入字符串上的匹配器,用于执行正则表达式的匹配操作。Matcher 类提供了一些方法来执行匹配操作,例如 find() 方法用于查找下一个匹配项,group() 方法用于返回与最后一次匹配相匹配的子序列,等等。
下面是一个简单的示例代码,演示了如何使用 Matcher 类进行匹配操作:

import java.util.regex.*;

public class MatcherExample {
    public static void main(String[] args) {
        // 编译正则表达式
        Pattern pattern = Pattern.compile("foo\\d+");

        // 在输入字符串上执行匹配操作
        String input = "foo123barfoo456baz";
        Matcher matcher = pattern.matcher(input);

        // 查找匹配项并输出结果
        while (matcher.find()) {
            String match = matcher.group();
            int start = matcher.start();
            int end = matcher.end();
            System.out.println("Match: " + match + ", Start: " + start + ", End: " + end);
        }
    }
}

在上面的代码中,首先使用 Pattern.compile() 方法编译正则表达式 foo\d+,然后使用 matcher() 方法创建一个 Matcher 对象。接着,使用 find() 方法查找输入字符串中的匹配项,并使用 group()、start() 和 end() 方法获取匹配结果的相关信息。最后,将匹配结果输出到控制台。

实现网络爬虫

package com.shuaige;

import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class paTest {
    public static void main(String[] args)throws Exception {
        String familyname = "https://hanyu.baidu.com/shici/detail?pid=0b2f26d4c0ddb3ee693fdb1137ee1b0d&from=kg0";
        String boyname = "http://www.haoming8.cn/baobao/10881.html";
        String girlname = "http://www.haoming8.cn/baobao/7641.html";
        String nann = "https://poe.com/";
        String name = webCrawler(familyname);
        String Boyname = webCrawler(boyname);
        String Girlname = webCrawler(girlname);
        ArrayList<String> familyName = getData(name,"(.{4})(,|。)",1);
        ArrayList<String> boyName = getData(Boyname,"([\\u4F00-\\u9FA5]{2})(、|。)",1);
        ArrayList<String> girlName = getData(Girlname,"(.. ){4}..",0);
        System.out.println(boyName);
        //System.out.println(familyName);
    }
    private static ArrayList<String> getData(String str,String regex,int index){
        ArrayList<String> list = new ArrayList<>();
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()){

            list.add(matcher.group(index));
        }
        return list;
    }
    public static String webCrawler(String net)throws Exception{
        StringBuilder sb = new StringBuilder();
        URL url = new URL(net);
        URLConnection conn = url.openConnection();
        InputStreamReader isr = new InputStreamReader(conn.getInputStream());
        int ch;
        while((ch=isr.read())!=-1){
            sb.append((char) ch);

        }
        isr.close();
        return sb.toString();
    }
}

定义了四个字符串变量 familyname、boyname、girlname 和 nann,分别表示要爬取数据的四个网站的 URL。
调用 webCrawler 方法,从四个网站上爬取数据,并将数据存储在字符串变量 name、Boyname、Girlname 和 nann 中。
调用 getData 方法,使用正则表达式从字符串中提取数据,并将提取结果存储在 ArrayList 中。其中,第一个参数是要匹配的字符串,第二个参数是正则表达式,第三个参数是要提取的子表达式的索引。
输出 boyName 和 familyName 的内容。
在上面的代码中,webCrawler 方法使用 URL 和 URLConnection 类从指定的网站上读取数据,并将数据存储在一个 StringBuilder 中。getData 方法使用 Pattern 和 Matcher 类进行正则表达式匹配和数据提取。最后,程序输出了 boyName 和 familyName 的内容,这些内容是从指定的网站上爬取并提取出来的。
今天的分享到此结束,但是我的爬虫实现比较简单,适合入门,大家想要深入了解还是去看看jsoup-.

你可能感兴趣的:(java,java,爬虫,开发语言)