使用的網站 : https://tw.stock.yahoo.com/q/q?s=1210
以下使用 Python 3.1
import urllib.request #for 捉取網頁
import re #for Regular Expression
第一版 - Sample 1
import urllib.request #import 爬蟲的 library
url="https://tw.stock.yahoo.com/q/q?s=1210" #要捉取的網站
req=urllib.request.Request(url) #產生此網站的 Request
data=urllib.request.urlopen(req).read() #將網站的內容 (HTML) 捉回
第二版 - 加入 User Agent
import urllib.request
url="https://tw.stock.yahoo.com/q/q?s=1210"
req=urllib.request.Request(url)
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0") #設定 user agent 告知網站我們使用的瀏覽器資訊
data=urllib.request.urlopen(req).read()
print(data)
第三版 - 加入 Proxy Server
#!/usr/bin/env python3
import urllib.request
import re
url="https://tw.stock.yahoo.com/q/q?s=1210"
headers=("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
proxy = urllib.request.ProxyHandler({'http:':'proxy.hinet.net:80'})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
opener.addheaders = [headers]
data = opener.open(url).read().decode('big5') #Byte Object
str_data = str( data )
print(str_data)
上面 decode('big5') 如果搜尋的字串不是中文,則可以不使用,如果用中文除了要 decode('big5') 另外程式檔建議另存 utf-8 不要使用 ANSI
接下來就是要如何去捉取了網頁內容了,目前在 data 裡的是整個網站的內容但我們只要成交金額,使用 Chrome 的 F12 看到網站的 Source Code,其 HTML 語法有特別被 <B></B> 包住,可使用最簡單的方法使用 Regular Expression 解析 <td align="center" bgcolor="#FFFfff" nowrap><b>33.65</b></td>
因此使用的 Regular Expression 其 Pattern 為 : '<td align="center" bgcolor="#FFFfff" nowrap><b>[0-9]+.[0-9]+</b></td>',而 Python 要使用 Regular Expression 則需要 import re,接下來語法如下
第四版 - 使用 Regular Expression 捉取網站要的資訊
import urllib.request
import re
url="https://tw.stock.yahoo.com/q/q?s=1210"
headers=("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
proxy = urllib.request.ProxyHandler({'http:':'proxy.hinet.net:80'})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
opener.addheaders = [headers]
data = opener.open(url).read().decode('big5') #Byte Object
str_data = str(data)
pattern = '<td align="center" bgcolor="#FFFfff" nowrap><b>[0-9]+.[0-9]+</b></td>'
result1 = re.search(pattern,str_data).span()
str_data = str_data[:result1[1]]
str_data = str_data[result1[0]:]
print(str_data)
結果可以把目前要捉取的內容取出並排除不要的資訊
到此其實已經捉到需要的資訊內容,只需要再把數字截出來,因此只要再下一次 Regular Expression 將 33.65 取出,其 Pattern 為 [0-9]+.[0-9]+ 即可
第五版 - 使用 re.search() Final Version
import urllib.request
import re
url="https://tw.stock.yahoo.com/q/q?s=1210"
headers=("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
proxy = urllib.request.ProxyHandler({'http:':'proxy.hinet.net:80'})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
opener.addheaders = [headers]
data = opener.open(url).read().decode('big5') #Byte Object
str_data = str(data)
pattern = '<td align="center" bgcolor="#FFFfff" nowrap><b>[0-9]+.[0-9]+</b></td>'
result1 = re.search(pattern,str_data).span()
str_data = str_data[:result1[1]]
str_data = str_data[result1[0]:]
pattern = '[0-9]+.[0-9]+'
result1 = re.search(pattern,str_data).span()
str_data = str_data[:result1[1]]
str_data = str_data[result1[0]:]
print(str_data)
但其實 re.search 只是找到字串的位置,另外可再 regular expression 中加入 (<pattern>),再使用 compile 的功能直接針對 () 內的 Pattern 的值取出
#!/usr/bin/env python3
import urllib.request
import re
url="https://tw.stock.yahoo.com/q/q?s=1210"
headers=("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")
proxy = urllib.request.ProxyHandler({'http:':'proxy.hinet.net:80'})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
opener.addheaders = [headers]
data = opener.open(url).read().decode('big5') #Byte Object
str_data = str( data )
pattern = '<td align="center" bgcolor="#FFFfff" nowrap><b>([0-9]+.[0-9]+)</b></td>'
result1 = re.compile(pattern).findall(str_data)
for result in result1:
print(result)
下圖兩個產生的結果不同,主要是在 Pattern 是否有加入 ()
上 Pattern : '<td align="center" bgcolor="#FFFfff" nowrap><b>([0-9]+.[0-9]+)</b></td>'
下 Pattern : '<td align="center" bgcolor="#FFFfff" nowrap><b>[0-9]+.[0-9]+</b></td>'
沒有留言:
張貼留言