2 yzn77 yzn77 于 2016.05.03 18:36 提问

网络爬虫下载网页的问题

下载网页时只能下载第一个网页,后续网页虽然能爬出来,但是无法下载到本地。下载网页的代码如下
public class FileDownLoader {
/**根据 url 和网页类型生成需要保存的网页的文件名
去除掉 url 中非文件名字符
*/
public String getFileNameByUrl(String url,String contentType)
{
url=url.substring(7);//remove http://
if(contentType.indexOf("html")!=-1)//text/html
{
url= url.replaceAll("[\?/:
|<>\"]", "_")+".html";
return url;
}
else//如application/pdf
{
return url.replaceAll("[\?/:*|<>\"]", "_")+"."+

      contentType.substring(contentType.lastIndexOf("/")+1);
    }   
}

/**保存网页字节数组到本地文件
 * filePath 为要保存的文件的相对地址
 */
private void saveToLocal(byte[] data,String filePath)
{
    try {
        DataOutputStream out=new DataOutputStream(

new FileOutputStream(new File(filePath)));
for(int i=0;i<data.length;i++)
out.write(data[i]);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/*下载 url 指向的网页*/
public String  downloadFile(String url)
{
      String filePath=null;


     /* 使用 GetMethod 来访问一个 URL 对应的网页,需要如下一些步骤。
      1 生成一个 HttpClinet 对象并设置相应的参数。
      2 生成一个 GetMethod 对象并设置响应的参数。
      3 用 HttpClinet 生成的对象来执行 GetMethod 生成的 Get 方法。
      4 处理响应状态码。
      5 若响应正常,处理 HTTP 响应内容。
      6 释放连接*/
      /* 1.生成 HttpClinet 对象并设置参数*/
      HttpClient httpClient=new HttpClient();
      //设置 Http 连接超时 5s
          httpClient.getHttpConnectionManager().getParams().

setConnectionTimeout(5000);

      /*2.生成 GetMethod 对象并设置参数*/
      //使用 GetMethod 来访问一个 URL 对应的网页
      GetMethod getMethod=new GetMethod(url);    
      //设置 get 请求超时 5s
      getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT,5000);
      //设置请求重试处理,用的是默认的重试处理:请求三次
      getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
        new DefaultHttpMethodRetryHandler());

      /*3.执行 HTTP GET 请求*/
      try{ 
          /*executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,
          该状态码能表示出该方法执行是否成功,需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)*/
          int statusCode = httpClient.executeMethod(getMethod);
          //判断访问的状态码
          if (statusCode != HttpStatus.SC_OK) 
          {

System.err.println("Method failed: "+ getMethod.getStatusLine());
filePath=null;
}

          /*4.处理 HTTP 响应内容(返回的状态码正确后,即可取得内容)*/
          /*取得目标地址的内容有三种方法:
          1 getResponseBody,该方法返回的是目标的二进制的byte流;
          2 getResponseBodyAsString,返回的是String类型,值得注意的是该方法返回的String的编码是根据系统默认的编码方式,所以返回的String值可能编码类型有误
          3 getResponseBodyAsStream,这个方法对于目标地址中有大量数据需要传输是最佳的。
                  在这里我们使用了最简单的getResponseBody方法。*/

byte[] responseBody = getMethod.getResponseBody();//读取为字节数组
//根据网页 url 生成保存时的文件名
filePath="E:\java\web spider\"+getFileNameByUrl(url,
getMethod.getResponseHeader("Content-Type").getValue());
saveToLocal(responseBody,filePath);
} catch (HttpException e) {
// 发生致命的异常,可能是协议不对或者返回的内容有问题
System.out.println("Please check your provided http address!");
e.printStackTrace();
} catch (IOException e) {
// 发生网络异常
e.printStackTrace();
} finally {
// 释放连接
getMethod.releaseConnection();

}
return filePath;
}
}
调用他的爬行代码如下:
public class Crawler {
/* 使用种子 url 初始化 URL 队列*/
String results="";
private void initCrawlerWithSeeds(String[] seeds)
{
for(int i=0;i<seeds.length;i++)
LinkDB.addUnvisitedUrl(seeds[i]);
}

/* 爬取方法*/
public void crawling(String[] seeds,JTextArea kkk)
{
    LinkFilter filter = new LinkFilter(){
        //提取以 用户输入的URL开头的链接
        public boolean accept(String url) {
            if(url.startsWith(url))
                return true;
            else
                return false;
        }
    };
    //初始化 URL 队列
    initCrawlerWithSeeds(seeds);
    //循环条件:待抓取的链接不空且抓取的网页不多于 1000
    while(!LinkDB.unVisitedUrlsEmpty()&&LinkDB.getVisitedUrlNum()<=1000)
    {
        //队头 URL 出对
        String visitUrl=LinkDB.unVisitedUrlDeQueue();
        if(visitUrl==null)
            continue;
        FileDownLoader downLoader=new FileDownLoader();
        //下载网页
        downLoader.downloadFile(visitUrl);
        //该 url 放入到已访问的 URL 中
        LinkDB.addVisitedUrl(visitUrl);
        //提取出下载网页中的 URL

        Set<String> links=HtmlParserTool.extractLinks(visitUrl,filter);
    Iterator<String> it = links.iterator(); //迭代器
        while(it.hasNext())
        {  
            results=results+'\n'+it.next();

        }

     kkk.setText(results);


    }
}

}
求各位大神帮忙解答,马上就要中期检查了

