2015年2月24日 星期二

用Python爬的第一個網頁

利用Python爬最基本的網頁其實只用兩個步驟
  • 取得網頁內容
  • 解析他

而且從頭到尾只需要用到兩個類庫
(連結為API)

http://www.taiwanlottery.com.tw/news/DrawNumber.aspx 該網頁為例
其實就是取得樂透彩中獎號碼


其實整個實作的概念很簡單也基本,首先觀察一下案例網站的原始碼,找到我們要取出的內容,而我們要取出的內容就是那些樂透彩名稱、期號、中獎號碼,稍微觀察一下你會發現這些我們需要的內容都被<li>這個標籤給包圍,那麼現在我們要做的就是取得這標籤裡的內容物


開始來寫Code了


首先匯入urllib2,SGMLParser這兩個類庫
import urllib2
from sgmllib import SGMLParser


建立一個類來繼承SGMLParser
class Lottery(SGMLParser):
def __init__(self):
SGMLParser.__init__(self)
self.is_li = ""
self.name = []
def start_li(self, attrs):
self.is_li = 1
def end_li(self):
self.is_li = ""
def handle_data(self, text):
if self.is_li == 1:
self.name.append(text)

你會發現裡面的start_li、end_li、is_li的”li“就是我們要取得的標籤,也可以依照案例的不同而修改成其他的標籤,像是start_td、start_div等等
而name就是標籤裡的內容了


接著就是開始實作了,以下代碼為獲取整個網站內容
content = urllib2.urlopen('http://www.taiwanlottery.com.tw/news/DrawNumber.aspx').read()


開始解析內容
lottery = Lottery()
liottery.feed(content)
for i in liottery.name:
   i = i.replace(" ","")
   if '\n' not in i:
       print i


第一次執行會比較慢,只要沒馬上出現錯誤的結果都是好的
最終印出的結果如下

104
2
24
日獎號一覽表


大樂透


期別
104000021




本期中獎號碼
依大小順序排列:
28
39
41
46
48
09
39
28
03
48
41
49樂合彩


期別
104000021


本期中獎號碼
依大小順序排列:
28
39
41
46
48
39
28
03
48
41
4星彩


期別
104000047


本期中獎號碼
6
2
7
3星彩


期別
104000047


本期中獎號碼
2
3


今彩539


期別
104000047


本期中獎號碼
依大小順序排列:
12
14
23
27


14
23
12
11
39樂合彩


期別
104000047


本期中獎號碼
依大小順序排列:
12
14
23
27
14
23
12
11

References:
[Python] 超級基本的網頁抓取
http://rightthewaygeek.blogspot.tw/2013/09/python.html
Python写爬虫——抓取网页并解析HTML
http://www.lovelucy.info/python-crawl-pages.html



沒有留言:

張貼留言