我觉得用java爬虫也不比phython差吧?

本文介绍了Java实现网络爬虫的基本技术和执行流程,包括使用正则表达式提取数据,广度优先遍历,以及如何通过多线程提升爬虫性能。通过一个飞机事故数据提取的实例,讲解了如何分析和处理数据,最后总结了爬虫过程中涉及的Java知识和数据收集的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


这一篇目的就是在于网络爬虫的实现,对数据的获取,以便分析

1. 网络爬虫基本技术处理

网络爬虫是数据采集的一种方法,实际项目开发中,通过爬虫做数据采集一般只有以下几种情况:

1) 搜索引擎

2) 竞品调研

3) 舆情监控

4) 市场分析

2. 网络爬虫的整体执行流程:

1) 确定一个(多个)种子网页

2) 进行数据的内容提取

3) 将网页中的关联网页连接提取出来

4) 将尚未爬取的关联网页内容放到一个队列中

5) 从队列中取出一个待爬取的页面,判断之前是否爬过。

6) 把没有爬过的进行爬取,并进行之前的重复操作。

7) 直到队列中没有新的内容,爬虫执行结束。

这样完成爬虫时,会有一些概念必须知道的:

1) 深度(depth):一般来说,表示从种子页到当前页的打开连接数,一般建议不要超过5层。

2) 广度(宽度)优先和深度优先:表示爬取时的优先级。建议使用广度优先,按深度的层级来顺序爬取。

Ⅰ在进行网页爬虫前,我们先针对一个飞机事故失事的文档进行数据提取的练习,主要是温习一下上一篇的java知识,也是为了下面爬虫实现作一个热身准备。

首先分析这个文档,

关于美国历来每次飞机失事的数据,包含时间地点、驾驶员、死亡人数、总人数、事件描述,一共有12列,第一列是标题,下面一共有5268条数据。

现在我要对这个文件进行数据提取,并实现一下分析:

根据飞机事故的数据文档来进行简单数据统计。

1)哪年出事故次数最多

2)哪个时间段(上午 8 – 12,下午 12 –18,晚上 18–24,凌晨 0–8 )事故出现次数最多。

3)哪年死亡人数最多

4)哪条数据的幸存率最高。

代码实现:(一切知识从源码获取!)

package com.plane;

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 飞机事故统计
 * @author k04
 *sunwengang
 *2017-08-11
 */
public class planeaccident {
        //数据获取存取链表
        private static List<String>  alldata=new ArrayList<>();

        public static void main(String args[]){
            getData("飞行事故数据统计_Since_1908.csv");
            alldata.remove(0);
            //System.out.println(alldata.size());
            //死亡人数最多的年份
            MaxDeadYear();
            //事故发生次数最多的年份
            MaxAccidentsYear();
            //事故各个时间段发生的次数
            FrequencyPeriod();
            //幸村率最高的一条数据
             MaximumSurvival();
        }

        /**
         * 从源文件爬取数据
         * getData(String filepath)
         * @param filepath
         */
        public static void getData(String filepath){
            File f=new File(filepath);
            //行读取数据
            try{
                BufferedReader br=new BufferedReader(new FileReader(f));
                String line=null;
                while((line=(br.readLine()))!=null){
                    alldata.add(line);
                }
                br.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        /**
         * 记录每年对应的死亡人数
         * @throws
         * 并输出死亡人数最多的年份,及该年死亡人数
         */
        public static void MaxDeadYear(){
            //记录年份对应死亡人数
            Map<Integer,Integer> map=new HashMap<>();
            //时间用date显示
            SimpleDateFormat sdf=new SimpleDateFormat("MM/dd/YYYY");
            //循环所有数据
            for(String data:alldata){
                //用逗号将数据分离,第一个是年份,第11个是死亡人数
                String[] strs=data.split(",");
                if(strs[0]!=null){
                    //获取年份
                    try {
                        Date date=sdf.parse(strs[0]);
                        int year=date.getYear();
                        //判断map中是否记录过这个数据
                        if(map.containsKey(year)){
                            //已存在,则记录数+该年死亡人数
                            map.put(year, map.get(year)+Integer.parseInt(strs[10]));
                        }else{
                            map.put(year, Integer.parseInt(strs[10]));
                        }

                    } catch (Exception e) {
                        // TODO Auto-generated catch block

                    }

                }
            }
            //System.out.println(map);

            //记录死亡人数最多的年份
            int max_year=-1;
            //记录死亡人数
            int dead_count=0;
            //用set无序获取map中的key值,即年份
            Set<Integer> keyset=map.keySet();
            //
            for(int year:keyset){
                //当前年事故死亡最多的年份,记录年和次数
                if(map.get(year)>dead_count&&map.get(year)<10000){
                    max_year=year;
                    dead_count=map.get(year);
                }
            }

            System.out.println("死亡人数最多的年份:"+(max_year+1901)+"   死亡人数:"+dead_count);
        }
        /**
         * 记录事故次数最多的年份
         * 输出该年及事故次数
         */
        public static void MaxAccidentsYear(){
            //存放年份,该年的事故次数
            Map<Integer,Integer> map=new HashMap<>();
            SimpleDateFormat sdf =new SimpleDateFormat("MM/dd/YYYY");
            //循环所有数据
            for(String data:alldata){
                String[] strs=data.split(",");
                if(strs[0]!=null){
                    try {
                        Date date=sdf.parse(strs[0]);
                        //获取年份
                        int year=date.getYear();
                        //判断是否存在记录
                        if(map.containsKey(year)){
                            //已存在记录,+1
                            map.put(year, map.get(year)+1);
                        }else{
            
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值