2 qq 34452161 qq_34452161 于 2016.04.17 13:47 提问

用Java来抓取网页实例中HttpClient类的问题

报这么一大堆错误我也是受不了了......

主要的问题应该是HttpClient类这个东西,在网上查了这个类是httpclient-2.x.jar包的产物,我导入的是httpclient-4.2.2.jar和httpcore-4.2.2.jar包,而这两个新的工具包并不包含HttpClient类,查阅了Java API帮助文档后,自己并没有找到HttpClient类的替代类,而是一堆接口和抽象类,由于是刚开始写这个,所以有点懵。

所以求助大神么,这个应该怎么处理,如果是可以替换,用哪个类或者接口呢?

图片说明

图片说明

图片说明

图片说明
Java网页抓取示例代码:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;

public class RetrivePage {
private static HttpClient httpClient = new HttpClient();
// 设置代理服务器
static {
// 设置代理服务器的IP地址和端口
httpClient.getHostConfiguration().setProxy("172.17.18.84", 8080);
}

public static boolean downloadPage(String path) throws HttpException,
        IOException {
    InputStream input = null;
    OutputStream output = null;
    // 得到post方法
    PostMethod postMethod = new PostMethod(path);
    // 设置post方法的参数
    /*
     * NameValuePair[] postData = new NameValuePair[2]; postData[0] = new
     * NameValuePair("name","lietu"); postData[1] = new
     * NameValuePair("password","*****");
     * postMethod.addParameters(postData);
     */
    // 执行,返回状态码
    int statusCode = httpClient.executeMethod(postMethod);
    // 针对状态码进行处理 (简单起见,只处理返回值为200的状态码)
    if (statusCode == HttpStatus.SC_OK) {
        input = postMethod.getResponseBodyAsStream();
        //得到文件名
        String filename = path.substring(path.lastIndexOf('/')+1);
        //获得文件输出流
        output = new FileOutputStream(filename);
        //输出到文件
        int tempByte = -1;
        while((tempByte=input.read())>0){
            output.write(tempByte);
        }
        //关闭输入输出流
        if(input!=null){
            input.close();
        }
        if(output!=null){
            output.close();
        }
        return true;
    }
    //若需要转向,则进行转向操作
    if ((statusCode == HttpStatus.SC_MOVED_TEMPORARILY) || (statusCode == HttpStatus.SC_MOVED_PERMANENTLY) || (statusCode == HttpStatus.SC_SEE_OTHER) || (statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
        //读取新的URL地址
        Header header = postMethod.getResponseHeader("location");
        if(header!=null){
            String newUrl = header.getValue();
            if(newUrl==null||newUrl.equals("")){
                newUrl="/";
                //使用post转向
                PostMethod redirect = new PostMethod(newUrl);
                //发送请求,做进一步处理。。。。。
            }
        }
    }
    return false;
}

/**
 * 测试代码
 */
public static void main(String[] args) {
    // 抓取lietu首页,输出
    try {
        RetrivePage.downloadPage("http://www.lietu.com");
    } catch (HttpException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}


3个回答

Ripin_Yan
Ripin_Yan   2016.04.19 17:24

需要的jar是commons-httpclient-3.x.jar

yuanlintufang
yuanlintufang   2016.07.25 16:55

问一下题主,这个方法能捕获带有ajax请求的页面代码么?

qy20115549
qy20115549   2016.08.14 13:46

网络爬虫之java基础【maven的使用】
需要引入jar包,在ecliplse中,可以使用maven引入jar包,操作轻松简单。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!