跳到主要內容

[PHP] 用 curl 來抓網路上的資料(三)

post 的方法跟 get 的方法也很相近, 但因為他的參數部份(即 get方法中
問號後面"變數名稱=值" 的部份),在傳遞的時候我們無法看到, 因此我們
無法知道它傳的參數為何 , 幸好, 有些工具可以使用。
在此我介紹 httpwatch, httpwatch 是一套商業軟體, 不是 freeware 所
以請購買合法軟體, 如果網友有人知道有功能相近的 freeware 可以介
紹給我, 我會把 httpwatch 換掉,此外 httpwatch 必須跟 IE 搭配使用
(Firefox 目前無法使用)。

安裝完 httpwatch 後, 在 IE 的瀏覽器列就會出現如下圖所示的按鈕






如果按下 httpwatch 的按鈕, 瀏覽器下方就會出現 httpwatch 的相關
工具, 如下圖











先在瀏覽器的網址列輸入你想要觀察的網址, 這裡我用
http://www.digitimes.com.tw 為例
接下來在下方 httpwatch 工具中, 按下 Record(見上圖紅色按鈕)
然後才在網頁中輸入要查詢的關鍵字
接下來就可以看到相關執行程式名稱及相關 POST 的變數
名稱及值, 如下圖所示










此例中, 他新聞搜尋的功能是執行了
http://www.digitimes.com.tw/search/display.asp
並且傳了四個參數 keyword, submit1, sFormDate, sToDate 及
他們的值 SATA, Go!, 2006/8/1,2006/10/31
得到這些參數接下來我們就可以開始使用 curl 用 POST 的方法來抓網頁的資料了
啟始 curl:
$ch = curl_init("http://www.digitimes.com.tw/search/display.asp");
curl_setopt($ch, CURLOPT_POST, 1); 如此才能使用 post 的 方法來
curl_setopt($ch, CURLOPT_POSTFIELDS,
"keyword=SATA
&submit1=Go!&sFormDate=2006/8/1&sToDate=2006/10/31");

用 CURLOPT_POSTFIELDS 此參數來給定要用 POST 傳的參數
注意: 參數跟參數間要用 "&" 來連接
最後再用 curl_exec($ch); 執行即可

留言

這個網誌中的熱門文章

用 NotebookLM AI 打造 Pikmin 蘑菇重生計算機

有玩《Pikmin Bloom》的玩家都知道,遊戲中的大蘑菇(例如「一般 神秘蘑菇」或「一般 紅色蘑菇」)被推毀後需要一段時間才會重生 。為了精準掌握下一次搶菇的時機,我決定透過 NotebookLM 的協助, 動手寫一個小工具:只要上傳包含挑戰剩餘時間(如「剩下20 分 47 秒」或「剩下1 小時 1 分 58 秒」)的遊戲截圖 ,系統就能自動推算出精確到秒的重生時間。 一開始我只上傳了一張 Pikmin 打菇的截圖, AI 就根據我的要求自動根據左上角的系統時間與圖中剩餘時間等資訊, 告訴我要安裝相關 OCR 套件, 並開發出第一個版本的程式, 這個程式已經大致完成了我的需求, 但離實用還有一小段距離, 所以在持續改進的開發過程中,我遇到了幾個有趣且經典的技術挑戰(對於這些影線處理, OCR, 圖片 EXIF info 等知識, 我是沒有太多的經驗, 但在 AI 一步一步的引導下完成了我的需求),在此與大家分享:  一、 影像預處理:拯救低迷的 OCR 辨識率 一開始,我直接將遊戲截圖丟給 Tesseract OCR 引擎,但辨識結果慘不忍睹。原因是遊戲畫面背景太過複雜(充滿草地、花朵與蘑菇發光特效) ,且文字是白色的。 為了解決這個問題,AI 引入了 OpenCV 進行影像預處理。先將圖片精準裁切,只保留左下角的血條與時間區域,接著轉為灰階並放大兩倍,最後使用二值化(經過測試閾值 200 得到不錯的效果)並反轉顏色。這個步驟成功將複雜的畫面轉換成 Tesseract 最容易辨識的「白底黑字」,大幅提升了準確率, 但在做更多的不同截圖的測試, 閾值 200 並不能成功轉換成 OCR 能辨識的黑白圖, 因此我請 AI 調整成以 200 為基礎, 如果辨識失敗, 在調整成 210, 190, 220, 180 如果都失敗才判定無法辨識(下圖是調整後的圖形)。  二、 對抗 OCR 的奇妙誤判與高容錯 Regex 解決了影像問題,接著是文字解析。遊戲字體中的無襯線數字「1」非常容易被誤判為英文字母 l、I、直線 |,甚至在辨識「1 小時」時被讀成 ]小時 。 為此,我設計了一套高容錯率的正規表達式 (Regex):(?:([0-9lIi|\]\[]+)\s*小?\s*時\s*)?(?:([0-9lIi|\]\[]+)\s*分\s*)?([0-9lIi...