多线程网页抓取程序的分析与改进.doc

上传人:新** 文档编号:561644833 上传时间:2023-07-12 格式:DOC 页数:19 大小:653KB
返回 下载 相关 举报
多线程网页抓取程序的分析与改进.doc_第1页
第1页 / 共19页
多线程网页抓取程序的分析与改进.doc_第2页
第2页 / 共19页
多线程网页抓取程序的分析与改进.doc_第3页
第3页 / 共19页
多线程网页抓取程序的分析与改进.doc_第4页
第4页 / 共19页
多线程网页抓取程序的分析与改进.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《多线程网页抓取程序的分析与改进.doc》由会员分享,可在线阅读,更多相关《多线程网页抓取程序的分析与改进.doc(19页珍藏版)》请在金锄头文库上搜索。

1、一、GetWeb类源代码分析通过对程序代码分析,绘制程序执行流程概要如下:详细功能流程图如下(为了便于理解程序执行过程,流程图中的变量标识与源代码中的变量名并不对应):u 详细功能流程图中变量标识与源代码中变量名的对应关系:流程图中的变量源程序中的变量数据类型(java)描述startURLstrHomePageString主页地址unProcessURLsarrUrlsArrayList未处理URL集合maxDeepwebDepthint最大爬虫深度DxxxURLdeepUrls中的value值int某URL的深度值threadNum创建抓取线程时的循环变量i int循环变量imaxThre

2、adintThreadNumint最大线程数u GetWeb类的主要字段和方法的功能概述字段摘要java.util.HashtableallUrls 存储所有URL的编号java.util.ArrayListarrUrl 存储所有URL供建立索引java.util.ArrayListarrUrls存储未处理的URLjava.lang.Stringcharset字符集, 默认为GB2312java.util.HashtabledeepUrls 存储URL的爬虫深度java.lang.StringfPath储存网页文件的目录名, 默认为webintintThreadNum最大线程数, 默认为10i

3、ntintWebIndex 网页文件对应下标, 从0开始java.lang.StringmyDomain 主页地址中的域名java.lang.Stringreport 网页抓取报告longstartTime 抓取开始时刻java.lang.StringstrHomePage主页地址, 即起始URLintwebDepth爬虫深度, 默认为2intwebFailed 抓取失败的URL计数intwebSuccessed 抓取成功的URL计数方法摘要voidaddReport(java.lang.String s)生成报告文件, 将内容s添加到报告文件中(多线程同步操作)voidaddWebFaile

4、d()抓取失败URL计数(多线程同步操作)voidaddWebSuccessed()抓取成功URL计数(多线程同步操作)java.lang.StringgetAUrl()从未处理URL集合中取一个URL, 并将这个URL从未处理URL集合中删除(多线程同步操作)java.lang.StringgetDomain()判断用户所提供URL是否为域名地址java.lang.IntegergetIntWebIndex()生成一个新的网页文件下标(多线程同步操作)java.lang.StringgetUrl()从所有URL集合中取一个URL, 并将这个URL从所有URL集合中删除(多线程同步操作)voi

5、dgetUrlByString(java.lang.String inputArgs, java.lang.String strUrl)提取网页文本中的URL链接(解析新的网页,提取其中含有的链接信息)voidgetWebByHomePage()由用户提供的域名站点开始,对所有链接页面进行抓取voidgetWebByUrl(java.lang.String strUrl, java.lang.String charset, java.lang.String fileIndex)抓取URL的网页文本并从中提取URL链接(对后续解析出的url进行抓取)程序运行时,根据用户输入的主页地址和最大爬虫深

6、度调用getWebByHomePage方法,首先将主页URL添加到arrUrl和allUrls队列中,为其分配初始编号0,并设置爬虫深度为1 ;然后调用getWebByUrl方法抓取主页内容,将其存入网页文件中,同时从抓回的网页文本中提取链接(使用getUrlByString方法)存入arrUrls队列和arrUrl队列中。同时在allUrls队列中为每个URL分配一个网页编号,在deepUrls中添加并设置每个URL的爬虫深度(父链接爬虫深度+1,这里为1+1=2)。接下来,循环创建10个抓取线程开始网页抓取。网页抓取线程不断从arrUrls队列中取出链接,抓取其网页内容。接着判断网页爬虫深

