2011年11月15日 星期二

[pyquery] 抓網頁資料的神器

前幾年以網路有的中文資料,用python抓網頁是個很複雜的動作。使用lxml這個強大的第三方套件,對,他很強,但可能我天資駑鈍,實在太難用了。抓一個資料還得去查他在網頁裡的xpath,查出來也不一定吃(我自己試用發現吃不了<tbody>標籤組),如果有個像phpquery一樣,我只要知道我要抓的資料位置所在的id,甚至知道是第幾個甚麼標籤,那不就方便許多了嗎?
所幸過了一年後,神聽到我的請求,pyquery降臨了
首先由於該套件是以lxml作為底層剖析引擎,所以先到下列網址下載安裝
http://pypi.python.org/pypi/lxml/2.3.2
不過上面網址只有釋放原始碼,要自己打指令安裝
如果你的作業系統是Windows,有福了,這邊有一指安裝檔,在下列網頁內
http://www.lfd.uci.edu/~gohlke/pythonlibs/
找尋lxml-2.3.2,然後根據你的版本選擇安裝檔

安裝好了,接下來就是主菜了

pypi把套件下載下來http://pypi.python.org/pypi/pyquery
由於pyquery沒有製作一指安裝檔,所以不管哪種作業系統都要打指令。
將套件下載下來,解壓縮後,以命令列的方式進入套件的目錄,然後執行

python setup.py install

帶著禱告的心情按下Enter鍵,如果沒有出現安裝錯誤,水!

裝好了之後就要來測試一下
首先我們來試試看台灣yahoo
假設我們要抓取奇摩的<title></title>之間的值,該如何做呢?
請輸入以下的程式碼

from pyquery import PyQuery as pq
q = pq(url='http://tw.yahoo.com/')
print(q('title').text())

執行,你就會發現...

Yahoo!奇摩

怎麼會這麼簡單!!!

也許你會問,那可不可以用CSS的方式來抓呢?

假設我們要抓<a>標籤中屬於tag_fashion這個class的資料
把上面的程式碼中最後一行換成下面

print(q('a').filter('.tag_fashion').text())

各位有興趣自己試試看結果如何,ID值的道理也是一樣,把小數點換成#就可以了

不過又會有人問了:可是如果我要抓的資料位置沒辦法用ID方式指定,那該怎麼辦?
依然不難,該套件可以支援比如說我要抓第五個<p>標籤內的內容,方式如下

q('p').eq(4).text()

p.s. 用4的原因是因為python是以0開始記數,所以0是代表第1筆資料,4代表第5筆資料

一切就像做一塊小蛋糕一樣簡單

小弟今天就先寫到這,以後有緣會在介紹一些其他的應用。如果等不及,可以先看官方的說明文件http://packages.python.org/pyquery/index.html 。希望小弟的文章有幫到大家,再會~

5 則留言: