文章目录
这一篇目的就是在于网络爬虫的实现,对数据的获取,以便分析。
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{