7、度若大于最大爬虫深度则继续从arrUrls中取新的URL进行抓取,否则,要从刚刚抓取到的网页文本中提取链接,存入arrUrls队列和arrUrl队列,在allUrls队列中为每个URL分配网页编号,在deepUrls中设置每个URL的爬虫深度。然后才从arrUrls中取新的URL进行抓取。值得强调的是,后续添加URL到arrUrls时,要判断这个URL是不是已经抓取过了,如果已经抓取过了就不再加入待抓取URL队列了。最终,当arrUrls队列中的URL全部被取完时,程序终止抓取,从arrUrl提取网页文件索引信息输出到文件fileindex.txt中。同时,在程序整个运行过程中,每一步的调试信

8、息都输出在report.txt文件中。二、存在问题及改进方法通过对所给程序代码分析,结合真实的Internet网络环境,我们不难看出该程序仍有以下几点不足:1程序从网页文本中提取URL时,只考虑了完整格式的URL的提取,而忽略了相对地址和绝对地址的提取。这显然是不符合实际情况的。因为大多数网站的站内链接大多为相对地址或绝对地址,这种链接占Internet链接中的很大一部分。虽然同一个站点的页面爬虫的抓取深度有限,但忽略站内所有相对链接和绝对链接会失去很多页面信息,造成抓取页面不完整,这对后期网页索引等工作是很不利的。完整格式的URL示例:Store绝对地址的URL示例:iPhone相对地址的U

9、RL示例:Mac因此,我们可以在getUrlByString方法中添加相应的代码来对从a标签href域中提取出的链接信息进行分析处理,使之能够抓取到相对地址和绝对地址指向的页面。但在提取链接信息时,同时也会提取到一些诸如:JavaScript(JavaScript脚本)、mailto(电子邮箱地址)、#(本页面)之类的信息,对于这些信息我们需要丢弃。2在通过URL抓取网页过程中,程序没有考虑不同的HTTP连接状态,如:访问的URL暂时无法提供服务(HTTP状态码503:Service Unavailable)。这种情况下,原来的程序似乎无能为力。对此,我们可以在getWebByUrl方法中添加

10、相应的代码来获取HTTP连接状态码,然后根据不同的状态,做出相应的处理。一般常见的状态码是:200(正常)、3XX(重定向)、403(禁止访问)、404(未找到页面)、503(服务暂不可用)。显然只有在状态码为200或3XX时,我们才需要抓取对应网页内容,其他情况均无需抓取。三、改进后程序流程如下是对程序改进部分的流程概要:1对相对地址和绝对地址的处理如下图左(因为不是匹配完整格式的网页,所以需要从匹配到的链接中去除JavaScript、mailto、#等无效链接)2处理HTTP连接的不同状态码如下图右注:其余部分代码功能与原程序基本相同,故未在下图中画出。四、改进后程序代码及运行结果说明Ge

11、tWeb.javaimport java.io.File;import java.io.BufferedReader;import java.io.FileOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .HttpURLConnection;import .MalformedURLException;import .URL;import java.util.Arr

12、ayList;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.util.Hashtable;/* * 网页抓取爬虫 * author unknown * 代码修改注释: * 1. 代码改动主要在getWebByUrl方法和getUrlByString方法中 * 2. 修改了getDomain方法使之变为通用的获取主机域名的方法 * 3. 添加了三个方法: * (1)getHomePage方法, 从指定URL中提取协议部分和主机部分(一般此部分即为站点主页地址) * (2)isRedirectSt

13、atusCode方法, 判断指定HTTP状态码是否为重定向状态码3XX * (3)toFullAddress方法, 将指定URL转换为完整格式的URL并返回 */public class GetWeb /* * 爬虫深度, 默认为2 */private int webDepth = 2;/* * 线程数,默认为10 */private int intThreadNum = 10;/* * 主页地址, 即起始URL */private String strHomePage = ;/* * 域名 */private String myDomain;/* * 储存网页文件的目录名, 默认为web */private String fPath = web;/* * 存储未处理URL */private ArrayList arrUrls = new ArrayList();/* * 存储所有URL供建立索引 */private ArrayList arrUrl = new ArrayList();/* * 存储所有URL的网页号 */private Hashtable allUrls = new Hashtable();/* * 存储所有URL的深度 */private Hashtable deepUrls = new Hashtable();/* * 网页对应文

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号