artadonis 2016-04-17 05:47 采纳率: 0%
浏览 1492

用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 2016-04-19 09:24
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?