您的位置:首页 > 理论基础 > 计算机网络

网络舆情系统的开发

2014-07-17 10:30 183 查看

第一章 爬取网页

    这一章主要介绍如何爬取网页,在实际应用中,通常采用网络爬虫来快速抓取大量网页,存入本地硬盘内,开源的爬虫软件有很多,在开源中国中有详细的介绍,http://www.oschina.net/project/tag/64/spider。在这一版本的舆情监控系统中,暂时不采用这样庞大的爬虫,因为我们需要的信息量并不大,通过自己写的爬虫程序便可以抓取足够的网页信息,在这一章,我们将抓取以天涯论坛的网页,以这个抓取过程为例,编写爬虫软件,主要用到的技术是HttpClient技术和HtmlParser技术,主要的函数都封装在相应的jar包中,这些jar包都是开源的,可以在相关的网站下载到。本章的内容主要有两块,首先是学习如何下载网页并且保存到本地的磁盘中,然后学习如何连续抓取自己想要的网页,将在实践中学会抓取所需的网页,并且在本书的第二版将会介绍如何使用大型爬虫爬取网页。

1.1HttpClient

当来到程序和代码构建的世界,考虑问题的方式也要发生变化,对于一个网页可以很轻易的下载下来,这里指的是手工,但是对于成千上万的网页如何下载下来呢,思维比计算机和程序更加重要,因为你不断想着自动化的时候,不断思考如何用计算机代替手工劳动的时候,创造就会产生。当然,我们不会采用手工下载网页的办法,而是使用计算机程序代替我们的工作,所以你将要看到的是如何自动的下载网页。

在互联网中每一个ip地址都指向一台主机或是一台服务器,每一个url都代表了网络上的某一个资源,在互联网上,我们要遵守传输协议,正如在马路上要遵守基本的交通规则,HTTP(超文本传输协议)是我们必须要遵守的规则之一,这样才能够顺利的下载资源。

HttpClient是基于http协议开发的互联网交互程序,使用它可以进行资源的传输,可以进行通信。通常我们使用GET或者POST方法来进行通信,读取网页(HTTP/HTTPS)内容 ,下面是我们给出的一个简单的例子用来访问某个页面。 

package book;

 

import java.io.IOException;

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.methods.*;

 

/**

 * 最简单的HTTP客户端,用来演示通过GET方式访问某个页面

 * @author wangpeng

 */

public class SimpleClient {

public static void main(String[] args) throws IOException {

HttpClient client = new HttpClient();

// 使用GET方法

HttpMethod method = new GetMethod("http://bbs.tianya.cn/list-456-1.shtml");

client.executeMethod(method);

// 打印服务器返回的状态

System.out.println(method.getStatusLine());

// 打印返回的信息

System.out.println(method.getResponseBodyAsString());

// 释放连接

method.releaseConnection();

}

}

结果如下:

HTTP/1.1 200 OK

七月 14, 2014 8:42:59 下午 org.apache.commons.httpclient.HttpMethodBase getResponseBody

警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

 

//这一部分是网页的源代码,仅仅展示一部分作为例子

<!DOCTYPE HTML>

<html class="bbs-page">

<head>

<meta charset="utf-8">

<title>赣州_天涯论坛</title>

<meta name="keywords" content="赣州,华东,天涯,天涯论坛" />

<meta name="description" content="这是天涯论坛所属的赣州版块,共有42905个主帖,195602个回帖,1077个成员。客家风情:由客家方言到客家文化的特征与交融,在生活中点滴记录着。   缘来是你:交朋论友,天南地北让我们成为一家人。  清江茶楼:泡一杯香茗,倾述身边的酸甜苦辣。  宋城美食:私房菜、特色风味、美食情报、投诉报料的聚集地。  虔城互助:你的难题,我们一起来解决。" />

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

<meta http-equiv="mobile-agent" content="format=xhtml; url=http://m.tianya.cn/bbs/list.jsp?item=456" />

<link href="http://static.tianyaui.com/global/ty/TY.css" rel="stylesheet" type="text/css" />

<link href="http://static.tianyaui.com/global/bbs/web/static/css/bbs_c1bb67d.css" rel="stylesheet" type="text/css" />

<link rel="shortcut icon" href="http://static.tianyaui.com/favicon.ico" type="image/vnd.microsoft.icon" />

<Script>

