咱們要知道利用selenium
是很是無敵的,自我認爲何反爬不反爬都不在話下,可是今天咱們爲何要用request+bs4爬取全部股票信息呢?由於他比較原始,所以今天的數據,爬取起來也是比較繁瑣的!接下來讓咱們emmmm。。。。你懂得html
第一步:獲取股票代碼python
1)咱們經過這個連接去網易看一下具體的股票信息,下面這個網頁是樂視網的股票信息http://quotes.money.163.com/trade/lsjysj_300104.html#01b07
網站
2)上海證券交易所的官方網站上直接告訴你了全部股票的代碼,請點擊市場數據---股票列表---下載---整理爲csv文件(這樣你就拿到了3000多個股票代碼)編碼
第二步:處理一些亂糟糟的數據,這些數據要在網頁上面找。將數據下載下來,存儲爲csv文件。url
[注意]:爲何要異常處理?日誌
由於有些股票代碼裏面沒有數據,也多是空的,總之在下載的時候,因爲股票代碼,就會出現一系列的問題,因此對他異常處理code
'''處理不規整數據''' # http://quotes.money.163.com/trade/lsjysj_300104.html#01b07 #30010就是一個公司的股票代碼 import pandas as pd import requests from bs4 import BeautifulSoup log = open("error.log", mode="w", encoding="utf-8") #這是一個錯誤日誌,打開它,把錯誤的記錄填進去 df = pd.read_csv("code.csv") for code in df['code']: #遍歷code try: # 000539 # 000001 1 code = format(code, "06") # 進行格式化處理. 處理成6位的字符串 000001 url = f"http://quotes.money.163.com/trade/lsjysj_{code}.html#01b07" # 發送請求 resp = requests.get(url) # 發送請求. 獲取到數據 main_page = BeautifulSoup(resp.text, "html.parser") # 解析這個網頁, 告訴它這個網頁是html main_page.find() # 找一個 main_page.find_all() # 找一堆 trs = main_page.find("form", attrs={"name": "tradeData"}).find_all("table")[1].find_all("tr") # <form name="tradeData"> #打開網頁,找到網頁的一個惟一屬性 #這些就是網頁的信息,咱們對他進行處理就好 start = trs[0].find_all("input")[2].get("value").replace("-", "") #開始上市時間 end = trs[1].find_all("input")[2].get("value").replace("-", "") #今日 href = main_page.find("ul", attrs={"class": 'main_menu'}).find_all("li")[0].find("a").get('href') # print(href) # /0600000.html#01a01 code_num = href.split(".")[0].strip("/") #對上面的字符串進行切片處理 download_url = f"http://quotes.money.163.com/service/chddata.html?code={code_num}&start={start}&end={end}&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP" #獲取到整個完整的訪問股票代碼的網址。 resp = requests.get(download_url) resp.encoding = "GBK" #編碼問題 file_name = main_page.find("h1", attrs={"class":"title_01"}).text.replace(" ", "") with open(f"股票交易記錄/{file_name}.csv", mode="w", encoding="UTF-8") as f: f.write(resp.text) print("下載了一個") except Exception as e: log.write(f"下載{code}股票的時候. 出現了錯誤. url是:{url} download:{download_url} \n ")
上面這樣,咱們的每一個股票的詳細信息就會下載到文件中。orm
第三步:將數據進行可視化操做,將收盤價,開盤價等數據,用必定的圖片顯示出來。htm
import pandas as pd import matplotlib.pyplot as plt import mpl_finance as mpl from matplotlib.pylab import date2num def main(): main_df = pd.read_csv('目錄.csv', dtype=object) # 若是不寫後面的dtype, 你讀取的code就是數值 int, 此時默認是字符串 while 1: code = input("請輸入一個你想看到的股票代碼(6位):") # 00001 if len(code) != 6: print("代碼不對. 請從新輸入!") else: data_df = main_df[main_df['code']==code] # 600006,東風汽車(600006)歷史交易數據.csv if data_df.empty: print("沒有這支股票") else: print("有這支股票") file_name = data_df.iloc[0]['file'] show(file_name, code) def show(file_name, code): # 顯示這個股票的歷史記錄 data_df = pd.read_csv(f"股票全部記錄/{file_name}", parse_dates=["日期"]).iloc[:100, :] data_df = data_df[data_df['開盤價' != 0.0]] k_data = data_df[["日期", "開盤價", "最高價", "最低價", "收盤價"]] k_data['日期'] = date2num(k_data['日期']) # time, open, high, low, close # [(time, open, high, low, close), (time, open, high, low, close), (time, open, high, low, close), ()] # gen = [tuple(value) for value in k_data.values] # 1 gen = (tuple(value) for value in k_data.values) # 2 fig, [ax1, ax2] = plt.subplots(2, 1, sharex=True) ax2.bar(date2num(data_df['日期']), data_df['成交金額']) ax1.xaxis_date() #x軸 ax2.xaxis_date() mpl.candlestick_ohlc(ax1, gen) plt.savefig("abc.jpg", dpi=1000) plt.show() if __name__ == '__main__': main()
有沒有發現這張圖好醜,好吧!不要緊的,基本實現了哈哈。
blog