当前位置:文档之家› 网络爬虫课程设计文档

网络爬虫课程设计文档

网络爬虫网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。

传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。

简单来说,网络爬虫的基本工作流程可以分为如下几步:1.首先选取一部分精心挑选的种子URL;2.将这些URL放入待抓取URL队列;3.从待抓取URL队列中取出待抓取URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。

此外,将这些URL放进已抓取URL队列。

4.分析已抓取URL队列中的URL,并且将URL放入待抓取URL队列,从而进入下一个循环。

对URL的认识爬虫最主要的处理对象就是URL,它根据URL地址取得所需要的文件内容,然后对它进行进一步的处理。

因此,准确地理解URL对理解网络爬虫至关重要。

URL:统一资源定位符,是Internet 上描述信息资源的字符串。

URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL 的格式由三部分组成:第一部分是协议(或称为服务方式)。

第二部分是存有该资源的主机IP地址(有时也包括端口号)。

第三部分是主机资源的具体地址,如目录和文件名等。

第一部分和第二部分用“://”符号隔开,第二部分和第三部分用“/”符号隔开。

第一部分和第二部分是不可缺少的,第三部分有时可以省略。

1.HTTP 协议的URL 示例使用超级文本传输协议HTTP,提供超级文本信息服务的资源。

例:/channel/welcome.htm。

其计算机域名为。

超级文本文件(文件类型为.html)是在目录/channel 下的welcome.htm。

这是中国人民日报的一台计算机。

例:/talk/talk1.htm。

其计算机域名为。

超级文本文件(文件类型为.html)是在目录/talk 下的talk1.htm。

2.文件的URL用URL表示文件时,服务器方式用file表示,后面要有主机IP 地址、文件的存取路径(即目录)和文件名等信息。

有时可以省略目录和文件名,但“/”符号不能省略。

例:file:///pub/files/foobar.txt。

代表存放在主机 上的pub/files/目录下的一个文件,文件名是foobar.txt。

例:file:///pub。

代表主机 上的目录/pub。

例:file:///。

代表主机 的根目录。

通过URL抓取网页1.抓取单个网页所谓网页抓取,就是把URL 地址中指定的网络资源从网络流中读取出来,保存到本地。

类似于使用程序模拟IE 浏览器的功能,把URL 作为HTTP 请求的内容发送到服务器端,然后读取服务器端的响应资源。

Java网页抓取Java 语言把网络资源看成是一种文件,它对网络资源的访问和对本地文件的访问一样方便。

它把请求和响应封装为流。

因此我们可以根据相应内容,获得响应流,之后从流中按字节读取数据。

例如,.URL 类可以对相应的Web服务器发出请求并且获得响应文档。

.URL 类有一个默认的构造函数,使用URL 地址作为参数,构造URL 对象:URL pageURL = new URL(path);接着,可以通过获得的URL对象来取得网络流,进而像操作本地文件一样来操作网络资源:InputStream stream = pageURL.openStream()。

HttpClientGet方法在实际的项目中,网络环境比较复杂。

因此,只用 包中的API来模拟IE客户端的工作,会产生很大的代码量。

需要处理HTTP返回的状态码,设置HTTP代理,处理HTTPS 协议等工作。

为了便于应用程序的开发,实际开发时常常使用Apache 的HTTP客户端开源项目——HttpClient。

它完全能够处理HTTP 连接中的各种问题,使用起来非常方便。

只需在项目中引入HttpClient.jar 包,就可以模拟IE 来获取网页内容。

例如://创建一个客户端,类似于打开一个浏览器HttpClient httpclient=new HttpClient();//创建一个get 方法,类似于在浏览器地址栏中输入一个地址GetMethod getMethod=new GetMethod("");//回车,获得响应状态码int statusCode=httpclient.executeMethod(getMethod);//查看命中情况,可以获得的东西还有很多,比如head、cookies 等System.out.println("response=" + getMethod.getResponseBodyAsString());//释放getMethod.releaseConnection();在这个示例中,只是简单地把返回的内容打印出来,而在实际项目中,通常需要把返回的内容写入本地文件并保存。

最后还要关闭网络连接,以免造成资源消耗。

此例是用get 方式来访问Web 资源。

通常,get 请求方式把需要传递给服务器的参数作为URL的一部分传递给服务器。

但是,HTTP协议本身对URL字符串长度有所限制。

因此不能传递过多的参数给服务器。

Post方法为了避免上述问题,通常情况下,采用post方法进行HTTP请求,HttpClient包对post 方法也有很好的支持。

例如://得到post 方法PostMethod PostMethod = new PostMethod("/postme");//使用数组来传递参数NameValuePair[] postData = new NameValuePair[2];//设置参数postData[0] = new NameValuePair("武器", "枪");postData[1] = new NameValuePair("什么枪", "神枪");postMethod.addParameters(postData);//回车,获得响应状态码int statusCode=httpclient.executeMethod(getMethod);//查看命中情况,可以获得的东西还有很多,比如head、cookies 等System.out.println("response=" + getMethod.getResponseBodyAsString());//释放getMethod.releaseConnection();上面的例子说明了如何使用post方法来访问Web 资源。

与get方法不同,post方法可以使用NameValuePair来设置参数,因此可以设置“无限”多的参数。

而get方法采用把参数写在URL里面的方式,由于URL有长度限制,因此传递参数的长度会有限制。

上面介绍了一个比较简单的网页抓取示例,由于互联网的复杂性,真正的网页抓取程序会考虑非常多的问题。

比如,资源名的问题,资源类型的问题,状态码的问题。

而其中最重要的就是针对各种返回的状态码的处理。

这里就不详细介绍了,有兴趣的可以查阅资料(自己动手写网络爬虫.pdf)。

2.抓取多个网页我们平时要搜索的信息通常都要经过好几个页面跳转才能得到,虽然这当中的跳转我们感受不到。

因此,在实际的应用中,设计的网络爬虫应能够顺着超链接大面积地爬行万维网(Web),并且将网页信息抓取下来。

所以,从网页上抓取超链接是网络爬虫自主扩大访问范围的必要操作,是网络爬虫自主和自动进行的。

那么爬虫程序是如何遍历互联网,把网页全部抓取下来的呢?互联网可以看成一个超级大的“图”,而每个页面可以看作是一个“节点”。

页面中的链接可以看成是图的“有向边”。

因此,能够通过图的遍历的方式对互联网这个超级大“图”进行访问。

1.单线程抓取在爬虫系统中,待抓取URL队列是很重要的一部分。

待抓取URL队列中的URL以什么样的顺序排列也是一个很重要的问题。

因为这涉及到先抓取那个页面,后抓取哪个页面。

而决定这些URL排列顺序的方法,叫做抓取策略。

下面重点介绍几种常见的抓取策略:1.深度优先遍历策略深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。

我们以下面的图为例:遍历的路径:A-F-G E-H-I B C D2.宽度优先遍历策略宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取URL 队列的末尾。

也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。

还是以上面的图为例:遍历路径:A-B-C-D-E-F G H I2.多线程(分布式)抓取一般来说,抓取系统需要面对的是整个互联网上数以亿计的网页。

单个抓取程序不可能完成这样的任务。

往往需要多个抓取程序一起来处理。

常见的抓取系统往往是一个分布式的三层结构。

最下一层是分布在不同地理位置的数据中心,在每个数据中心里有若干台抓取服务器,而每台抓取服务器上可能部署了若干套爬虫程序。

这就构成了一个基本的分布式抓取系统。

对于一个数据中心内的不同抓取服务器,协同工作的方式有几种:1.主从式(Master-Slave)有一台专门的Master服务器来维护待抓取URL队列,它负责每次将URL分发到不同的Slave服务器,而Slave服务器则负责实际的网页下载工作。

Master服务器除了维护待抓取URL队列以及分发URL之外,还要负责调解各个Slave服务器的负载情况。

以免某些Slave服务器过于清闲或者劳累。

这种方式对Master服务器的负担较大。

2.对等式(Peer to Peer)在这种模式下,所有的抓取服务器在分工上没有不同。

每一台抓取服务器都可以从待抓取在URL队列中获取URL,然后对该URL的主域名的hash值H,然后计算H mod m(其中m是服务器的数量),计算得到的数就是处理该URL的主机编号。

举例:假设对于URL ,计算器hash值H=8,m=3,则H mod m=2,因此由编号为2的服务器进行该链接的抓取。

假设这时候是0号服务器拿到这个URL,那么它将该URL转给服务器2,由服务器2进行抓取。

这种模式有一个问题,当有一台服务器死机或者添加新的服务器,那么所有URL的哈希求余的结果就都要变化。

也就是说,这种方式的扩展性不佳。

针对这种情况,又有一种改进方案被提出来。

这种改进的方案是一致性哈希法来确定服务器分工。

一致性哈希将URL 的主域名进行哈希运算,映射为一个范围在0-232之间的某个数。

相关主题