爬蟲--[HttpClient]

爬蟲技術能夠獲取互聯網上開放的網頁文檔或其餘文檔,在java中HttpClient是比較好用的模擬請求和爬蟲組件javascript

下面看一個簡單的職位爬去的實例:html

1 下載HttpClientjava

   最新HttpClient版本是4.x,咱們能夠去官網下載,本章所用版本爲:commons-httpclient-3.0.1.jarnode

   這是它的核心包,可是要編寫一個完整的爬蟲應用,它還須要依賴以下:apache

2 使用HttpClient進行模擬請求數組

   2.1 建立HttpClient對象:服務器

         HttpClient httpClient=new HttpClient();cookie

   2.2 經過get或post方式請求頁面:session

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

         假如是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();
	}
}
相關文章
相關標籤/搜索