摘要:選取方法打開網頁,查看源代碼,搜索網頁的股票價格數據是否存在于源代碼中。將上述的代碼封裝成一個函數,對東方財富網頁面解析的完整代碼如下所示接下來是獲得百度股票網鏈接描述單只股票的信息。
功能簡介
目標: 獲取上交所和深交所所有股票的名稱和交易信息。
輸出: 保存到文件中。
技術路線: requests---bs4--re
語言:python3.5
網站選擇原則: 股票信息靜態存在于html頁面中,非js代碼生成,沒有Robbts協議限制。
選取方法: 打開網頁,查看源代碼,搜索網頁的股票價格數據是否存在于源代碼中。
如打開新浪股票網址:鏈接描述,如下圖所示:
上圖中左邊為網頁的界面,顯示了天山股份的股票價格是13.06。右邊為該網頁的源代碼,在源代碼中查詢13.06發現沒有找到。所以判斷該網頁的數據使用js生成的,不適合本項目。因此換一個網頁。
再打開百度股票的網址:鏈接描述,如下圖所示:
從上圖中可以發現百度股票的數據是html代碼生成的,符合我們本項目的要求,所以在本項目中選擇百度股票的網址。
由于百度股票只有單個股票的信息,所以還需要當前股票市場中所有股票的列表,在這里我們選擇東方財富網,網址為:鏈接描述,界面如下圖所示:
原理分析查看百度股票每只股票的網址:https://gupiao.baidu.com/stock/sz300023.html,可以發現網址中有一個編號300023正好是這只股票的編號,sz表示的深圳交易所。因此我們構造的程序結構如下:
步驟1: 從東方財富網獲取股票列表;
步驟2: 逐一獲取股票代碼,并增加到百度股票的鏈接中,最后對這些鏈接進行逐個的訪問獲得股票的信息;
步驟3: 將結果存儲到文件。
接著查看百度個股信息網頁的源代碼,發現每只股票的信息在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代碼解析程序,在這里首先需要解析的是東方財富網頁面:鏈接描述,我們打開其源代碼,如下圖所示:
由上圖可以看到,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
接下來是獲得百度股票網鏈接描述單只股票的信息。我們先查看該頁面的源代碼,如下圖所示:
股票的信息就存在上圖所示的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) + " " )
將上述過程封裝成完成的函數,代碼如下:
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) + " " ) 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) + " " ) count = count + 1 print(" 當前進度: {:.2f}%".format(count*100/len(lst)),end="") except: count = count + 1 print(" 當前進度: {:.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文件,里面存放了股票的信息。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/40716.html
摘要:技術路線爬蟲框架語言由于在上一篇博客中已經介紹了股票信息爬取的原理,在這里不再進行過多介紹,如需了解可以參考博客鏈接描述,在本篇文章中主要講解該項目在框架中如何實現。 簡介 目標: 獲取上交所和深交所所有股票的名稱和交易信息。輸出: 保存到文件中。技術路線:Scrapy爬蟲框架語言: python3.5由于在上一篇博客中已經介紹了股票信息爬取的原理,在這里不再進行過多介紹,如需了解可以...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:貪心算法每一步必須滿足一下條件可行的即它必須滿足問題的約束。四題目分析貪心算法,總是做出在當前看來是最好的選擇,不從整體最優上加以考慮,也就是說,只關心當前最優解,按照貪心策略,不關心以后,我們只關心當前利益。 一、寫在前面 為什么要在LeetCode刷題?大家都知道不管是校招還是社招算法題是必考題,而這一部分恰巧是大多數人的短板,所以刷題首先是為了提高自身的編程能力,能夠在算法面試中...
摘要:我們知道,在抖音中下載到的視頻是有水印的,這就催生出了很多抖音短視頻去水印的解析網站,小程序等。禁止重定向,設置運行結果,是一個標簽,便是重定向后的地址。 我們知道...
閱讀 2910·2021-11-23 09:51
閱讀 1557·2021-11-15 11:36
閱讀 3015·2021-10-13 09:40
閱讀 1903·2021-09-28 09:35
閱讀 13083·2021-09-22 15:00
閱讀 1377·2019-08-29 13:56
閱讀 2931·2019-08-29 13:04
閱讀 2703·2019-08-28 18:06