Python3 爬蟲抓取滬市股票代碼和最近收盤價

如何獲取滬市、深市上市公司的股票代碼、名稱和最近一日的收盤價格。查看了百度股票、新浪財經等網站後,我選擇東方財富網完成這項任務。東方財富網對幾乎所有個股建立了股吧和個股網頁。

Python3 爬蟲抓取滬市股票代碼和最近收盤價

從東方財富網股吧(http://guba.eastmoney.com/remenba.aspx)可以方便地抓取股票代碼和名稱,因為它們都是通過靜態頁面直接顯示,使用requests、BeautifulSoup庫和正則表達式可以很方便地獲取。

Python3 爬蟲抓取滬市股票代碼和最近收盤價

查看源代碼,找到顯示滬市股票列表信息,它們被存放在class="ngbglistdiv"的

標籤中。使用BeautifulSoup庫的find_all函數查找獲得
標籤內的所有標籤及內容。繼續使用find_all查找
標籤中所有的
  • 標籤,並用string屬性獲得內容。最後分割字符串獲得股票代碼和股票名稱。(注意:這裡沒有直接從
    標籤中獲取內容或者使用正則表達式,是因為股票列表中間有一個隱藏
    標籤,用這種方法只能取到隱藏
    標籤之前的內容。)
    <code>for div in soup.find_all('div',{'class':'ngbglistdiv'}):for li in div.find_all('li'):        s = li.contents[0].string        code = s[1:7]        name = s[8:]/<code>

    接下來從個股頁面http://quote.eastmoney.com/sh600010.html獲取最近股票成交價。觀察這個鏈接地址,頁面文件是以“sh”後面加上股票代碼命名的,而前面我們已經獲得了滬市的每一個股票的代碼。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    查看源代碼,發現並不能直接在頁面找到“1.14”這個價格信息,它是動態生成的。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    “F12”打開開發人員工具,查看“Elements”,找到顯示“1.14”這個價格所在區域。有一個“data-bind”屬性等於“43”,這個就是javascript腳本加載數據的關鍵屬性。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    查看“Network”,點擊“Name”區域的get請求連接,在右側的“Headers”中注意找到“fields=f43”,這個Request URL就是實際的請求地址。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    點擊Headers右側的Preview,可以看到f43:1.14,從服務器動態加載的數據被JQuery封裝在一個字典當中。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    複製這個Request URL在瀏覽器單獨打開,我們需要的價格信息就在這中間。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    直接使用這個Request URL有點繁瑣,把沒有必要的參數值全部刪掉。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    經過測試,問號前面的地址不變,後面的只有這3個參數有實際作用。

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    fltt表示小數位數,fields是我們要找的數據屬性標識符,這兩個也固定不變。只有secid=1.600114,小數點後邊的6位數字代表的是股票代碼。這樣根據每一個股票代碼,使用正則表達式就看可以獲取到價格那個值。

    <code># 根據股票代碼獲取最近一天收盤價 

    def getStockPrice(stock_code):
    \turl = 'http://push2.eastmoney.com/api/qt/stock/get?fltt=2&fields=f43&secid=1.' + stock_code
    \tdata = getHtmlContent(url)
    \trex = re.compile('\"f43\":\\d*.\\d*')
    \tm = re.search(rex,data)
    \t# 返回價格
    \treturn m.group(0).split(':')[1]/<code>

    最後整合所有代碼:

    <code># _*_ coding:utf-8 _*_

    import requests
    from bs4 import BeautifulSoup
    import re

    # 獲取頁面函數
    def getHtmlContent(url):
    \ttry:
    \t\tr = requests.get(url,'html.parser')
    \t\tr.raise_for_status()
    \t\tr.encoding = r.apparent_encoding
    \t\treturn r.text
    \texcept Exception as e:
    \t\treturn ''

    # 解析並打印
    def parseHtml(html):
    \tsoup = BeautifulSoup(html,'html.parser')
    \tcount = 0
    \ttry:
    \t\tfor div in soup.find_all('div',{'class':'ngbglistdiv'}):
    \t\t\tfor li in div.find_all('li'):
    \t\t\t\tcount = count + 1
    \t\t\t\ts = li.contents[0].string
    \t\t\t\tcode = s[1:7]
    \t\t\t\tname = s[8:]
    \t\t\t\tprice = getStockPrice(code)

    \t\t\t\tprint(count, code, name, price)
    \texcept Exception as e:
    \t\tprint('')

    # 根據股票代碼獲取最近一天收盤價
    def getStockPrice(stock_code):
    \turl = 'http://push2.eastmoney.com/api/qt/stock/get?fltt=2&fields=f43&secid=1.' + stock_code
    \tdata = getHtmlContent(url)

    \trex = re.compile('\"f43\":\\d*.\\d*')
    \tm = re.search(rex,data)
    \t# 返回價格
    \treturn m.group(0).split(':')[1]

    # 主函數
    if __name__ == '__main__':
    \tname_url = 'http://guba.eastmoney.com/remenba.aspx'
    \thtml = getHtmlContent(name_url)
    \tparseHtml(html)/<code>

    運行看看效果:

    Python3 爬蟲抓取滬市股票代碼和最近收盤價

    最終成功抓取到了滬市1559家上市公司的股票代碼、股票名稱和最近收盤價。

    小結:現在互聯網上的系統大多數頁面數據都是動態加載,而且做了很多反爬措施,爬取網頁內容,主要是分析清楚網頁結構和數據加載的原理。

    "

  • 分享到:


    相關文章: