基于Python爬取搜狐證券股票過(guò)程解析
數(shù)據(jù)的爬取
我們以上證50的股票為例,首先需要找到一個(gè)網(wǎng)站包含這五十只股票的股票代碼,例如這里我們使用搜狐證券提供的列表。
https://q.stock.sohu.com/cn/bk_4272.shtml
可以看到,在這個(gè)網(wǎng)站中有上證50的所有股票代碼,我們希望爬取的就是這個(gè)包含股票代碼的表,并獲取這個(gè)表的第一列。
爬取網(wǎng)站的數(shù)據(jù)我們使用Beautiful Soup這個(gè)工具包,需要注意的是,一般只能爬取到靜態(tài)網(wǎng)頁(yè)中的信息。
簡(jiǎn)單來(lái)說(shuō),Beautiful Soup是Python的一個(gè)庫(kù),最主要的功能是從網(wǎng)頁(yè)抓取數(shù)據(jù)。
像往常一樣,使用這個(gè)庫(kù)之前,我們需要先導(dǎo)入該庫(kù)bs4。除此之外,我們還需要使用requests這個(gè)工具獲取網(wǎng)站信息,因此導(dǎo)入這兩個(gè)庫(kù):
import bs4 as bs
import requests
我們定義一個(gè)函數(shù)saveSS50Tickers() 來(lái)實(shí)現(xiàn)上證50股票代碼的獲取,獲取的數(shù)據(jù)來(lái)自于搜狐證券的網(wǎng)頁(yè),使用 get() 方法獲取給定靜態(tài)網(wǎng)頁(yè)的數(shù)據(jù)。
def saveSS50Tickers():
resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml')
接下來(lái)我們打開(kāi)搜狐證券的這個(gè)網(wǎng)址,在頁(yè)面任意位置右鍵選擇查看元素,或者Inspect Element,或者類似的選項(xiàng)來(lái)查看當(dāng)前網(wǎng)站的源代碼信息。
我們需要先在這里找出網(wǎng)頁(yè)的一些基本信息和我們需要爬取的數(shù)據(jù)的特征。
首先,找到Element,在下面的內(nèi)容中找到網(wǎng)頁(yè)的頭文件 (head)。然后找到網(wǎng)頁(yè)的文字的編碼方式。這里這個(gè)網(wǎng)頁(yè)文字的編碼方式是gb2312。
如果我們想爬取并正確顯示這個(gè)網(wǎng)頁(yè)上,就需要先對(duì)獲取到的網(wǎng)頁(yè)內(nèi)容解碼。
解碼可以使用 encoding 這個(gè)方法:
resp.encoding = 'gb2312'
接下來(lái)使用 BeautifulSoup 和lxml解析網(wǎng)頁(yè)信息:
soup = bs.BeautifulSoup(resp.text, 'lxml')
這里為了方便后期的處理,首先使用 resp.text 將網(wǎng)頁(yè)信息轉(zhuǎn)成了文本格式,然后再解析網(wǎng)頁(yè)的數(shù)據(jù)。
接下來(lái)我們需要在網(wǎng)頁(yè)的源碼中找到需要爬取信息的標(biāo)簽,這里我們需要爬取這個(gè)表格中的信息,首先,可以通過(guò)網(wǎng)站源碼的搜索功能搜索表格里的相關(guān)數(shù)據(jù)定位到表格的源碼。
同樣以這個(gè)頁(yè)面為例,一般網(wǎng)頁(yè)使用HTML語(yǔ)言編譯的,因?yàn)橐獪?zhǔn)確定位,我們需要了解一些 HTML 語(yǔ)言的基礎(chǔ)內(nèi)容。在這個(gè)頁(yè)面的源碼中,
<table表示表格開(kāi)始,后面是這個(gè)表格的一些屬性。</table>表示表格結(jié)束。
首先,我們使用 soup.find 在網(wǎng)頁(yè)信息中找到這個(gè)表格標(biāo)簽的入口:
table = soup.find('table', {'id': 'BIZ_MS_plstock'})
其中'table'表示這里需要找到一個(gè)表格,{'id':'BIZ_MS_plstock'} 則是通過(guò)內(nèi)容或者屬性實(shí)現(xiàn)表格的進(jìn)一步定位。
找到表格的位置之后,我們需要繼續(xù)查找需要的數(shù)據(jù),同樣以這個(gè)頁(yè)面為例:
在網(wǎng)頁(yè)開(kāi)發(fā)語(yǔ)言中,
<tr表示表格中開(kāi)始新的一行,<td表示在這一行中又新建了一列,而</td>則表示這一列結(jié)束了,對(duì)應(yīng)的</tr>則表示這一行結(jié)束了。
通過(guò)該網(wǎng)頁(yè)的源碼,我們可以發(fā)現(xiàn),
表格的第一行和第二行都是表頭的信息,第三行開(kāi)始是五十家公司的股票信息。另外每家公司的股票代碼在表格的第一列位置。
因?yàn)?,在Python中,我們需要從表格的第三行開(kāi)始抓取,每行抓取表格的第一列的數(shù)據(jù),將抓取到的數(shù)據(jù)轉(zhuǎn)換成文本格式,我們用一個(gè)列表 tickers 來(lái)存儲(chǔ)抓取到的數(shù)據(jù):
tickers = []
for row in table.findAll('tr')[2:]:
ticker = row.findAll('td')[0].text
tickers.append(ticker + '.SS')
因此為了方便后續(xù)進(jìn)行數(shù)據(jù)處理,這里我們存儲(chǔ)上證50的每家公司的股票代碼時(shí),都在代碼后面再添加'.SS'的字符。這時(shí)我們運(yùn)行目前的代碼,并將列表tickers輸出:
# 導(dǎo)入 beautiful soup4 包,用于抓取網(wǎng)頁(yè)信息 import bs4 as bs # 導(dǎo)入 pickle 用于序列化對(duì)象 import pickle # 導(dǎo)入 request 用于獲取網(wǎng)站上的源碼 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']
這樣我們就從搜狐證券這個(gè)網(wǎng)站上爬取到了上證50的公司股票代碼,并將其以字符串的格式存放在了一個(gè)列表變量中。
將股票代碼保存到本地
一般像股票代碼這種內(nèi)容,短時(shí)間內(nèi)不會(huì)有很大的變動(dòng),所以我們也不需要每次使用時(shí)重新爬取,一種方便的做法是可以將股票代碼信息以文件的格式保存到本地,需要使用時(shí)直接從本地讀取就可以了。
這里我們將股票代碼數(shù)據(jù)保存為pickle格式。pickle 格式的數(shù)據(jù)可以在 Python 中高效的存取,當(dāng)然,將文件導(dǎo)出成該格式前需要先導(dǎo)入相應(yīng)的pickle 庫(kù):
import pickle
pickle可以保存任何數(shù)據(jù)格式的數(shù)據(jù),在經(jīng)常存取的場(chǎng)景(保存和恢復(fù)狀態(tài))下讀取更加高效。
把文件導(dǎo)出成pickle格式的方法是 pickle.dump,同時(shí)需要結(jié)合文件讀寫(xiě)操作:
with open('SS50tickers.pickle', 'wb') as f: pickle.dump(tickers, f)
這里的'SS50tickers.pickle'就是保存的文件的名稱,'wb'則表示向文件中寫(xiě)入數(shù)據(jù)。pickle.dump(tickers, f) 表示將列表tickers寫(xiě)入到文件中。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python爬蟲(chóng)回測(cè)股票的實(shí)例講解
- 使用python爬蟲(chóng)實(shí)現(xiàn)網(wǎng)絡(luò)股票信息爬取的demo
- python基于機(jī)器學(xué)習(xí)預(yù)測(cè)股票交易信號(hào)
- 如何用Python中Tushare包輕松完成股票篩選(詳細(xì)流程操作)
- python爬取股票最新數(shù)據(jù)并用excel繪制樹(shù)狀圖的示例
- python實(shí)現(xiàn)馬丁策略回測(cè)3000只股票的實(shí)例代碼
- 基于Python爬取股票數(shù)據(jù)過(guò)程詳解
- 關(guān)于python tushare Tkinter構(gòu)建的簡(jiǎn)單股票可視化查詢系統(tǒng)(Beta v0.13)
- Python爬取股票信息,并可視化數(shù)據(jù)的示例
- python用線性回歸預(yù)測(cè)股票價(jià)格的實(shí)現(xiàn)代碼
- python 簡(jiǎn)單的股票基金爬蟲(chóng)
相關(guān)文章
Python視頻爬蟲(chóng)實(shí)現(xiàn)下載頭條視頻功能示例
這篇文章主要介紹了Python視頻爬蟲(chóng)實(shí)現(xiàn)下載頭條視頻功能,涉及Python正則匹配、網(wǎng)絡(luò)傳輸及文件讀寫(xiě)等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05django自定義非主鍵自增字段類型詳解(auto increment field)
這篇文章主要介紹了django自定義非主鍵自增字段類型詳解(auto increment field),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn)
本文主要介紹了Pandas中字符串和時(shí)間轉(zhuǎn)換與格式化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Python實(shí)現(xiàn)AES加密,解密的兩種方法
這篇文章主要介紹了Python實(shí)現(xiàn)AES加密,解密的兩種方法,幫助大家更好的使用python加解密文件,感興趣的朋友可以了解下2020-10-10Python Dataframe 指定多列去重、求差集的方法
今天小編就為大家分享一篇Python Dataframe 指定多列去重、求差集的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python腳本實(shí)時(shí)處理log文件的方法
Python腳本是用來(lái)對(duì)實(shí)時(shí)文件的內(nèi)容監(jiān)控。接下來(lái)通過(guò)本文給大家介紹Python腳本實(shí)時(shí)處理log文件的方法,需要的朋友參考下吧2016-11-11如何使用七牛Python SDK寫(xiě)一個(gè)同步腳本及使用教程
七牛云存儲(chǔ)的 Python 語(yǔ)言版本 SDK(本文以下稱 Python-SDK)是對(duì)七牛云存儲(chǔ)API協(xié)議的一層封裝,以提供一套對(duì)于 Python 開(kāi)發(fā)者而言簡(jiǎn)單易用的開(kāi)發(fā)工具本篇文章給大家介紹如何使用七牛Python SDK寫(xiě)一個(gè)同步腳本及使用及使用教程,需要的朋友可以參考下2015-08-08python實(shí)現(xiàn)矩陣和array數(shù)組之間的轉(zhuǎn)換
今天小編就為大家分享一篇python實(shí)現(xiàn)矩陣和array數(shù)組之間的轉(zhuǎn)換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11