Python 實戰:股票數據定向爬蟲

2021-02-15 七月在線實驗室

功能簡介

說明

如打開新浪股票網址:連結描述(http://finance.sina.com.cn/realstock/company/sz000877/nc.shtml),如下圖所示:

上圖中左邊為網頁的界面,顯示了天山股份的股票價格是13.06。右邊為該網頁的原始碼,在原始碼中查詢13.06發現沒有找到。所以判斷該網頁的數據使用js生成的,不適合本項目。因此換一個網頁。

再打開百度股票的網址:連結描述(https://gupiao.baidu.com/stock/sz300023.html),如下圖所示:

從上圖中可以發現百度股票的數據是html代碼生成的,符合我們本項目的要求,所以在本項目中選擇百度股票的網址。

由於百度股票只有單個股票的信息,所以還需要當前股票市場中所有股票的列表,在這裡我們選擇東方財富網,網址為:連結描述(http://quote.eastmoney.com/stocklist.html),界面如下圖所示:

原理分析

查看百度股票每隻股票的網址:https://gupiao.baidu.com/stock/sz300023.html,可以發現網址中有一個編號300023正好是這隻股票的編號,sz表示的深圳交易所。因此我們構造的程序結構如下:

接著查看百度個股信息網頁的原始碼,發現每隻股票的信息在html代碼中的存儲方式如下:

因此,在我們存儲每隻股票的信息時,可以參考上圖中html代碼的存儲方式。每一個信息源對應一個信息值,即採用鍵值對的方式進行存儲。在python中鍵值對的方式可以用字典類型。因此,在本項目中,使用字典來存儲每隻股票的信息,然後再用字典把所有股票的信息記錄起來,最後將字典中的數據輸出到文件中。

代碼編寫

首先是獲得html網頁數據的程序,在這裡不多做介紹了,代碼如下:

#獲得html文本

def getHTMLText(url):

    try:

        r = requests.get(url)

        r.raise_for_status()

        r.encoding = r.apparent_encoding

        return r.text

    except:

        return ""

接下來是html代碼解析程序,在這裡首先需要解析的是東方財富網頁面:連結描述(http://quote.eastmoney.com/stocklist.html),我們打開其原始碼,如下圖所示:

由上圖可以看到,a標籤的href屬性中的網址連結裡面有每隻股票的對應的號碼,因此我們只要把網址裡面對應股票的號碼解析出來即可。解析步驟如下:

第一步,獲得一個頁面:

html = getHTMLText(stockURL)

第二步,解析頁面,找到所有的a標籤:

soup = BeautifulSoup(html, 'html.parser')

a = soup.find_all('a')

第三步,對a標籤中的每一個進行遍歷來進行相關的處理。處理過程如下:

1、找到a標籤中的href屬性,並且判斷屬性中間的連結,把連結後面的數字取出來,在這裡可以使用正則表達式來進行匹配。由於深圳交易所的代碼以sz開頭,上海交易所的代碼以sh開頭,股票的數字有6位構成,所以正則表達式可以寫為[s][hz]\d{6}。也就是說構造一個正則表達式,在連結中去尋找滿足這個正則表達式的字符串,並把它提取出來。代碼如下:

for i in a:

    href = i.attrs['href']

    lst.append(re.findall(r"[s][hz]\d{6}", href)[0])

2、由於在html中有很多的a標籤,但是有些a標籤中沒有href屬性,因此上述程序在運行的時候出現異常,所有對上述的程序還要進行try…except來對程序進行異常處理,代碼如下:

for i in a:

    try:

        href = i.attrs['href']

        lst.append(re.findall(r"[s][hz]\d{6}", href)[0])

    except:

        continue

從上面代碼可以看出,對於出現異常的情況我們使用了continue語句,直接讓其跳過,繼續執行下面的語句。通過上面的程序我們就可以把東方財富網上股票的代碼信息全部保存下來了。

將上述的代碼封裝成一個函數,對東方財富網頁面解析的完整代碼如下所示:

def getStockList(lst, stockURL):

    html = getHTMLText(stockURL)

    soup = BeautifulSoup(html, 'html.parser')

    a = soup.find_all('a')

    for i in a:

        try:

            href = i.attrs['href']

            lst.append(re.findall(r"[s][hz]\d{6}", href)[0])

        except:

            continue

接下來是獲得百度股票網連結描述(https://gupiao.baidu.com/stock/sz300023.html)單只股票的信息。我們先查看該頁面的原始碼,如下圖所示:

股票的信息就存在上圖所示的html代碼中,因此我們需要對這段html代碼進行解析。過程如下:

1、百度股票網的網址為:https://gupiao.baidu.com/stock/

一隻股票信息的網址為:https://gupiao.baidu.com/stock/sz300023.html

所以只要百度股票網的網址+每隻股票的代碼即可,而每隻股票的代碼我們已經有前面的程序getStockList從東方財富網解析出來了,因此對getStockList函數返回的列表進行遍歷即可,代碼如下:

for stock in lst:

        url = stockURL + stock + ".html"

2、獲得網址後,就要訪問網頁獲得網頁的html代碼了,程序如下:

html = getHTMLText(url)

3、獲得了html代碼後就需要對html代碼進行解析,由上圖我們可以看到單個股票的信息存放在標籤為div,屬性為stock-bets的html代碼中,因此對其進行解析:

soup = BeautifulSoup(html, 'html.parser')

stockInfo = soup.find('div',attrs={'class':'stock-bets'})

4、我們又發現股票名稱在bets-name標籤內,繼續解析,存入字典中:

infoDict = {}

name = stockInfo.find_all(attrs={'class':'bets-name'})[0]

infoDict.update({'股票名稱': name.text.split()[0]})

split()的意思是股票名稱空格後面的部分不需要了。

5、我們從html代碼中還可以觀察到股票的其他信息存放在dt和dd標籤中,其中dt表示股票信息的鍵域,dd標籤是值域。獲取全部的鍵和值:

keyList = stockInfo.find_all('dt')

valueList = stockInfo.find_all('dd')

並把獲得的鍵和值按鍵值對的方式村放入字典中:

for i in range(len(keyList)):

    key = keyList[i].text

    val = valueList[i].text

    infoDict[key] = val

6、最後把字典中的數據存入外部文件中:

with open(fpath, 'a', encoding='utf-8') as f:

    f.write( str(infoDict) + '\n' )

將上述過程封裝成完成的函數,代碼如下:

def getStockInfo(lst, stockURL, fpath):

    for stock in lst:

        url = stockURL + stock + ".html"

        html = getHTMLText(url)

        try:

            if html=="":

                continue

            infoDict = {}

            soup = BeautifulSoup(html, 'html.parser')

            stockInfo = soup.find('div',attrs={'class':'stock-bets'})

            name = stockInfo.find_all(attrs={'class':'bets-name'})[0]

            infoDict.update({'股票名稱': name.text.split()[0]})

            

            keyList = stockInfo.find_all('dt')

            valueList = stockInfo.find_all('dd')

            for i in range(len(keyList)):

                key = keyList[i].text

                val = valueList[i].text

                infoDict[key] = val

            

            with open(fpath, 'a', encoding='utf-8') as f:

                f.write( str(infoDict) + '\n' )

        except:

            continue

其中try…except用於異常處理。

接下來編寫主函數,調用上述函數即可:

def main():

    stock_list_url = 'http://quote.eastmoney.com/stocklist.html'

    stock_info_url = 'https://gupiao.baidu.com/stock/'

    output_file = 'D:/BaiduStockInfo.txt'

    slist=[]

    getStockList(slist, stock_list_url)

    getStockInfo(slist, stock_info_url, output_file)

項目完整程序

# -*- coding: utf-8 -*-

 

import requests

from bs4 import BeautifulSoup

import traceback

import re

def getHTMLText(url):

    try:

        r = requests.get(url)

        r.raise_for_status()

        r.encoding = r.apparent_encoding

        return r.text

    except:

        return ""

def getStockList(lst, stockURL):

    html = getHTMLText(stockURL)

    soup = BeautifulSoup(html, 'html.parser')

    a = soup.find_all('a')

    for i in a:

        try:

            href = i.attrs['href']

            lst.append(re.findall(r"[s][hz]\d{6}", href)[0])

        except:

            continue

def getStockInfo(lst, stockURL, fpath):

    count = 0

    for stock in lst:

        url = stockURL + stock + ".html"

        html = getHTMLText(url)

        try:

            if html=="":

                continue

            infoDict = {}

            soup = BeautifulSoup(html, 'html.parser')

            stockInfo = soup.find('div',attrs={'class':'stock-bets'})

            name = stockInfo.find_all(attrs={'class':'bets-name'})[0]

            infoDict.update({'股票名稱': name.text.split()[0]})

            

            keyList = stockInfo.find_all('dt')

            valueList = stockInfo.find_all('dd')

            for i in range(len(keyList)):

                key = keyList[i].text

                val = valueList[i].text

                infoDict[key] = val

            

            with open(fpath, 'a', encoding='utf-8') as f:

                f.write( str(infoDict) + '\n' )

                count = count + 1

                print("\r當前進度: {:.2f}%".format(count*100/len(lst)),end="")

        except:

            count = count + 1

            print("\r當前進度: {:.2f}%".format(count*100/len(lst)),end="")

            continue

def main():

    stock_list_url = 'http://quote.eastmoney.com/stocklist.html'

    stock_info_url = 'https://gupiao.baidu.com/stock/'

    output_file = 'D:/BaiduStockInfo.txt'

    slist=[]

    getStockList(slist, stock_list_url)

    getStockInfo(slist, stock_info_url, output_file)

main()

上述代碼中的print語句用於列印爬取的進度。執行完上述代碼後在D盤會出現BaiduStockInfo.txt文件,裡面存放了股票的信息。

版權聲明:轉載文章和圖片均來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會註明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯繫刪除或授權事宜。 


想學Python點這裡呀!

相關焦點

  • Python 網絡爬蟲實戰:爬取並下載《電影天堂》3千多部動作片電影
    而且正因為這個爬蟲比較簡單,所以我會寫的稍微細一點,爭取讓 python 小白們也能儘可能看懂,並且能夠在這個爬蟲的基礎上修改,得到爬取這個網站其他板塊或者其他電影網站的爬蟲。 寫在前面的話在編寫爬蟲程序之前,我先捋一捋我們的思路。
  • Python爬蟲實戰:爬取天氣數據的實例詳解
    在本篇文章裡小編給大家整理的是一篇關於python爬取天氣數據的實例詳解內容,有興趣的朋友們學習下。
  • Python3 網絡爬蟲:下載小說的正確姿勢
    PS:文中出現的所有代碼,均可在我的 Github 上下載:https://github.com/Jack-Cherish/python-spider/tree/master/2020在曾經的以《一念永恆》小說為例進行講解的 CSDN 文章中,有網友留言道:這篇文章其實是在教大家如何白嫖,不過有能力支持正版的朋友,還是可以去起點中文網,支持一下作者的,畢竟創作不易。
  • Python數據分析:股票數據分析案例
    步驟:準備數據可視化數據、審查數據處理數據根據ACF、PACF定階擬合ARIMA模型預測準備數據    # 指定股票分析開始日期    start_date = datetime.datetime(2009, 1, 1)    # 指定股票分析截止日期    end_date = datetime.datetime(2019, 4, 1)    # 股票代碼    stock_code = '600519.SS'    # 滬市貴州茅臺
  • Python爬蟲實戰:拉黑QQ空間屏蔽我的「大人物」
    前景提要最近發現有人QQ空間對我展開了屏蔽,咱們也不知道怎麼惹到人家了,一氣之下寫了一個小爬蟲看看到底誰把我屏蔽了準備工作python環境:python3.7.4第三方庫環境:requestslxmlthreadpoolselenium利用selenium模擬登陸獲取cookie並保存到本地def search_cookie
  • Python學習:mac電腦安裝python教程
    與python2.7 共存2 下載安裝包進入官方安裝包下載頁面,https://www.python.org/downloads/mac-osx/找到合適的安裝包,基本上mac電腦都是64位的系統,因此選擇64位的安裝包進行下載
  • Python的數據可視化:對比7種工具包
    Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
  • python基礎學習教程:Python基礎語法
    >>> '''在學習過程中有什麼不懂得可以加我的python學習交流扣扣qun,934109170群裡有不錯的學習教程、開發工具與電子書籍。與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。'''Window 上在安裝 Python 時已經安裝了交互式編程客戶端,提示窗口如下:
  • 「王牌冤家」:評論爬蟲及情感分析(SnowNLP)
    文本信息是選取的網易雲音樂下的評論,所以本文是爬蟲+分析。爬蟲在網易雲音樂上萬首hiphop歌曲解析rapper們的最愛(爬蟲篇)一文中,我們基於selenium爬取了歌單,歌曲和歌詞的信息,本來在評論的爬取也可以選擇selenium的方式,但是,小編上網一搜,就找到評論的API,這可就非常簡單了。
  • python黑知識:python本體
    講述python的實現本體,版本,構建時間,構建工具和構建參數python的實現有很多種,如果想研究一下它語言本身一些機制的實現,可能需要看原始碼,那麼,就需要找到相應的實現,分支和版本。目前使用的python實現,根據python實現存在有這幾種CPython, Stackless Python, MicroPython, CLPython, Cython, IronPython, Jython, Pyjs, PyPy, Numba, Shed Skin Nuitka ,可以說是讓人眼花繚亂。
  • Python詞雲:Windows安裝Wordcloud報錯解決辦法
    首先,先看清楚你的python版本,以及搞清楚你的python是基於32位系統還是64位系統。具體操作方法:1、 在左下角搜索windows搜索框裡輸入cmd,打開命令行窗口;2、 輸入python;3、 這裡可以看到python的版本是3.8.2,基於32位系統。
  • 爬蟲(101)爬點重口味的
    python 爬蟲庫安裝callback=jsonp227&m=customized&q=內衣女&s=36"r = requests.get(url)response = r.text# 截取成標準的JSON格式# 由於Ajax返回的數據是字符串格式的餓,在返回的值jsonp227(XXX)中# XXX部分是JSON格式數據,因此先用字符串split()截取XXX
  • Python數據可視化:2018年電影分析
    法納斯特,Python愛好者,喜歡爬蟲,
  • Python生成一維碼,二維碼
    我們的生活已完全離不開一維碼和二維碼,本文會簡單的介紹如果通過python的方法來生成它們
  • 有趣且鮮為人知的 Python 特性,火了!
    項目地址為:https://github.com/leisurelicht/wtfpython-cn來體會一些難以理解和反人類直覺的Python特性吧!引用自 https://docs.python.org/3/c-api/long.html可以再看看這個案例:>>> id(256)10922528>>> a = 256>>> b = 256>>> id(a)10922528>&
  • 紐交所總裁:如果紐約州對股票交易徵稅,紐交所可能會搬離紐約
    紐交所 資料圖紐約證券交易所(NYSE)女總裁坎寧安(Stacey Cunningham)警告,若紐約州議會通過恢復向股票交易徵稅,紐交所可能會放棄紐約,遷往美國其他城市。她警告,開徵股票交易稅百害而無一利,可能會促使紐約華爾街許多金融機構離去。報導稱,坎寧安2月9日在《華爾街日報》上發表專欄文章,指出「雖然紐約仍然是金融業的重心,但是許多華爾街公司的僱員正移居到佛羅裡達、德克薩斯和其他實行慷慨稅收政策的州」。
  • Python 教程:從零到大師
    https://pythoncaff.com/topics/104/python-tutorials-from-zero-to-master-suitable-for-experienced-developers首先, 什麼是Python?
  • Python 進階必備:圖像庫 pillow
    Image 模塊是為了快速訪問以下幾種基本像素格式存儲的數據而設計的,為一般的圖像處理工具提供了一個堅實的基礎。下表是 pillow 庫中最常用的3個子模塊(圖像處理、編輯、截屏)和3個輔助模塊(過濾器、顏色、字體)。子模塊說明ImageImage模塊提供了一個同名的類,用來表示PIL圖像。該模塊還提供了許多工廠功能,包括從文件加載圖像和創建新圖像的功能。
  • 深度對比:Python和R之爭
    偏向業務的數據科學被稱為數據分析(Data Analysis),也就是A型數據科學。偏向工程的數據科學被稱為數據構建(Data Building),也就是B型數據科學。在確定工程實施和大數據集操作時,我們就需要依賴 Scala 的靜態類型等工程方法構建完整的數據分析系統。Scala 和 Excel 是兩個極端,對於大多數創業公司而言,我們沒有足夠多的人手來實現專業化的分工,更多情況下,我們會在 Python 和 R 上花費更多的時間同時完成數據分析(A型)和數據構建(B型)的工作。
  • 戶外先鋒領隊技能:野外定向識圖
    有些領隊跟我說,我們走的都是成熟路線,學什麼定向識圖,用不著!好吧,如果你確定你帶的是導遊路線而不是戶外路線的話,以下內容你可以忽略不看了,如果你想成為一個合格的戶外領隊,那麼你就必須學會最基礎的定向識圖知識,在野外如何判斷方向,如何判斷地形,如何查看等高線圖……做好迷路的準備也是戶外活動的應急預案之一……一、在野外有指北針最好,一般手機都帶有指北針的功能,如果木有指北針的話也沒關係,以下幾個方法教你如何判斷大致的方向(