股票信息静态存在于html页面中,非js代码生成,没有Robbts协议限制,打开网页,查看源代码,搜索网页的股票价格数据是否存在于源代码中。
功能简介
说明
如打开新浪股票网址:链接描述(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 ""
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.
接下来是html代码解析程序,在这里首先需要解析的是东方财富网页面:链接描述(http://quote.eastmoney.com/stocklist.html),我们打开其源代码,如下图所示:
由上图可以看到,a标签的href属性中的网址链接里面有每只股票的对应的号码,因此我们只要把网址里面对应股票的号码解析出来即可。解析步骤如下:
***步,获得一个页面:
复制
html = getHTMLText(stockURL)
1.
第二步,解析页面,找到所有的a标签:
复制
soup = BeautifulSoup(html, 'html.parser')
a = soup.find_all('a')
1.2.3.
第三步,对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])
1.2.3.4.5.
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
1.2.3.4.5.6.7.8.9.10.11.
从上面代码可以看出,对于出现异常的情况我们使用了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
1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.
接下来是获得百度股票网链接描述(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"
1.2.3.
2.获得网址后,就要访问网页获得网页的html代码了,程序如下:
复制
html = getHTMLText(url)
1.
**3.获得了html代码后就需要对html代码进行解析,**由上图我们可以看到单个股票的信息存放在标签为div,属性为stock-bets的html代码中,因此对其进行解析:
复制
soup = BeautifulSoup(html, 'html.parser')
stockInfo = soup.find('div',attrs={'class':'stock-bets'})
1.2.3.
4.我们又发现股票名称在bets-name标签内,继续解析,存入字典中:
复制
infoDict = {}
name = stockInfo.find_all(attrs={'class':'bets-name'})[0]
infoDict.update({'股票名称': name.text.split()[0]})
1.2.3.4.5.
split()的意思是股票名称空格后面的部分不需要了。
**5.我们从html代码中还可以观察到股票的其他信息存放在dt和dd标签中,**其中dt表示股票信息的键域,dd标签是值域。获取全部的键和值:
复制
keyList = stockInfo.find_all('dt')
valueList = stockInfo.find_all('dd')
1.2.3.
并把获得的键和值按键值对的方式村放入字典中:
复制
for i in range(len(keyList)):
key = keyList[i].text
val = valueList[i].text
infoDict[key] = val
1.2.3.4.5.6.7.
6.***把字典中的数据存入外部文件中:
复制
with open(fpath, 'a', encoding='utf-8') as f:
f.write( str(infoDict) + '\n' )
另外怕大家不会使用,直接给大家准备了写好的,直接下载打开即可使用!
源码放在百度云盘上了需要可以微信扫描下方CSDN官方认证二维码免费领取
点此免费领取:CSDN大礼包:《python学习路线&全套学习资料》免费分享
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
检查学习结果。
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后,千万别辜负自己当时开始的一腔热血,一起变强大变优秀。