var bbsGlobal = {

item : "456",

itemName : "赣州",

leftNavId : "44",

itemPermission : 1,

blocktype : "null",

 

isEhomeItem : false,

itemType : "城市",

isBanwu : false

};

     除此之外,我们还可以使用POST方法来对互联网上的资源进行访问,HttpMethod  method = new PostMethod("http://bbs.tianya.cn/list-456-1.shtml");

client.executeMethod(method);

package book;

 

import java.io.IOException;

import org.apache.commons.httpclient.*;

import org.apache.commons.httpclient.methods.*;

 

/**

 * 最简单的HTTP客户端,用来演示通过GET方式访问某个页面

 * @author wangpeng

 */

public class SimpleClient {

public static void main(String[] args) throws IOException {

HttpClient client = new HttpClient();

// 使用GET方法

HttpMethod method = new PostMethod("http://bbs.tianya.cn/list-456-1.shtml");

client.executeMethod(method);

// 打印服务器返回的状态

System.out.println(method.getStatusLine());

// 打印返回的信息

System.out.println(method.getResponseBodyAsString());

// 释放连接

method.releaseConnection();

}

}

结果是相同的。在这个例子中首先创建一个HTTP客户端(HttpClient)的实例,然后选择提交的方法是GET或者POST,最后在HttpClient实例上执行提交的方法,最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用HttpClient的基本流程。 HttpClient省去了很多复杂的流程,我们能更加容易的对互联网上的资源进行访问。你也许注意到了,HTTP/1.1 200 OK,200是状态码,标志着这次的访问被服务器成功相应,使用的协议是HTTP/1.1。当然,状态码可不仅仅只有一个200,还有很多,在下面我们将为您介绍各种状态码,程序要识别所有的状态码,然后对其进行处理,这样才能更加有效的对网络上面的资源进行访问。

有的时候,我们需要向网页提交参数,一般来说可以通过构建特定的url进行资源访问,比如要查询跟hello有关的帖子,只要创建这样一个链接就可以了,http://search.tianya.cn/bbs?q=hello,然后使用上述的POST或者GET方法进行资源的访问。结果如下:

HTTP/1.1 200 OK

七月 14, 2014 9:09:35 下午 org.apache.commons.httpclient.HttpMethodBase getResponseBody

警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.

 

<!DOCTYPE HTML>

<html>

<head>

<meta charset="utf-8">

<title>gh_搜帖子_天涯社区</title>

<meta name="description" content="" />

<meta name="keywords" content="" />

<meta name="generator" content="www.tianya.cn" />

<link href="http://static.tianyaui.com/global/ty/TY.css" rel="stylesheet" type="text/css" />

<link href="http://static.tianyaui.com/global/search/web/static/css/search_dffd416.css" rel="stylesheet" type="text/css" />

<link rel="shortcut icon" href="http://static.tianyaui.com/favicon.ico" type="image/vnd.microsoft.icon" />

<script type="text/javascript" charset="utf-8" src="http://static.tianyaui.com/global/ty/TY.js"></script>

</head>

<body>

 

<script type="text/javascript" charset="utf-8">TY.loader("TY.ui.nav",function(){TY.ui.nav.init ({topNavWidth: 1000,showBottomNav:false});});</script>

 

 

 

<div id="doc">

<div id="hd"></div>

<div id="bd" class="layout-lmr clearfix">

<div id="left">

<!-- 左侧菜单 -->

<!--  -->

<a class="leftLogo" href="/"  title="回到搜索首页"></a>

 

<ul class="tagSort left-mod">

<li class=hover id=search_bbs><a href="bbs?q=gh" class="l2">帖子</a></li>

 

<li class="tiezi">

<div class=on><a href="bbs?q=gh&f=0">按相关度</a></div>

<div ><a href="bbs?q=gh&s=4&f=0">按发帖时间</a></div>

<div ><a href="bbs?q=gh&s=6&f=0">按最新回复时间</a></div>

<div ><a href="bbs?q=gh&s=10&f=0">按回复数</a></div>

<div ><a href="bbs?q=gh&s=8&f=0">按点击数</a></div>

<div class=on><a href="bbs?q=gh&s=0&f=0">搜索全文</a></div>

<div ><a href="bbs?q=gh&s=0&f=3">搜索标题</a></div>

<div ><a href="bbs?q=gh&s=0&f=2">搜索作者</a></div>

</li>

是与hello相关话题的页面信息,这个url是查询与hello相关的帖子的列表。设定页面所需的参数。除了人工构建特殊的URL的方式,还可以使用设置参数的方式, 

