Python爬虫入门实例八之股票数据定向爬取并保存(优化版)
文章目錄
- 寫(xiě)在前面
- 一、準(zhǔn)備工作
- 1.功能描述
- 2.候選數(shù)據(jù)網(wǎng)站的選擇
- 3.程序的結(jié)構(gòu)設(shè)計(jì)
- 4.本篇選取的數(shù)據(jù)網(wǎng)站
- (1)網(wǎng)站鏈接
- (2)網(wǎng)站內(nèi)容
- 二、數(shù)據(jù)網(wǎng)站分析
- 1.股票列表的分析
- 2.個(gè)股信息的分析
- 三、編程過(guò)程
- 1.使用到的庫(kù)
- 2.獲取頁(yè)面(編寫(xiě)getHTMLText()函數(shù))
- 3.獲取股票的信息列表(編寫(xiě)getStockList()函數(shù))
- 4.獲取個(gè)股信息(編寫(xiě)getStockInfo()函數(shù))
- 四、完整代碼
- 引用源自
寫(xiě)在前面
??昨天在學(xué)習(xí)中國(guó)MOOC嵩天老師的課程時(shí),到了股票信息的定向爬取實(shí)例,但是因?yàn)橐曨l是兩年前的了,而且例子中的很多網(wǎng)站也都不能再用了。所有今天寫(xiě)這篇文章分享一下我的采坑經(jīng)歷,并且為大家提供完整的代碼供小伙伴們參考,下圖是我爬取數(shù)據(jù)并保存在txt文件中的截圖。
一、準(zhǔn)備工作
??這一部分嵩天老師在課程中給出了詳細(xì)的介紹,我整理并分享給大家。
1.功能描述
目標(biāo):獲取上交所和深交所所有股票的名稱(chēng)和交易信息
輸出:保存到文件中
技術(shù)路線:requests -bs4- re
2.候選數(shù)據(jù)網(wǎng)站的選擇
新浪股票:http://finance.sina.com.cn/stock/(由于數(shù)據(jù)保存在js中,目前技術(shù)無(wú)法爬取)
百度股票:https://gupiao.baidu.com/stock/(網(wǎng)站已停止維護(hù),鏈接不存在)
選取原則:股票信息靜態(tài)存在于HTML頁(yè)面中,而不是通過(guò)js代碼生成,沒(méi)有Robots協(xié)議限制。
選取方法:瀏覽器F12,源代碼查看等。
選取心態(tài):不要糾結(jié)于某個(gè)網(wǎng)站,多找信息源嘗試。
3.程序的結(jié)構(gòu)設(shè)計(jì)
步驟1:從東方財(cái)富網(wǎng)獲取股票列表
步驟2:根據(jù)股票列表逐個(gè)到百度股票獲取個(gè)股信息
步驟3:將結(jié)果存儲(chǔ)到文件
4.本篇選取的數(shù)據(jù)網(wǎng)站
??經(jīng)過(guò)我多次查找,反復(fù)比較,最終選定了股城網(wǎng)。股城網(wǎng)的頁(yè)面結(jié)構(gòu)和之前的百度股票很相似,所以在源代碼上也更貼近嵩天老師的內(nèi)容。
(1)網(wǎng)站鏈接
鏈接:https://hq.gucheng.com/gpdmylb.html
(2)網(wǎng)站內(nèi)容
網(wǎng)站截圖:
二、數(shù)據(jù)網(wǎng)站分析
??為了能夠編寫(xiě)相應(yīng)代碼解析數(shù)據(jù)網(wǎng)站內(nèi)容,我們必須要對(duì)數(shù)據(jù)網(wǎng)站的布局進(jìn)行分析,去查看它的源代碼。
1.股票列表的分析
??通過(guò)對(duì)股票列表源代碼的分析,我們發(fā)現(xiàn)所有的股票代碼都存放在a標(biāo)簽內(nèi)的href當(dāng)中,我們只要把他解析出來(lái)就可以獲得相應(yīng)的股票代碼。
2.個(gè)股信息的分析
??這里我選取了平安銀行(000001)股票進(jìn)行其源代碼的查看。通過(guò)對(duì)股票個(gè)股信息的分析,我們發(fā)現(xiàn)一只股票的全部信息封裝在一個(gè)div標(biāo)簽下,它的屬性名是stock_top clearfix。股票的名稱(chēng)封裝在header 標(biāo)簽下,它的屬性名是stock_title。再通過(guò)觀察我們發(fā)現(xiàn),所有的股票信息都存在dt和dd標(biāo)簽下,其中dt存儲(chǔ)的是信息鍵的部分,dd存儲(chǔ)的是信息值的部分,所以我們可以先用find_all()方法找到所有的鍵和值,然后構(gòu)建鍵值對(duì)來(lái)表示并存儲(chǔ)在字典中。
三、編程過(guò)程
1.使用到的庫(kù)
import requests from bs4 import BeautifulSoup import traceback import re2.獲取頁(yè)面(編寫(xiě)getHTMLText()函數(shù))
def getHTMLText(url,code='UTF-8'):try:r = requests.get(url,headers=kv,timeout = 30)r.raise_for_status()#r.encoding = r.apparent_encodingr.encoding = codereturn r.textexcept:return ""3.獲取股票的信息列表(編寫(xiě)getStockList()函數(shù))
def getStockList(lst,stockURL):#獲得股票的信息列表 #第一個(gè)參數(shù)表示列表保存的列表類(lèi)型,存儲(chǔ)了所有股票的信息,第二個(gè)參數(shù)是獲得股票列表的URL網(wǎng)站html = getHTMLText(stockURL,'UTF-8')soup = BeautifulSoup(html,'html.parser')#解析頁(yè)面a = soup.find_all('a')#找到所有的a標(biāo)簽for i in a:try:href = i.attrs['href']lst.append(re.findall(r"[S][ZH]\d{6}",href)[0])except:continue4.獲取個(gè)股信息(編寫(xiě)getStockInfo()函數(shù))
def getStockInfo(lst,stockURL,fpath):#獲得每一支個(gè)股的股票信息,并且儲(chǔ)存到數(shù)據(jù)結(jié)構(gòu),包括三個(gè)參數(shù):1.保存所有股票的信息列表 2.獲得股票信息的URL網(wǎng)站 3.將來(lái)要把信息存到文件的文件路徑count = 0for stock in lst:url = stockURL + stockhtml = getHTMLText(url)try:if html == " ":continueinfoDict = {}#定義字典存儲(chǔ)從當(dāng)前頁(yè)面中返回的所有個(gè)股信息soup = BeautifulSoup(html,'html.parser')stockInfo = soup.find('div',attrs={'class':'stock_top clearfix'})name = stockInfo.find_all(attrs={'class':'stock_title'})[0]infoDict.update({'股票名稱(chēng)':name.text.split()[0]})keyList = stockInfo.find_all('dt')valueList = stockInfo.find_all('dd')for i in range(len(keyList)):key = keyList[i].textval = valueList[i].textinfoDict[key] = val #字典可以直接使用key=value,向字典中新增內(nèi)容#將相關(guān)信息保存在文件中with open(fpath,'a',encoding = 'utf-8') as f:f.write(str(infoDict)+'\n')#增加進(jìn)度條可看當(dāng)前進(jìn)度百分比count = count + 1print('\r當(dāng)前完成進(jìn)度:{:.2f}%'.format(count*100/len(lst)),end=" ")except:print('\r當(dāng)前完成進(jìn)度:{:.2f}%'.format(count * 100 / len(lst)),end=" ")continue四、完整代碼
''' 功能描述目標(biāo):獲取上交所和深交所所有股票的名稱(chēng)和交易信息 輸出:保存到文件中技術(shù)路線:requests-bs4-re候選數(shù)據(jù)網(wǎng)站的選擇 股城網(wǎng):https://hq.gucheng.com/gpdmylb.html 000001股信息網(wǎng)站:https://hq.gucheng.com/SZ000001/程序的結(jié)構(gòu)設(shè)計(jì) 步驟一:從股城網(wǎng)首頁(yè)獲取股票列表 步驟二:根據(jù)股票列表逐個(gè)獲取個(gè)股信息 步驟三:將結(jié)果存儲(chǔ)到文件 '''import requests from bs4 import BeautifulSoup import traceback import rekv = {'user-agent': 'Mozilla/5.0'}#模擬瀏覽器發(fā)送請(qǐng)求 def getHTMLText(url,code='UTF-8'):try:r = requests.get(url,headers=kv,timeout = 30)r.raise_for_status()#r.encoding = r.apparent_encodingr.encoding = codereturn r.textexcept:#print("獲取資源失敗")return ""def getStockList(lst,stockURL):#獲得股票的信息列表 #第一個(gè)參數(shù)表示列表保存的列表類(lèi)型,存儲(chǔ)了所有股票的信息,第二個(gè)參數(shù)是獲得股票列表的URL網(wǎng)站html = getHTMLText(stockURL,'UTF-8')soup = BeautifulSoup(html,'html.parser')#解析頁(yè)面a = soup.find_all('a')#找到所有的a標(biāo)簽for i in a:try:href = i.attrs['href']lst.append(re.findall(r"[S][ZH]\d{6}",href)[0])except:continuedef getStockInfo(lst,stockURL,fpath):#獲得每一支個(gè)股的股票信息,并且儲(chǔ)存到數(shù)據(jù)結(jié)構(gòu),包括三個(gè)參數(shù):1.保存所有股票的信息列表 2.獲得股票信息的URL網(wǎng)站 3.將來(lái)要把信息存到文件的文件路徑count = 0for stock in lst:url = stockURL + stockhtml = getHTMLText(url)try:if html == " ":continueinfoDict = {}#定義字典存儲(chǔ)從當(dāng)前頁(yè)面中返回的所有個(gè)股信息soup = BeautifulSoup(html,'html.parser')stockInfo = soup.find('div',attrs={'class':'stock_top clearfix'})name = stockInfo.find_all(attrs={'class':'stock_title'})[0]infoDict.update({'股票名稱(chēng)':name.text.split()[0]})keyList = stockInfo.find_all('dt')valueList = stockInfo.find_all('dd')for i in range(len(keyList)):key = keyList[i].textval = valueList[i].textinfoDict[key] = val #字典可以直接使用key=value,向字典中新增內(nèi)容#將相關(guān)信息保存在文件中with open(fpath,'a',encoding = 'utf-8') as f:f.write(str(infoDict)+'\n')#增加進(jìn)度條可看當(dāng)前進(jìn)度百分比count = count + 1print('\r當(dāng)前完成進(jìn)度:{:.2f}%'.format(count*100/len(lst)),end=" ")except:print('\r當(dāng)前完成進(jìn)度:{:.2f}%'.format(count * 100 / len(lst)),end=" ")continuedef main():stock_list_rul = 'https://hq.gucheng.com/gpdmylb.html'#獲得股票列表的URL鏈接stock_info_rul = 'https://hq.gucheng.com/'#獲取股票信息的鏈接的主體部分output_file = 'E://StockInfo.txt'slist = []#股票的信息定義成一個(gè)列表變量getStockList(slist,stock_list_rul)#獲得股票列表getStockInfo(slist,stock_info_rul,output_file)#根據(jù)股票列表,到相關(guān)網(wǎng)站獲取股票信息,并存儲(chǔ)在文件中main()??本篇完,如有錯(cuò)誤歡迎指出~
引用源自
中國(guó)大學(xué)MOOC Python網(wǎng)絡(luò)爬蟲(chóng)與信息提取 https://www.icourse163.org/course/BIT-1001870001總結(jié)
以上是生活随笔為你收集整理的Python爬虫入门实例八之股票数据定向爬取并保存(优化版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一行代码搞定Http请求,强得离谱~
- 下一篇: W5100S-EVB-Pico [Mic