首页 > 编程语言 >简单网页爬虫(java)

简单网页爬虫(java)

时间:2024-05-30 21:30:41浏览次数:15  
标签:begin 网页 url 爬虫 网址 waiting str java

一、绪论

 1.功能

通过用户输入的一个网址,该程序可以不重复地打印出这个网址中涉及到的一系列其他网址信息

2.预备知识

1.java的基础语法

2.java文本IO及异常处理

二、代码实现

1.代码思路

创建两个数组,一个数组存取已经访问过的网址,一个数组存取准备访问地网址,大概的思想和BFS差不多(也可以理解和树地层序遍历思想差不多),先访问一个网址涉及到的所有网址,并将他们添加到待访问地数组中,循环遍历所有网址(在这里我们设计让他访问了100个网址就停止访问)

2.具体代码

Ⅰ.爬虫入口(如何从用户输入的网址抵达其他网址)

static void WebCraw(String url) throws IOException {
        waiting.add(new URL(url));
        while(!waiting.isEmpty()&&travelled.size()!=100)         //当网页不存在网址或已经访问了100个网址时停止访问
        {
               URL cur= waiting.get(0);
                waiting.remove(0);                       //取出待爬取中的第一个网址进行爬取
                System.out.println(cur);                       //将其打印出来
                travelled.add(cur);
                try(  InputStream inputStream= cur.openStream();
                      Scanner scanner=new Scanner(inputStream)) {
                    while (scanner.hasNext()) {
                        String str = scanner.nextLine();
                        WebOperate(str);
                    }
            }
            catch (UnknownHostException ex)                     //可能无法访问
            {
                System.out.println("UnknownHostException");
            }
            catch (IOException ex)
            {
                System.out.println("IOException");
            }
            catch (IllegalArgumentException ex)
            {
                System.out.println("IllegalArgumentException");
            }
        }
    }

Ⅱ.单网址的爬取处理

 static void WebOperate(String str) throws MalformedURLException {
        int begin=str.indexOf("https://");
        if(begin!=-1&&str.substring(begin).contains("\""))                 //要保证后面有双引号
        {                                                                  //网址以https://开始,以”结束
            int end = str.substring(begin).indexOf("\"") + begin;     //注意此处要从找到https://之后开始找
            String site = str.substring(begin, end);
            URL url = new URL(site);
            if (!travelled.contains(url)) {
                    waiting.add(url);            //将扫描到的网址添加到待访问数组中去
                }
            if (end<str.length() - 1) WebOperate(str.substring(end + 1));      //继续访问没访问完的这行数据
            }
    }

Ⅲ.主函数(让用户输入要爬取的网址)

public static void main(String []args) throws IOException
    {
        travelled.clear();          //初始化两个数组
        waiting.clear();
        System.out.println("请输入要爬取的网址:");
        Scanner input=new Scanner(System.in);
        String url=input.nextLine();
        WebCraw(url);
    }

3.完整代码

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Scanner;

public class WebCrawler {
   static ArrayList<URL> travelled=new ArrayList<>();
   static ArrayList<URL> waiting=new ArrayList<>();
    static void WebOperate(String str) throws MalformedURLException {
        int begin=str.indexOf("https://");
        if(begin!=-1&&str.substring(begin).contains("\""))                 //要保证后面有双引号
        {                                                                  //网址以https://开始,以”结束
            int end = str.substring(begin).indexOf("\"") + begin;     //注意此处要从找到https://之后开始找
            String site = str.substring(begin, end);
            URL url = new URL(site);
            if (!travelled.contains(url)) {
                    waiting.add(url);            //将扫描到的网址添加到待访问数组中去
                }
            if (end<str.length() - 1) WebOperate(str.substring(end + 1));      //继续访问没访问完的这行数据
            }
    }

    static void WebCraw(String url) {
        waiting.add(new URL(url));
        while(!waiting.isEmpty()&&travelled.size()!=100)         //当网页不存在网址或已经访问了100个网址时停止访问
        {
            URL cur= waiting.get(0);
                waiting.remove(0);                       //取出待爬取中的第一个网址进行爬取
                System.out.println(cur);                       //将其打印出来
                travelled.add(cur);
                try(  InputStream inputStream= cur.openStream();
                      Scanner scanner=new Scanner(inputStream)) {
                    while (scanner.hasNext()) {
                        String str = scanner.nextLine();
                        WebOperate(str);
                    }
            }
            catch (UnknownHostException ex)                     //可能无法访问
            {
                System.out.println("UnknownHostException");
            }
            catch (IOException ex)
            {
                System.out.println("IOException");
            }
            catch (IllegalArgumentException ex)
            {
                System.out.println("IllegalArgumentException");
            }
        }
    }

