利用java怎么实现一个网页爬虫功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。爬虫实现原理网络爬虫基本技术处理网络爬虫是数据采集的一种方法,实际项目开发中,通过爬虫做数
利用java怎么实现一个网页爬虫功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
爬虫实现原理
网络爬虫基本技术处理
网络爬虫是数据采集的一种方法,实际项目开发中,通过爬虫做数据采集一般只有以下几种情况:
1) 搜索引擎
2) 竞品调研
3) 舆情监控
4) 市场分析
网络爬虫的整体执行流程:
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.*;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(); } 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(); } } 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{ map.put(year, 1); } } catch (Exception e) { // TODO Auto-generated catch block } } } //记录事故次数最多的年份 int max_year=0; //该年事故发生次数 int acc_count=0; //循环所有数据,获取事故次数最多的年份 Set<Integer> keyset=map.keySet(); for(int year:keyset){ if(map.get(year)>acc_count){ max_year=year; acc_count=map.get(year); } } //输出结果 System.out.println("事故次数最多的年份"+(max_year+1901)+" 该年事故发生次数:"+acc_count); } public static void FrequencyPeriod(){ //key为时间段,value为发生事故次数 Map<String,Integer> map=new HashMap<>(); //String数组存放时间段 String[] strsTime={"上午(6:00~12:00)","下午(12:00~18:00)","晚上(18:00~24:00)","凌晨(0:00~6:00)"}; //小时:分钟 SimpleDateFormat sdf=new SimpleDateFormat("HH:mm"); for(String data:alldata){ String[] strs=data.split(","); //判断时间是否记录,未记录则忽略 if(strs[1]!=null){ try { Date date=sdf.parse(strs[1]); //取得小时数 int hour=date.getHours(); //判断小时数在哪个范围中 int index=0; if(hour>=12&&hour<18){ index=1; }else if(hour>=18){ index=2; }else if(hour<6){ index=3; } //记录到map中 if(map.containsKey(strsTime[index])){ map.put(strsTime[index], map.get(strsTime[index])+1); }else{ map.put(strsTime[index], 1); } } catch (ParseException e) { } } } // 记录出事故最多的时间范围 String maxTime = null; // 记录出事故最多的次数 int maxCount = 0; Set<String> keySet = map.keySet(); for (String timeScope : keySet) { if (map.get(timeScope) > maxCount) { // 当前年就是出事故最多的年份,记录下年和次数 maxTime = timeScope; maxCount = map.get(timeScope); } } System.out.println("发生事故次数最多的时间段:"); System.out.println(maxTime+" : "+maxCount); } public static void MaximumSurvival(){ //存放事故信息以及该事故的幸村率 Map<String,Float> map=new HashMap<>(); //SimpleDateFormat sdf =new SimpleDateFormat("MM/dd/YYYY"); //事故幸存率=1-死亡率,第十一个是死亡人数,第十个是总人数 float survial=0; //循环所有数据 for(String data:alldata){ try{ String[] strs=data.split(","); //计算幸存率 float m=Float.parseFloat(strs[10]); float n=Float.parseFloat(strs[9]); survial=1-m/n; map.put(data, survial); }catch(Exception e){ } } //记录事故次数最多的年份 float max_survial=0; //幸存率最高的数据信息 String this_data="null"; //循环所有数据,获取事故次数最多的年份 Set<String> keyset=map.keySet(); for(String data:keyset){ if(map.get(data)>max_survial){ this_data=data; max_survial=map.get(data); } } System.out.println("幸存率最高的事故是:"+this_data); System.out.println("幸存率为:"+survial); } }
--结束END--
本文标题: 利用java怎么实现一个网页爬虫功能
本文链接: https://www.lsjlt.com/news/224229.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
2024-05-15
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0