前言
本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理,
以下文章來源于IT資訊教室,作者:M先森看世界
資料的爬取
我們以上證50的股票為例,首先需要找到一個網站包含這五十只股票的股票代碼,例如這里我們使用搜狐證券提供的串列,
https://q.stock.sohu.com/cn/bk_4272.shtml
可以看到,在這個網站中有上證50的所有股票代碼,我們希望爬取的就是這個包含股票代碼的表,并獲取這個表的第一列,
爬取網站的資料我們使用 Beautiful Soup 這個工具包,需要注意的是,一般只能爬取到靜態網頁中的資訊,
簡單來說,Beautiful Soup 是 Python 的一個庫,最主要的功能是從網頁抓取資料,
像往常一樣,使用這個庫之前,我們需要先匯入該庫 bs4,除此之外,我們還需要使用 requests 這個工具獲取網站資訊,因此匯入這兩個庫:
import bs4 as bs
import requests
我們定義一個函式 saveSS50Tickers() 來實作上證50股票代碼的獲取,獲取的資料來自于搜狐證券的網頁,使用 get() 方法獲取給定靜態網頁的資料,
def saveSS50Tickers():
resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml')
接下來我們打開搜狐證券的這個網址,在頁面任意位置右鍵選擇 查看元素,或者 Inspect Element,或者類似的選項來查看當前網站的源代碼資訊,
我們需要先在這里找出網頁的一些基本資訊和我們需要爬取的資料的特征,
首先,找到 Element,在下面的內容中找到網頁的 頭檔案 (head),然后找到網頁的 文字的編碼方式,這里這個網頁文字的編碼方式是 gb2312,
如果我們想爬取并正確顯示這個網頁上,就需要先對獲取到的網頁內容解碼,
解碼可以使用 encoding 這個方法:
resp.encoding = 'gb2312'
接下來使用 BeautifulSoup 和 lxml 決議網頁資訊:
soup = bs.BeautifulSoup(resp.text, 'lxml')
這里為了方便后期的處理,首先使用 resp.text 將網頁資訊轉成了文本格式,然后再決議網頁的資料,
接下來我們需要在網頁的原始碼中找到需要爬取資訊的標簽,這里我們需要爬取這個表格中的資訊,首先,可以通過網站原始碼的搜索功能搜索表格里的相關資料定位到表格的原始碼,
同樣以這個頁面為例,一般網頁使用 HTML 語言編譯的,因為要準確定位,我們需要了解一些 HTML 語言的基礎內容,在這個頁面的原始碼中,
<table 表示表格開始,后面是這個表格的一些屬性,</table> 表示表格結束,
首先,我們使用 soup.find 在網頁資訊中找到這個表格標簽的入口:
table = soup.find('table', {'id': 'BIZ_MS_plstock'})
其中 'table' 表示這里需要找到一個表格,{'id': 'BIZ_MS_plstock'} 則是通過內容或者屬性實作表格的進一步定位,
找到表格的位置之后,我們需要繼續查找需要的資料,同樣以這個頁面為例:
在網頁開發語言中,
<tr 表示表格中開始新的一行,<td 表示在這一行中又新建了一列,而 </td> 則表示這一列結束了,對應的 </tr> 則表示這一行結束了,
通過該網頁的原始碼,我們可以發現,
表格的第一行和第二行都是表頭的資訊,第三行開始是五十家公司的股票資訊,另外每家公司的股票代碼在表格的第一列位置,
因為,在Python中,我們需要從表格的第三行開始抓取,每行抓取表格的第一列的資料,將抓取到的資料轉換成文本格式,我們用一個串列 tickers 來存盤抓取到的資料:
tickers = []
for row in table.findAll('tr')[2:]:
ticker = row.findAll('td')[0].text
tickers.append(ticker + '.SS')
因此為了方便后續進行資料處理,這里我們存盤上證50的每家公司的股票代碼時,都在代碼后面再添加 '.SS' 的字符,這時我們運行目前的代碼,并將串列 tickers 輸出:
# 匯入 beautiful soup4 包,用于抓取網頁資訊
import bs4 as bs
# 匯入 pickle 用于序列化物件
import pickle
# 匯入 request 用于獲取網站上的原始碼
import requests
def saveSS50Tickers():
resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml')
resp.encoding = 'gb2312'
soup = bs.BeautifulSoup(resp.text, 'lxml')
# print(soup)
table = soup.find('table', {'id': 'BIZ_MS_plstock'})
# print(table)
tickers = []
# print(table.find_all('tr'))
for row in table.findAll('tr')[2:]:
# print(row)
ticker = row.findAll('td')[0].text
tickers.append(ticker + '.SS')
return tickers
tickers = saveSS50Tickers()
print(tickers)
觀察到輸出資訊如下:
['600036.SS', '601229.SS', '600031.SS', '601166.SS', '600104.SS', '600030.SS', '603259.SS', '601668.SS', '601628.SS', '601766.SS', '601857.SS', '601398.SS', '601390.SS', '600029.SS', '600028.SS', '601818.SS', '601211.SS', '601066.SS', '601111.SS', '600837.SS', '600887.SS', '601888.SS', '600690.SS', '600519.SS', '600016.SS', '601989.SS', '601988.SS', '601601.SS', '600019.SS', '601186.SS', '600703.SS', '600196.SS', '601318.SS', '601800.SS', '600050.SS', '601319.SS', '601288.SS', '601688.SS', '603993.SS', '600309.SS', '600048.SS', '600276.SS', '601138.SS', '601336.SS', '601088.SS', '600585.SS', '600000.SS', '601328.SS', '601939.SS', '600340.SS']
這樣我們就從搜狐證券這個網站上爬取到了上證50的公司股票代碼,并將其以字串的格式存放在了一個串列變數中,
將股票代碼保存到本地
一般像股票代碼這種內容,短時間內不會有很大的變動,所以我們也不需要每次使用時重新爬取,一種方便的做法是可以將股票代碼資訊以檔案的格式保存到本地,需要使用時直接從本地讀取就可以了,
這里我們將股票代碼資料保存為 pickle 格式,pickle 格式的資料可以在 Python 中高效的存取,當然,將檔案匯出成該格式前需要先匯入相應的pickle 庫:
import pickle
pickle可以保存任何資料格式的資料,在經常存取的場景(保存和恢復狀態)下讀取更加高效,
把檔案匯出成 pickle 格式的方法是 pickle.dump,同時需要結合檔案讀寫操作:
with open('SS50tickers.pickle', 'wb') as f: pickle.dump(tickers, f)
這里的 'SS50tickers.pickle' 就是保存的檔案的名稱,'wb' 則表示向檔案中寫入資料,pickle.dump(tickers, f) 表示將串列 tickers 寫入到檔案中,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/220847.html
標籤:其他
上一篇:MFC的大致講解
下一篇:技術點15:Filter過濾器