client.getHostConfiguration().setHost("search.tianya.cn", 80, "http");  

        

        //使用GET方式提交数据  

        HttpMethod method =new  GetMethod("/bbs?q=hello");  

使用GET的请求方式,那么所有参数都直接放到页面的URL后面用问号与页面地址隔开,每个参数用&隔开即可。在这里可以设置主机、端口、传输协议。

程序如下:

public class SimpleHttpClient{  

    public static void main(String[] args) throws IOException    

    {    

        HttpClient client = new HttpClient(); 

        

 // 设置主机 端口 传输协议

        client.getHostConfiguration().setHost("search.tianya.cn", 80, "http");  

        

        //使用GET方式提交数据  

        HttpMethod method =new  GetMethod("/bbs?q=hello");  

        client.executeMethod(method); 

        

        //打印服务器返回的状态    

        System.out.println(method.getStatusLine());   

        

        //打印结果页面    

        String response =   new String(method.getResponseBodyAsString()); 

        

        //打印返回的信息    

        System.out.println(response);  

        

        //释放连接

        method.releaseConnection();    

    }    

    结果如下:

<li>

<div>

<h3><a href="http://bbs.tianya.cn/post-funinfo-3720897-1.shtml" target="_blank" >再也受不了办公室的奇葩经理了!!谁不知道<span class="kwcolor">Hello</span>意思是 你好!</a></h3>

<p>我们说了句"<span class="kwcolor">Hello</span>",我们办公桌都是背对着门的.以为是跟他打招呼呢,自然都没有回应.接着他说了句让我们全部人瞬间冰点瞬间觉得被羞辱还无力反驳的神句:"他在跟你们说 你好".... 整个办</p>

</div>

<p class="source">来自:<a href="http://bbs.tianya.cn/list-funinfo-1.shtml" target="_blank">娱乐八卦</a>

作者:<a href="http://www.tianya.cn/n/受不了奇葩经理" target="_blank">受不了奇葩经理</a>

时间:<span>2012-10-25 15:25</span>

回复:<span>454</span></p>

</li>

<li>

<div>

<h3><a href="http://bbs.tianya.cn/post-146-543784-1.shtml" target="_blank" >[你帮我助]提供 <span class="kwcolor">HELLO</span> KITTY 系列产品货源!欢迎索取资料!</a></h3>

<p>提供 <span class="kwcolor">HELLO</span> KITTY 系列产品货源,十件起批,可以混批,无金额限制.感兴趣的朋友请在这里留下你的联系方式或给我的电子邮箱发函索取相关资料.凡发电子邮件者一定回复! style1228@126.com</p>

</div>

<p class="source">来自:<a href="http://bbs.tianya.cn/list-146-1.shtml" target="_blank">自由职业</a>

作者:<a href="http://www.tianya.cn/n/龙在天涯1971" target="_blank">龙在天涯1971</a>

时间:<span>2007-03-21 15:37</span>

回复:<span>424</span></p>

</li>

这样的话,我们就可以根据天涯论坛里面提供的接口查询我们想要的信息,比如我们可以看到最近发生了什么事,大家关注最多的事等等。只要设定特殊的链接就可以了。比如:

查询主题按照相关度显示的url为:http://search.tianya.cn/bbs?q=%E6%9D%80%E4%BA%BA&f=0

查询主题按照发帖时间显示的url为:

http://search.tianya.cn/bbs?q=%E6%9D%80%E4%BA%BA&s=4&f=0

查询主题按照回复时间显示的url为:
http://search.tianya.cn/bbs?q=%E6%9D%80%E4%BA%BA&s=6&f=0
查询主题按照回复数显示的url为:

http://search.tianya.cn/bbs?q=%E6%9D%80%E4%BA%BA&s=10&f=0

查询主题按照点击数显示的url为:

http://search.tianya.cn/bbs?q=%E6%9D%80%E4%BA%BA&s=8&f=0

查询主题按照搜索主题显示的url为:
http://search.tianya.cn/bbs?q=%E6%9D%80%E4%BA%BA&s=8&f=3
 

我们的访问并不是一帆风顺,常常会遇到一些麻烦,比如服务器暂时停止了运转,或者网页上面设置了重定向,应用程序要去处理这些问题,从而让我们的程序更加健壮,程序要明白服务器的各种状态,要通过服务器返回的状态码来识别,下面详细介绍了服务器的各种状态码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息