    public static void main(String []args) throws IOException
    {
        travelled.clear();          //初始化两个数组
        waiting.clear();
        System.out.println("请输入要爬取的网址:");
        Scanner input=new Scanner(System.in);
        String url=input.nextLine();
        WebCraw(url);
    }
}

4.结果展示

下面还有许多,就不截完了

标签:begin,网页,url,爬虫,网址,waiting,str,java
From: https://blog.csdn.net/2301_81121202/article/details/139331270

相关文章

  • JavaScript实现跳转的方法
    在JavaScript中,实现页面跳转(即导航到另一个网页)有多种方法。以下是一些常见的方法及其示例代码:1.使用 window.location.href通过设置 window.location.href 属性,可以跳转到新的URL。javascriptwindow.location.href="https://www.example.com";2.使用 window.open......
  • Java容器集合
    简单示意图详细示意图ArrayList和LinkedList区别ArrayList(默认size为10)是实现了基于动态数组的数据结构,LinkedList基于双向链表的数据结构。对于随机访问get和set,ArrayList效率优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remo......
  • java单元测试:spring测试模块
    Spring测试模块为开发者提供了一套强大的工具,用于在Spring应用中进行单元测试、集成测试和端到端测试。1.测试框架集成Spring测试模块与多个测试框架集成,最常用的是JUnit5和TestNG。JUnit5集成使用@ExtendWith(SpringExtension.class)注解来启用Spring测......
  • 推荐一个小而全的 Java 工具类库,再也不用重复造轮子,简直太优雅(带私活源码)
    上周接到老大的需求说让整理下工具类,新项目要用,本想直接拿以前的改改直接用的,结果发现以前的工具类存在很多问题,光加解密工具类就重复写了很多个。赶紧跑去找有经验的同事商量对策,最终在Github上找到Hutool这款神器。简介Hutool是一个小而全的Java工具类库,通过静态......
  • Java--hashmap如何根据value排序
    java中map根据value排序在Java中,Map是一种非常常用的数据结构,它通过键值对的形式存储数据,Map本身是无序的,但是在实际应用中,我们有时需要根据Map的值来进行排序,本文将介绍如何使用Java中的Map来实现根据Value排序。Map转TreeMap在Java中,可以使用TreeMap来根据HashMap的值......
  • JavaWeb笔记整理+图解——Filter过滤器
    欢迎大家来到这一篇章——Filter过滤器监听器和过滤器都是JavaWeb服务器三大组件(Servlet、监听器、过滤器)之一,他们对于Web开发起到了不可缺少的作用。ps:想要补充Java知识的同学们可以移步我已经完结的JavaSE笔记,里面整理了大量详细的知识点和图解,可以帮你快速掌握Java编程的......
  • Spire.Office for Java 9.5.0 is released
    Spire.OfficeforJavaisacombinationofEnterprise-LevelOfficeJavaAPIsofferedbyE-iceblue.ItincludesSpire.DocforJava,Spire.XLSforJava,Spire.PresentationforJava,Spire.PDFforJavaandSpire.BarcodeforJava.DeveloperscanuseSpire.Off......
  • Java面试进阶指南:高级问题与解答精粹(一)
    Java面试问题及答案1.什么是Java内存模型(JMM)?它的作用是什么?答案:Java内存模型(JMM)是一个抽象的概念,它定义了Java程序中各种变量(线程共享变量)的访问规则,以及在并发环境下如何保证这些变量的可见性、原子性和有序性。JMM的作用是确保在并发编程中,不同线程之间对共享变量的操......
  • Java面试进阶指南:高级问题与解答精粹(二)
    Java面试问题及答案1.什么是Java内存模型(JMM)?请简述它的作用。答案:Java内存模型(JMM)是一个抽象的概念,它定义了Java程序中各种变量(线程共享变量)的访问规则,以及在并发环境下如何保证数据的一致性。JMM规定了线程如何与主内存(所有线程共享的内存)交互,以及如何通过工作内存(每个......
  • Java进阶指南:高级面试问题与精辟解答(一)
    Java面试问题及答案1.请解释什么是Java内存模型(JMM)?它在并发编程中扮演什么角色?答案:Java内存模型(JMM)是一个抽象的内存模型,它定义了Java程序中变量的访问规则,以及在并发环境下如何保证内存操作的原子性、可见性和有序性。JMM确保了在多线程环境下,不同线程间对共享变量的......