文档章节

爬虫--[HttpClient]

Candy_Desire
 Candy_Desire
发布于 2014/11/06 10:59
字数 833
阅读 734
收藏 11

爬虫技术可以获取互联网上开放的网页文档或其他文档,在java中HttpClient是比较好用的模拟请求和爬虫组件

下面看一个简单的职位爬去的实例:

1 下载HttpClient

   最新HttpClient版本是4.x,我们可以去官网下载,本章所用版本为:commons-httpclient-3.0.1.jar

   这是它的核心包,但是要编写一个完整的爬虫应用,它还需要依赖如下:

2 使用HttpClient进行模拟请求

   2.1 创建HttpClient对象:

         HttpClient httpClient=new HttpClient();

   2.2 通过get或post方式请求页面:

         GetMethod getMethod=new GetMethod("http://www.51job.com");

         假如是post请求,那么就得使用:

         PostMethod postMethod=new PostMethod("http://www.51job.com");

   2.3 执行请求:

         httpClient.executeMethod(getMethod);

   2.4 得到返回的网页:

        String html=  getMethod.getResponseBodyAsString();

        假如网页非常大时,需要使用:

        getMethod.getResponseBodyAsStream();

        它返回一个InputStream,需要我们使用流读取出来

    2.5 释放请求连接:

         getMethod.releaseConnection();

3.参数,Header头部信息,cookie

  3.1  对于post请求(比如模拟登录),有时候需要传入请求参数,需要先构造一个参数数组:

        NameValuePair[] vnps=new NameValuePair[X];

        NameValuePair nvp=new NameValuePair("username","admin");

        NameValuePair nvp=new NameValuePair("password","admin");

        postMethod.setRequestBody(vnps);

   3.2 Header头部信息

        有些服务器会根据头部信息来做一些业务逻辑,假如我们在模拟请求时没有传入这些头部信息,可能

        不会达到我们想要的效果。

        这些头部信息不是随便写的,而是根据某种http分析工具得出的(比如httpwatch)

         getMethod.setRequestHeader("Accept-Language","zh-CN,en-US;q=0.7,ja;q=0.3");

         getMethod.setRequestHeader("Accept","application/javascript, */*;q=0.8");

         getMethod.setRequestHeader("Referer","http://www.baidu.com/");

         。。。

    3.3  Cookie

          有时候模拟请求也需要带入cookie信息(特别是需要使用session的时候),cookie本身也是一种头部:

           method.setRequestHeader("Cookie", " H_PS_PSSID=2994_2776_1428_2975_2977_2250_2542_2701");

           这个cookie也不是随便写的,是通过httpwatch分析出来的

            有时候对于登录之后的网页抓取,我们往往需要把之前请求时产生的cookie也一直保存,此时可以先得到之前请求后产生的cookie:

             Cookie[] cookies = httpClient.getState().getCookies();

             String tmpcookies="";

             for (Cookie c : cookies) {

tmpcookies += c.toString() + ";";

              }

          然后传入这些cookie:

          method.setRequestHeader("Cookie", tmpcookies);

   核心代码如下:

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;


public class JobCrawl {

public static void main(String[] args)throws Exception {
//创建一个Http请求的客户端 
HttpClient httpClient=new HttpClient();
   //创建一个Get方法的请求
GetMethod getMethod=new GetMethod("http://search.51job.com/list/%2B,%2B,%2B,%2B,%2B,%2B,java,2,%2B.html?lang=c&stype=1&image_x=30&image_y=18");
//执行请求
httpClient.executeMethod(getMethod);
//返回网页信息
String html=getMethod.getResponseBodyAsString();
   //转码
html=new String(html.getBytes("iso8859-1"),"gb2312");
Document doc=Jsoup.parse(html);
Elements elements=doc.select("a.jobname");
   for(int i=0;i<elements.size();i++){
    Element ele=elements.get(i);
    String url=ele.attr("href");
    GetMethod gm=new GetMethod(url);
    httpClient.executeMethod(gm);
    String detailJob=gm.getResponseBodyAsString();
    detailJob=new String(detailJob.getBytes("iso8859-1"),"gb2312");
    Utils.createFile("D:\\Workspaces\\HttpClientTest\\doc",i+".html", detailJob);
    Document job_doc=Jsoup.parse(detailJob);
    //职位名称
    String jobname=job_doc.select("td.sr_bt").get(0).text();
   
    //公司名称
    Element company_a=job_doc.select("table.jobs_1 a").get(0);
    String companyname=company_a.text();
   
    //职位职能
    Element target=job_doc.select("strong:contains(职位职能)").get(0);
    System.out.println(target.nextSibling());
    TextNode targetNode=(TextNode)target.nextSibling();
    String targetName=targetNode.text();
    System.out.println("职位名称: "+jobname);
    System.out.println("公司名称: "+companyname);
    System.out.println("职位职能: "+targetName);
    System.out.println("=====================================");
    //System.out.println(ele.text()+" "+ele.attr("href"));
   }
}

}
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;

public class Utils {

	public static void createFile(String directorpath, String fileName,
			String html) throws Exception {
		File director = new File(directorpath);
		if (!director.exists()) {
			director.mkdirs();
		}
		File f = new File(director.getAbsoluteFile() + File.separator
				+ fileName);
		System.out.println(fileName);
		if (!f.exists()) {
			f.createNewFile();
		}
		FileOutputStream fos = new FileOutputStream(f);
		FileWriter fw = new FileWriter(f);
		fw.write(new String(html));
		fw.close();
		fw = null;
		fos.close();
	}
}


© 著作权归作者所有

共有 人打赏支持
Candy_Desire
粉丝 31
博文 71
码字总数 84592
作品 0
浦东
产品经理
私信 提问
WebMagic爬虫实现登陆状态保存

由于WebMagic的网络请求是通过Apache HttpClient请求,只需要拿到该对象进行登陆处理,后续的请求再使用同一个HttpClient对象请求,即可实现登陆状态下的请求,登陆相关的cookies不需要自己进...

0x5f3759df
2018/12/23
0
0
apache HttpClient学习系列--1

这两天开始准备做一个自己的网络爬虫,所以就各种找资料,找到了一个资料,讲的挺好的,用的就是HttpClient来写的,就在apache上下了jar包,准备自己编写,但是硬是找不到对应的类。上了apa...

无情小白龙
2014/03/15
0
0
Android:HttpClient研究

HttpClient4 用法 由HttpClient3 升级到 HttpClient_4 必看 摘要:HttpClient程序包是一个实现了 HTTP 协议的客户端编程工具包,要想熟练的掌握它,必须熟悉HTTP协议。一个最简单的调用如下:...

boonya
2015/03/27
0
2
HttpClient以及整合SpringBoot

一、HttpClient 1.1、 前台系统访问后台接口的方式 两个系统间如何互相访问?两个tomcat上的项目如何互相访问 1.2、 什么是HttpClient 官网:http://hc.apache.org/index.html 现在也叫:Htt...

Armymans
2018/11/10
0
0
HttpComponents Client 4.5.4,Java 的 HTTP 协议库

HttpComponents Client 4.5.4 已发布,修复了一些发现自 4.5.3 的问题。要注意的是需要 Java 1.6 及以上版本。更新内容如下: [HTTPCLIENT-1883] SystemDefaultCredentialsProvider to use ...

王练
2017/12/05
925
3

没有更多内容

加载失败,请刷新页面

加载更多

网络编程

第14天 网络编程 今日内容介绍  网络通信协议  UDP通信  TCP通信 今日学习目标  能够辨别UDP和TCP协议特点  能够说出UDP协议下两个常用类名称  能够说出TCP协议下两个常用类名称...

stars永恒
42分钟前
1
0
二进制相关

二进制 众所周知计算机使用的是二进制,数字的二进制是如何表示的呢? 实际就是逢二进一。比如 2 用二进制就是 10。那么根据此可以推算出 5的二进制等于 10*10+1 即为 101。 在计算机中,负数以...

NotFound403
昨天
3
0
day22:

1、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务: 1)使用格式:getinterface.sh [-i interface | -I ip] 2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项...

芬野de博客
昨天
2
0
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少...

程序猿DD
昨天
4
0
Java并发编程:深入剖析ThreadLocal

ThreadLocal 的理解 ThreadLocal,很多地方叫线程本地变量,或线程本地存储。ThreadLocal为变量在每个线程中都创建了一个副本,每个线程可以访问自己内部的副本变量。===》解决的问题是线程间...

细节探索者
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部