我要开始学习爬虫啦

来源:互联网 发布:网站排名seo 编辑:程序博客网 时间:2024/05/14 22:05

什么是网络爬虫?

网络蜘蛛(Web spider)也叫网络爬虫(Web crawler)
[1]
,蚂蚁(ant),自动检索工具(automatic indexer),或者(在FOAF软件概念中)网络疾走(WEB scutter),是一种“自动化浏览网络”的程序,或者说是一种网络机器人。它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式。它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息。
网络爬虫始于一张被称作种子的统一资源地址(URLs)列表。当网络爬虫访问这些统一资源定位器时,它们会甄别出页面上所有的超链接,并将它们写入一张"待访列表",即所谓"爬行疆域"(crawl frontier)。此疆域上的统一资源地址将被按照一套策略循环访问。如果爬虫在他执行的过程中复制归档和保存网站上的信息,这些档案通常储存,使他们可以被查看。阅读和浏览他们的网站上实时更新的信息,并保存为网站的“快照”。大容量的体积意味着网络爬虫只能在给定时间内下载有限数量的网页,所以要优先考虑其下载。高变化率意味着网页可能已经被更新或者删除。一些被服务器端软件生成的URLs(统一资源定位符)也使得网络爬虫很难避免检索到重复内容。 
通俗的讲就是:
把别人网站的信息弄到自己的电脑上,再做一些过滤,筛选,归纳,整理,排序等等,如果数据量足够大,算法足够好,能给别人提供优质的检索服务,就可以做成类似google或baidu了

学习爬虫的基础:

首先得有一个编程语言的基础,Java?PHP?Python?JavaScript等都可以用来写爬虫吧;他们几个各有各的优点和缺点;本人对Java和JS比较熟悉,Python的话还属于菜鸟级别,PHP没用过,所以选择Java来做爬虫。
网络编程的基础:首先你得知道什么是Http协议吧,什么是URL吧,什么是重定向,什么是IO,NIO。等等,当然不会也没关系,可以一边做爬虫一边去了解。
算法的基础:当然不会也没关系,可以变做变学。
为什么要学习爬虫啦?
你不觉得开几个服务器,抓取一下别人网站的信息,然后再进行分析很有趣吗,很刺激吗,很酷吗。我觉得这比你打LOL,守望先锋会更有意思。
URL:
URL是Uniform Resource Location的缩写,译为“统一资源定位符”。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上,特别是著名的Mosaic。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。
URL的格式URL的格式由下列三部分组成:
第一部分是协议(或称为服务方式);
第二部分是存有该资源的主机IP地址(有时也包括端口号);
第三部分是主机资源的具体地址。,如目录和文件名等。
第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。 
文件的URL:
用URI表示文件时,服务器方式用file表示,后面要有主机IP地址,文件的存储路径(目录)和文件名等信息;

爬虫的原理

爬虫的原理相对简单,其爬取网页的基本步骤大致如下:

1) 人工给定一个URL 作为入口,从这里开始爬取。

万维网的可视图呈蝴蝶型,网络爬虫一般从蝴蝶型左边结构出发。这里有一些门户网站的主页,而门户网站中包含大量有价值的链接。

2) 运行队列完成队列来保存不同状态的链接。

    对于大型数据量而言,内存中的队列是不够的,通常采用数据库模拟队列。用这种方法既可以进行海量的数据抓取,还可以拥有断点续抓功能。

3) 线程从运行队列读取队首URL ,如果存在,则继续执行,反之则停止爬取。

4) 每处理完一个URL ,将其放入完成队列,防止重复访问。

5) 每次抓取网页之后分析其中的URL,将经过过滤的合法链接写入运行队列,等待提取。

简单的爬虫:

public class UrlReptile {private static HttpClient httpClient = new HttpClient(); // 创建一个代理服务器/*static {// 设置代理服务器的IP和端口httpClient.getHostConfiguration().setProxy("172.16.1.32",8080);}*/public static boolean downLoadPage(String path) throws IOException {// 创建输入输出流InputStream inputStream = null;OutputStream outputStream = null;/*// 得到post方法PostMethod postMethod = new PostMethod(path);*///得到get方法GetMethod getMethod=new GetMethod(path);// 设置post方法的参数/*NameValuePair[] postData = new NameValuePair[2];postData[0] = new NameValuePair("name", "baidu");postData[1] = new NameValuePair("password", "******");postMethod.addParameters(postData);*/try {// 执行返回状态码int statusCode = httpClient.executeMethod(getMethod);// 处理状态吗if (statusCode == HttpStatus.SC_OK) { // 200表示成功// 得到输入流inputStream = getMethod.getResponseBodyAsStream();// 得到文件名String fileName = path.substring(path.lastIndexOf('/')+1)+ ".html";// 得到输出流outputStream = new FileOutputStream(fileName);// 输出到文件int tByte = -1;while ((tByte = inputStream.read()) > 0) {outputStream.write(tByte);}}return true;} catch (Exception e) {e.printStackTrace();} finally {// 关闭流inputStream.close();outputStream.close();}return false;}public static void main(String[] args) {// 抓取CSDN首页,输出try {UrlReptile.downLoadPage("http://www.csdn.net/");} catch (Exception e) {}}}
上例是一个简单的爬虫,把CSDN的首页内容爬取到我们的HTML文件里面来了。
主要是用到了HttpClient设置代理服务器,访问Web资源,并通过输入,输出流加载到我们本地。
这是一个很简单的网页抓取实例,由于互联网的复杂性,真正的网页抓取会考虑非常多的问题。比如,资源名的问题,资源类型的问题,状态码的问题,网站防抓取的问题。等等,以后会慢慢的深入。




1 0