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

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

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

查看源代碼,找到顯示滬市股票列表信息,它們被存放在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”後面加上股票代碼命名的,而前面我們已經獲得了滬市的每一個股票的代碼。

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

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

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

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

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

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

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

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>

運行看看效果:

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

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

"