使用request+bs4爬取所有股票信息


爬取前戲

我們要知道利用selenium是非常無敵的,自我認為什么反爬不反爬都不在話下,但是今天我們為什么要用request+bs4爬取所有股票信息呢?因為他比較原始,因此今天的數據,爬取起來也是比較繁瑣的!接下來讓我們emmmm。。。。你懂得

爬取步驟

第一步:獲取股票代碼

1)我們通過這個鏈接去網易看一下具體的股票信息,下面這個網頁是樂視網的股票信息http://quotes.money.163.com/trade/lsjysj_300104.html#01b07

2)上海證券交易所的官方網站上直接告訴你了所有股票的代碼,請點擊市場數據---股票列表---下載---整理為csv文件(這樣你就拿到了3000多個股票代碼)

第二步:處理一些亂糟糟的數據,這些數據要在網頁上面找。將數據下載下來,存儲為csv文件。

[注意]:為什么要異常處理?

​ 因為有些股票代碼里面沒有數據,也可能是空的,總之在下載的時候,由於股票代碼,就會出現一系列的問題,所以對他異常處理

'''處理不規整數據'''
# 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 ")

開始上市時間

上面這樣,我們的每個股票的詳細信息就會下載到文件中。

第三步:將數據進行可視化操作,將收盤價,開盤價等數據,用一定的圖片顯示出來。

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()

有沒有發現這張圖好丑,好吧!沒關系的,基本實現了哈哈。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM