python 學習 爬取證券之星的股票信息

python 學習 爬取證券之星的股票信息
選擇原因,數據好獲取,便於操作!

第一步,找到股票相關的信息,先去東方財富網,找到股票的代碼查詢一覽表網站
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190914212532135.png在這裏插入圖片描述
在這裏,我們能找到所以的股票信息,比如名稱,代號等等!!
然後,我們來到證券之星網站,隨便找一隻股,
在這我裏插入圖片描述
我們發現,所有的股票的url 都是以 ‘https://stock.quote.stockstar.com/’+ 股票代碼+ ".shtml"的形式構成,因此,我們只需要在東方財富網中找到所有的股票代碼,並獲取到喲個列表中,後面再通過遍歷就可以將所有的股票網頁獲取到,因此,我們先建立主函數,獲取所有的股票代碼!!!

#該爬蟲是針對 證券之星這個網站爬取數據的
#該爬蟲分爲四個函數,一個主函數(main),三個作用函數!
#注意,少用[’’’ ‘’’]這樣的方式註釋,會出現bug---->except an indented block
#導入庫
import requests
from bs4 import BeautifulSoup
import traceback
import re

def getHTMLText(url, code=“utf-8”):

#該函數是獲取網頁的函數,主要負責獲取每次改變之後的網頁數據
#該函數是一個爬蟲模板

try:
      head={}
      head['User-Agent']='Mozilla/5.0'
      #僞裝,比較簡單
      r = requests.get(url,headers=head,timeout = 30)
      #r只是一個單純的返回,無實質數據,r.text中才是
      #print(url)
      #print(r.status_code)
      #判斷是否成功獲取網頁

      r.encoding = code   #減少時間,優化,不算很懂
      return r.text             #返回爬取網頁中的數據
except:
    return ""

def getStockList(lst, stockURL):

#首先,這個是爬取東方財富網的股票信息的函數
#但其實很多網頁與此類似

html = getHTMLText(stockURL,"GB2312")
#獲取網頁鏈接和和他的編碼方式!自己去網站查的,不同網站不同
soup = BeautifulSoup(html, 'html.parser')
#對網頁進行解析,可以用soup.prettify()將網頁規則化,整齊化,如下
soup.prettify()
a = soup.find_all('a')

|在這裏插入圖片描述
#在東方財富網網頁源代碼中,我們發現,股票信息都存儲在a標籤下,所以,我們用
#filename.find_all()函數,將a標籤下的信息都保存在a列表下

for i in a:

#對a進行遍歷,將其中 找到a標籤下的 ‘href’ 鍵,用正則表達式或者bs4庫中的

filename.get(‘key’) 函數將股票的信息拿到,再進行分割,用filename.split()

#此處,用的正則表達式進行匹配!!

    try:
        href = i.attrs['href']#或者href=i.get('href')

#重點!!!這裏將href定位在了’href’標籤下,防止找錯地方,導致數據錯誤
lst.append(re.findall(r"\d{6}", href)[0])
#正則表達式進行匹配,看你需要什麼數據,就對什麼數據進行匹配
except:
continue

def getStockInfo(lst, stockURL, fpath,taplt):

#重點 路徑保持,數據獲取!!
#難點 分析數據 定位數據,並截取數據!!

count = 0

#count計數,用來統計輸出
for stock in lst:
#循環引用,用來得到在證券之星中 相關股票的信息
url = stockURL + stock + “.shtml”
#獲取url鏈接,並獲取鏈接內容
html = getHTMLText(url,‘gb2312’)
try:
if html=="":
#如果在東方財富網中有的數據證券之星中沒有,即輸出的html爲空
continue
infoDict = {}
#創建字典,保存數據
soup = BeautifulSoup(html, ‘html.parser’)
#將找到的股票頁面信息轉化成易讀的信息
stockInfo = soup.find(‘div’,attrs={‘class’:‘bom_bor w’})#


#通過用filename.find 函數,將html信息僅僅定位在<div ‘class’:‘bom_bor w’>標籤內
#有助於我們減少搜索量,便於查找信息
#注意看格式!!!
name = stockInfo.find_all(attrs={‘class’:‘name’})[0]
#在縮小的範圍內,查找含有[‘class’:‘name’]字典的標籤,他得到的是標籤及標籤的內容顯示出來
#因此我們要對name text化
infoDict.update({‘股票名稱’: name.text.split()[0]})
#name text 化之後,進行分割,得到我們要的股票名稱

        #print(name.text.split()[0])
        stockInfo = soup.find('table',attrs={'id':'stock_quoteinfo'})

#同上,股票的數據在一個更小的標籤組裏,所以,我們重新將stockInfo定位

        keyList = stockInfo.find_all('td')
        valueList=stockInfo.find_all('span')

#仔細觀察,會發現,股票的信息都td span 標籤組下,所以,我們將key ,val就可以通過
#find_all 函數找到
#準備格式化輸出

        for i in range(5):

#這裏我只取前5/4個股票指標,可以更多
key = keyList[i].text.split(’:’)[0]
#仔細觀察網頁源代碼會發現,你所取的key 包含了val,因此,我們要截取出來
val = valueList[i].text
infoDict[key] = val
#字典key 與 val 對應
print(taplt.format(infoDict[‘股票名稱’], infoDict[‘今開’], infoDict[‘最高’], infoDict[‘成交’],infoDict[‘市盈’], infoDict[‘上證指數’],chr(12288)))
#格式化輸出,好看一點
with open(fpath, ‘a’, encoding=‘utf-8’) as f:
#open(name[, mode[, buffering]]),(名稱地址,寫入方式(模式),指定格式)
#含義 第一個代表地址,第二個’a’,代表add,追加,第三個寫入格式!!
f.write( str(infoDict) + ‘\n’ )
#換行添加
count = count + 1
#計數器,可以用來統計爬了多少隻股票!!
#print(“一共爬取了%d只股票!!!你真棒”%count)
except:
continue

def main():
stock_list_url = ‘http://quote.eastmoney.com/stock_list.html’ #http://quote.eastmoney.com/stock_list.html
#東方財富網的股票信息鏈接
stock_info_url = ‘https://stock.quote.stockstar.com/’#600505.shtml
#證券之星網站股票信息查詢的前綴
output_file = ‘E:/桌面/python/股票.txt’
#股票保存地址
slist=[]
#空集,用來收集股票信息的
taplt=’{0:{6}8}\t{1:8}\t{2:8}\t{3:{6}8}\t{4:8}\t{5:8}’
print(taplt.format(‘股票名稱’, ‘今開’, ‘最高’, ‘成交’, ‘市盈’, ‘上證指數’,chr(12288)))

格式化輸出模板

getStockList(slist, stock_list_url)   #爬取股票代碼
req=getStockInfo(slist, stock_info_url, output_file,taplt)

main()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章