简单的java爬取网站内容和url实例
网络爬虫
最近学习网络爬虫,对于开发小白的我,希望从今天开始记录自己的成长,加油吧
。
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取
网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整
个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。所以要想抓取网络上的数据,不仅需要爬虫程序还需要一个可以接
受”爬虫“发回的数据并进行处理过滤的服务器,爬虫抓取的数据量越大,对服务器的性能要求则越高。
1 聚焦爬虫工作原理以及关键技术概述
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上
的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析
算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上
述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚
焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:
(1) 对抓取目标的描述或定义;
(2) 对网页或数据的分析与过滤;
(3) 对URL的搜索策略。
分类
网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、
增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的。
网络爬虫的实现原理
根据这种原理,写一个简单的网络爬虫程序 ,该程序实现的功能是获取网站发回的数据,并提取之中的网址,获取的网址我们存放在一个文件夹中,关于如何就从网
站获取的网址进一步循环下去获取数据并提取其中其他数据这里就不在写了,只是模拟最简单的一个原理则可以,实际的网站爬虫远比这里复杂多,深入讨论就太多
了。除了提取网址,我们还可以提取其他各种我们想要的信息,只要修改过滤数据的表达式则可以。以下是利用Java模拟的一个程序,提取新浪页面上的链接,存放
在一个文件里
源代码如下
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* java实现爬虫
*/
public class SpiderDemo1 {
//爬取链接 http://www.8btc.com/what-is-blockchain
// String regex = "(http|https)://[\\w+\\.?/?]+\\.[A-Za-z]+";
public static void spiderURL(String url,String regex,String filename){
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String time=sdf.format(new Date());
URL realURL=null;
URLConnection connection=null;
BufferedReader br=null;
PrintWriter pw=null;
PrintWriter pw1=null;
Pattern pattern=Pattern.compile(regex);
try{
realURL=new URL(url);
connection=realURL.openConnection();
//connection.connect();
File fileDir = new File("E:/spider/"+time);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
//将爬取到的内容放到E盘相应目录下
pw = new PrintWriter(new FileWriter("E:/spider/"+time+"/"+filename+"_content.txt"),true);
pw1 = new PrintWriter(new FileWriter("E:/spider/"+time+"/"+filename+"_URL.txt"),true);
br=new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
pw.println(line);
Matcher matcher=pattern.matcher(line);
while(matcher.find()){
pw1.println(matcher.group());
}
}
System.out.println("爬取成功!");
}catch(Exception e){
e.printStackTrace();
}finally{
try {
br.close();
pw.close();
pw1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
String url="http://www.8btc.com/what-is-blockchain";
String regex= "(http|https)://[\\w+\\.?/?]+\\.[A-Za-z]+";
spiderURL(url,regex,"8btc");
}
}
运行main方法,在文件路径下看到生成的文件以及文件内容,如下: