爬蟲技術能夠獲取互聯網上開放的網頁文檔或其餘文檔,在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(); } }