目的
如果我想知道張藝謀是誰役耕?我會去百度百科或維基百科搜索一下,那么百度百科或維基百科會返回張藝謀網(wǎng)頁結(jié)果。如果批量的去操作這種景馁,手動去搜索是很浪時間和人力的。于是斥难,我就寫了一個SearchWord程序枝嘶。
在百科上搜索張藝謀
介紹程序原理
其實(shí)我們?nèi)ピ跒g覽器里搜索一個詞條,然后點(diǎn)擊一下“進(jìn)入詞條”蘸炸,網(wǎng)頁會返回一個頁面躬络,用百度百科舉例如下:
搜索張藝謀結(jié)果頁面
那么我們用程序來做這樣一件事情,也是同樣的道理搭儒。具體步驟如下:
- 模擬一個虛擬瀏覽器(等同于我們電腦里安裝的瀏覽器)
- type 一個詞條(等同于我們在搜索框里輸入一個“張藝謀”)
- 觸發(fā)click事件(等同于我們在瀏覽器上點(diǎn)擊“進(jìn)入詞條”)
- 保存下返回的page頁面(等同于我們看到張藝謀這個頁面)
核心代碼
模擬生成瀏覽器
準(zhǔn)備htmlunit工具穷当,模擬生成webclient,生成瀏覽器代碼如下:
public static WebClient ConstructWebClient()
{
//set the Brower’s version
WebClient webClient = new WebClient(BrowserVersion.getDefault());
// set Brower support javascript和 css
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
// set Brower link time limit
webClient.getOptions().setTimeout(120000);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setAppletEnabled(false);
return webClient;
}
type and click
/**
* Search the word on WIKI
*/
HtmlForm form = page.getForms().get(0);
HtmlTextInput htmlTextInput = form.getInputByName("search");
htmlTextInput.setValueAttribute(word);
HtmlSubmitInput go = form.getInputByName("go");
resultPage = go.dblClick();
/**
* Enter the word on search
*/
HtmlForm form = page.getForms().get(0);
HtmlTextInput htmlTextInput = form.getInputByName("word");
htmlTextInput.setValueAttribute(word);
HtmlButton button = (HtmlButton) page.getElementById("search");
resultPage = button.click();
結(jié)束語
其實(shí)實(shí)現(xiàn)一個簡單功能是很容易的,但是要結(jié)構(gòu)化解析返回結(jié)果頁面還是一件很費(fèi)神的事情淹禾。