Python-爬蟲-抓取股票資訊

文、意如

首先準備好待查詢的股票代碼,此範例以長榮海運股票為例,代碼為2603,

接下來到google直接搜尋2603,就可以找到長榮海運股票的資訊,也就是我們這次爬蟲要抓的資訊。

 

 

首先確認目標:
確認一下網址,目標網址為:https://www.google.com/search?q= “個股”代號
長榮代號為:2603

因此目標位置為 https://www.google.com/search?q=2603

 

準備開始寫程式

程式碼如下:
#先匯入爬蟲基本套件requests
import requests
#匯入爬蟲解析套件requests
from bs4 import BeautifulSoup
#目標網址後方加上個股資訊. ex長榮: TPE:2603
targetURL = ‘https://www.google.com/search?q=’

接下來我們需要先把整張網頁HTML全部都抓回來的功能
方法名稱:get_stock_page(url,stock_id){}
帶入參數1-url:要抓取的目標網址
帶入參數2-stock_id:要抓取的股票代號

 

程式參考如下:
def get_stock_page(url, stock_id):
        #此段參考下方headers補充說明
    headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) ‘
             ‘AppleWebKit/537.36 (KHTML, like Gecko) ‘
             ‘Chrome/66.0.3359.181 Safari/537.36’}
    resp = requests.get(url + stock_id, headers=headers)
        #如果抓取失敗,印出失敗的網址
    if resp.status_code != 200:
        print(‘Invalid url:’, resp.url)
        return None
        #如果抓取成功,返回抓回的html碼
    else:
        return resp.text

#主程式從這裡開始
if __name__ == ‘__main__’:
#呼叫get_stock_page並傳入目標位置及股票代碼
    page = get_stock_page(targetURL, ‘2603’)
    #印出結果
    print(page)

 

先執行看看,目前已經成功把整張網頁的HTML抓回來了。

 

程式碼中的headers補充說明:
有時在爬一些網站的時候會一直連不上,因為有的網站是不允許被爬蟲的,所以我們可以設定User-Agent假裝自己是瀏覽器,因為User-Agent會告訴網站它是透過什麼工具。

一般的網站可以分析出瀏覽器名稱、瀏覽器版本號、渲染引擎、操作系統、發送請求,因此我們可以寫下面這一段來假裝自己是用瀏覽器開啟的。
headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) ‘
                             ‘AppleWebKit/537.36 (KHTML, like Gecko) ‘
                             ‘Chrome/66.0.3359.181 Safari/537.36’}
#在請求抓取網頁時記得帶入headers參數
resp = requests.get(url + stock_id, headers=headers)

 

如果想更進階了解自己的User-Agent,你也可以自己試著開啟網站看看,
按下F12 >>Network->隨便點選一頁>>就可以知道自己的User-Agent

字串說明
Mozilla/5.0Mozilla/5.0 是一個通用標記符號,用來表示與 Mozilla 相容,這幾乎是現代瀏覽器的標配。
(iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)瀏覽器所執行的系統的詳細資訊
AppleWebKit/531.21.10瀏覽器所使用的平台
(KHTML, like Gecko)瀏覽器平台的細節
Mobile/7B405被瀏覽器用於指示特定的直接由瀏覽器提供或者通過第三方提供的可用的增強功能。這方面的一個實例是Microsoft Live Meeting,它註冊了一個擴充以使Live Meeting服務知道該軟體是否已經安裝上,這意味著它可以為加入會議提供一個簡化的體驗。

 

 

接下來我們繼續往下抓更細的股票資料(如下圖紅框的資料)

 

先找到原始碼html標籤中股票資訊放在哪?
網頁中>>按下鍵盤F12
1. 點選網頁元素按鈕
2. 點選要找的網頁元素
3. 找到我們的資料在哪裡:第4個 g-card-section 中
4. 找到Table是分別存放股票資訊

 

程式碼:
#先使用for迴圈把所有<Table>資料通通抓出來
for table in sections[3].find_all(‘table’):
        #再把每一行<tr>的資料讀出
   for tr in table.find_all(‘tr’)[:3]:  #[:3]  取得3個字   
   key = tr.find_all(‘td’)[0].text.lower().strip() 
