今天秀批問我,能不能抓到某個網頁表單後的結果的內容
理所當然是先回答「當然可以!」才不會失掉男人的面子!
然後我看了一下到底要抓哪個網頁的表單…
http://www.npa.gov.tw/NPAGip/wSite/sp?xdUrl=/wSite/DatabaseQuery/Car/CarQuery.jsp&mp=1&ctNode=11936
沒想到居然是「內政部警政署警政治安全球資訊網」。
她要抓的這頁是查詢車輛是否違規的資料,理想是把表單再作回自己的網站,然後查詢也在自己的網站
得到的結果也是在自己的網站看到。
看起來是有那些一點困難是吧,不過對於常常抓網頁上資料的我,一點也不陌生。
困難的點在於…「」
有這個討人厭的驗證碼!
總之,先看看原始碼,大至上看到以下的表單內容:
<form action="sp?xdUrl=/wSite/DatabaseQuery/Car/CarDetail.jsp&ctNode=11936&mp=1" method="post">
<select name="VehType01" id="type">
<option value="A" selected="selected">汽車</option>
<option value="B">重機車</option>
<option value="C">輕機車</option>
</select>
<input name="VehNum01" id="PWD" class="InputTXT" size="15" ></label>
...
...
【驗證碼的圖】
<input name="j_captcha_response" id="InputPWD" type="text" class="InputTXT">
<input type="submit" value="送出查詢">
</form>
總之又看到了熟悉的 captcha
看到這個就覺得很簡單,應該有得破解了
馬上開 firefox 看這網頁,按右鍵看看詳細資料
一點都不意外,看到 JSESSIONID 了~
於是~在 PHP 的程式碼,就可以輕鬆的使用 curl 去作出一個讓程式碼去看網頁的功能
然後假裝讓程式碼看網頁,然後人工回答驗證碼,就可以讓程式碼成功下載人工回答結果的內容了。
上面的對話也許是像秀比這樣顧主所想的,那程式設計師的腦子卻得想出可行方法啊!?
好,程式先看懂圖
那就下載圖片來看吧~
$url= 'http://www.npa.gov.tw/NPAGip/jcaptcha';
$fp = fopen("npa.png","wb"); //存下來的圖片檔
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url_yzm);
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_COOKIEJAR, "/var/www/html/demo/php/npa.gov/cookie.txt"); //保存cookie
curl_setopt($curl, CURLOPT_COOKIEFILE, "/var/www/html/demo/php/npa.gov/cookie.txt"); //讀取cookie
ob_start();
//curl_exec ($ch);
//--- End buffering and clean output
curl_exec($curl);
$data=ob_get_contents();
ob_end_clean();
fwrite($fp, $data); //寫入圖片
fclose($fp);
抓圖也用了curl,因為為了背後所需要的 cookie
執行過後,你會發現圖也抓了,餅也生了
餅長這樣子~
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
www.npa.gov.tw FALSE /NPAGip FALSE 0 JSESSIONID 3A91D75992E4FDC1B15BEAC9EC3630D5
老實說我也看不懂這餅要幹嘛,反正抓到啥,就是當下的圖片對應資料^^
這餅的內容,要給下一次丟表單時用的
這時我們就即時流生了程式的表單,當然也要仿照原本網頁的內容
像 hidden 的值、mp、ctNode
還有很誇張的 01~100 setect 跟 text 的資料
當然放在自家的網站,就不用放那麼跨張的內容了
不過山人曾試過,如果你沒放,結果卻不能如預期的內容~
所以不必要的畫面內容,就直接 css display : none 藏起來吧
$url ="http://www.npa.gov.tw/NPAGip/wSite/sp?xdUrl=/wSite/DatabaseQuery/Car/CarDetail.jsp&ctNode=11936&mp=1";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
//curl_setopt($ch, CURLOPT_REFERER, $url);
//curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, "/var/www/html/demo/php/npa.gov/cookie.txt"); //設置cookie數據,從這地方再一次把剛才拿到的餅放進來
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
//echo http_build_query($_POST);
ob_start();
curl_exec($ch);
$data=ob_get_contents();
ob_end_clean();
curl_close($ch);
$new_data=get_between($data,"車輛竊盜、車牌失竊(含計程車)資料查詢結果","【注意事項】");
echo $new_data;
exit();
最後實作的結果,就成為山人網站裡的一個小小的服務了^^
http://3wa.tw/demo/php/npa.gov/
參考來源:http://blogold.chinaunix.net/u3/103755/showart_2401887.html