2个回答

devmiao
devmiao   Ds   Rxr 2016.05.04 07:12
已采纳
CSDNXIAOD
CSDNXIAOD   2016.05.03 18:41

网络爬虫下载网页
网络爬虫系列之一:通过URL下载网页
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
用python写网络爬虫-下载网页
开始学写爬虫啦,但是刚看书开头说本书以python2.7为案例讲解,很多模块未适配到python3.x,不过我看这本书的时候发现他说的很多没适配的模块基本都适配过来了,所以就决定用python3.6来写,正好体会下3和2的差别
《用Python写网络爬虫》示例网站访问不了导致的系列问题解决办法
由于这个示例网站现在打开不成功,导致书中的例子的具体实现遇到一些问题,在这里我根据我自己的学习进度与能力尽量解决我遇到的问题,在这里分享给需要的朋友,本博客持续更新 http://blog.csdn.net/dzkqstranger/article/details/72764946 首先解决访问网站的问题 1.4.2节访问的sitemap.xml网站的地址为:http://127.0.0.1:800
简单的网络爬虫设计——下载网页图片
闲着没事,想方便的看一些小网站,就打算动手写一个爬虫,根据使用了上一次写酷q的自动回复机器人封装的clientSocket类,至于为什么不用python,几行代码就可以做完的事,用C++写了200多行,因为觉得用C++造轮子挺有意思的,虽然我的C++用得很烂…….   做完这个后,我发现我对http的请求格式,有很大的误解,所以在上次写酷q请求数据的时候,http没有发送响应消息,就发了报文。
网络爬虫,爬指定网页的所有连接
简单网络爬虫,原理就是解析网页,取得所有a标签内容,当然只是demo,你可以自己编写规则。附一些测试,包括了从一个很好的电影网站下载电影种子的,还有百度新闻搜索等。
手把手教你写基于C++ Winsock的图片下载的网络爬虫
先来说一下主要的技术点: 1. 输入起始网址,使用ssacnf函数解析出主机号和路径(仅处理http协议网址) 2. 使用socket套接字连接服务器,,获取网页html代码(使用http协议的GET请求),然后使用正则表达式解析出图片url和其他的url。 3. 下载图片至创建的文件夹中,同时其他的url push进队列。 4. 为了使爬虫能够连续的工作,这里使用了BFS宽度优先搜索,也
网络爬虫系列之二:对下载页面进行链接解析
在我的上一篇博客中,通过URL就已经成功下载了第一个页面。然后我第二步的工作就是要通过这个已经下载好的页面得到更多的URL。 在这篇博客中主要完成了对页面中的链接进行解析,并将它们拼成可以访问的样子。更多细致的工作需要在后面进行完善。
Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫
如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 2016 04 我使用的 urllib 的版本:urllib2注意: 我没这里使用的是 Python2 ,而不是Python3一 . 简介编写网络爬虫的第一步就是下载网页,这个过程叫做
网络爬虫学习(1)
网络爬虫 网络爬虫是一个自动提取网页的程序, 它为搜索引擎从 Web 上下载网页, 是搜索引擎的重要组成部分。通用网络爬虫从一个或若干初始网页的 URL开始, 获得初始网页上的 URL列表; 在抓取网页的过程中, 不断从当前页面上抽取新的 URL放入待爬行队列,直到满足系统的停止条件。 主题网络爬虫 主题网络爬虫就是根据一定的网页分析算法过滤与主题无关的链接,保留主题相关的链接并将其放入
网络爬虫(c++)
网络爬虫 Crawler c++ 可以直接下载网页的
来,让我们写一个网络爬虫,下载页面上所有的照片吧!
什么是网络爬虫? 网络爬虫是一种非常有意思的程序。偌大的Internet,就像是一只蜘蛛织成的大网:一个个超级链接就是蛛丝,将无数页面连接起来,而网络爬虫,则会沿着一根根蛛丝,爬遍每一个节点…… 网络爬虫能干嘛? 蜘蛛在网上爬来爬去,当然不是为了健身。它会在网上寻觅猎物,捕捉它们,并拖回自己的窝里。 举一个例子:某天某日的清晨,老板突然让你将雪球网上所有的A股行情信息全部保存到