#lower()轉小寫
#strip()去除頭尾空格
#key值為抓到的中文字(如下圖)

 

 

value = tr.find_all(‘td’)[1].text.strip()
#value值為抓到的數據(如下圖)

 

    stock[key] = value #將抓到的key跟value值存進我們自己所建立的陣列
    return stock #返回抓到的股票資訊
#程式從這裡開始跑
if __name__ == ‘__main__’:
    page = get_stock_page(targetURL, ‘2603’)
   
    #當有資料時
    if page:
        stock = get_stock_info(page)
        for k, v in stock.items():
                        #印出抓回來的key跟value資料
            print(k, v)   

 

這樣就完成了,最後參考完整程式碼如下:

#目標: https://www.google.com/search?q=
#2603    
#匯入爬蟲基本套件requests
import requests
#匯入爬蟲解析套件requests
from bs4 import BeautifulSoup
#目標網址後方加上個股資訊. ex長榮:2603
targetURL = ‘https://www.google.com/search?q=&#8217;
def get_stock_page(url, stock_id):
    headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) ‘
                             ‘AppleWebKit/537.36 (KHTML, like Gecko) ‘
                             ‘Chrome/66.0.3359.181 Safari/537.36’}
    resp = requests.get(url + stock_id, headers=headers)
    if resp.status_code != 200:
        print(‘Invalid url:’, resp.url)
        return None
    else:
        return resp.text
def get_stock_info(webtxt):
    soup = BeautifulSoup(webtxt, ‘html.parser’)
    stock = dict()   
  
   
    sections = soup.find_all(‘g-card-section’)
    # 第4個 g-card-section, 有左右兩個 table 分別存放股票資訊
    for table in sections[3].find_all(‘table’):
        for tr in table.find_all(‘tr’)[:3]:  #[:3]  取得3個字
            key = tr.find_all(‘td’)[0].text.lower().strip() 
#lower()轉小寫。 strip()去除頭尾空
            value = tr.find_all(‘td’)[1].text.strip()
            stock[key] = value
    return stock
if __name__ == ‘__main__’:
    page = get_stock_page(targetURL, ‘2603’)    
  
    if page:
        stock = get_stock_info(page)
        for k, v in stock.items():
            print(k, v)   

 

完成畫面如下:

 

抓取的網頁如下:

 

 

完整程式碼

#目標: https://www.google.com/search?q=
#TPE: 2412
    
import requests
from bs4 import BeautifulSoup
#網址後方加上個股資訊. ex中華電信: TPE: 2412
targetURL = 'https://www.google.com/search?q='

def get_stock_page(url, stock_id):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                             'AppleWebKit/537.36 (KHTML, like Gecko) '
                             'Chrome/66.0.3359.181 Safari/537.36'}
    resp = requests.get(url + stock_id, headers=headers)
    if resp.status_code != 200:
        print('Invalid url:', resp.url)
        return None
    else:
        return resp.text
  
def get_stock_info(webtxt):
    soup = BeautifulSoup(webtxt, 'html.parser')
    stock = dict()
    sections = soup.find_all('g-card-section')
    #print(sections)         

  
    
    #print(sections)
    #第 4 個 g-card-section, 有左右兩個 table 分別存放股票資訊
    for table in sections[3].find_all('table'):
      #print(table)
      for tr in table.find_all('tr'):
            #print(tr)
            key = tr.find_all('td')[0].text.lower().strip()  #lower()轉小寫。 strip()去除頭尾空格
            value = tr.find_all('td')[1].text.strip()
            stock[key] = value
            #print(stock)

    return stock

if __name__ == '__main__':
    page = get_stock_page(targetURL, 'TPE: 2412')
    #print(page) #None
   
    if page: #裡面有資料
        stock = get_stock_info(page)
        for k, v in stock.items():
            print(k,'=', v)  
           

Yiru@Studio - 關於我 - 意如