说明

  • 网站选择原则: 股票信息静态存在于html页面中,非js代码生成,没有Robbts协议限制。

  • 选取方法: 打开网页,查看源代码,搜索网页的股票价格数据是否存在于源代码中。

  • 需要相关python爬虫资料的可以加qwe54996 欢迎来领取哦~

如打开新浪股票网址:链接描述(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表示的深圳交易所。因此我们构造的程序结构如下:

  • 步骤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代码解析程序,在这里首先需要解析的是东方财富网页面:链接描述(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.我们从hml代码中还可以观察到股票的其他信息存放在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] = va

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 爬虫没用吗?股票数据定向爬虫让你轻松了解股势相关推荐

  1. Python 网络爬虫笔记8 -- 股票数据定向爬虫

    Python 网络爬虫笔记8 – 股票数据定向爬虫 Python 网络爬虫系列笔记是笔者在学习嵩天老师的<Python网络爬虫与信息提取>课程及笔者实践网络爬虫的笔记. 课程链接:Pyth ...

  2. python如何爬虫股票数据_python爬虫实例,股票数据定向爬虫

    前言 我服了,这几天,怎么涨两天还不够跌一次,害.希望这个可以帮到自己! "股票数据定向爬虫"实例介绍 功能描述 目标:获取上交所和深交所所有股票的名称和交易信息 输出:保存到文件 ...

  3. python 东方财富网百度股票数据定向爬虫 实例

    功能: 1. 获取 上交所 深 交所的股票信息 2. 输出保存到文件中 技术路线: requests -beatiful soup - re 候选:数据网站选择 1.静态网站,信息静态存在HTML页面 ...

  4. Python网络爬虫实例1:股票数据定向爬虫

    Python网络爬虫实例:股票数据定向爬虫 一.功能描述 目标:获取上交所和深交所所有股票的名称和交易信息 输出:保存到文件中 技术路线:requests-bs4-re 二.候选数据网站选择 候选网站 ...

  5. 【Python爬虫学习】八、股票数据定向爬虫(2020年1月31日成功爬取中财网,百度股市通web版404了)

    功能描述: 目标:获取股票的名称和交易信息 输出:保存到文件中 程序结构设计: 步骤1:从中财网http://quote.cfi.cn/stockList.aspx获取股票列表 步骤2:根据股票列表获 ...

  6. Python爬虫-股票数据定向爬虫(东方财富网)

    实例:股票数据定向爬虫 功能描述 目标:获取上交所和深交所所有股票的名称和交易信息 输出:保存到文件中 技术路线:requests­ bs4­ re 候选数据网站的选择 选取原则:股票信息静态存在于H ...

  7. 基于Request+bs4-re技术路线实现股票数据定向爬虫

    基于Request+bs4-re技术路线实现股票数据定向爬虫 一.功能描述 1. 目标 2. 可行性分析 3. 技术路线选择 4. 项目的技术难点 二.程序结构设计 三.程序整体框架 四.程序功能的实 ...

  8. 凤凰网股票数据定向爬虫——改编自北京理工大学嵩天老师的课程实例

    本文导航 前言 功能描述 技术路线 数据网站 程序结构设计 实现过程 实现结果 代码展示 可能遇到的问题 写在后面 前言 最近看到嵩天老师**<python网络爬虫与信息提取>的股票数据定 ...

  9. Python爬虫学习-新华书店书本数据定向爬虫(实例)

    在学习了半个月python基础知识以及相关的爬虫基础技术后,尝试学以致用,本次决定使用requests.BeautifulSoup来对新华书店(https://www.xhsd.com)小说类书本商品 ...

最新文章

  1. 内存溢出分析之工具篇
  2. 思科:四分之三的物联网项目将以失败告终
  3. java中showconfirmdialog_Java实现超市管理系统(含数据库)
  4. Android开发中的正在加载动画效果
  5. [SDOI2006]线性方程组 高斯消元
  6. php 后端调试,一般如何调试php程序
  7. 计蒜客2019蓝桥杯省赛 B 组模拟赛(一)轻重搭配|
  8. http协议-响应和请求
  9. 36 岁程序员应聘被公司领导直接拒绝;B 站面试官回应北邮校招中的不当言论
  10. arcgis engine设置数据源路径_不懂ArcGIS,你前期分析用什么做的?
  11. 盘点.确保物联网设备顺利运行的9项测试
  12. java的8年来工作汇总
  13. mysql 分离和附加数据库_分离数据库和附加数据库有什么区别
  14. 全文干货:蓝牙耳机哪个品牌最好?平价好用的蓝牙耳机推荐
  15. 软件安装【持续更新ing】
  16. python实时监控文件目录_教你三种方法,用 Python实时监控文件
  17. html练习--写信
  18. ACCESS表达式中的叹号“!”和点号“.”的区别
  19. SIGIR 2021 | FSCD-PreRank:面向效率和效果更加均衡的交互式粗排模型
  20. sofasofa竞赛:一 公共自行车使用量预测

热门文章

  1. 【金猿人物展】观远数据苏春园:用大数据赋能商业品牌 持续捕捉增长机会
  2. windows装linux
  3. 1.1 Java基础(一)概述
  4. 网络安全应急响应技术实战指南(奇安信)
  5. Android性能优化之解密ZAKER,网易云阅读等新闻应用的内容缓存加载方式
  6. web实验报告——JSP动态网页编程
  7. Androidnbsp;滑动开关控件
  8. C++算法篇:DFS超详细解析(2)--- tarjan算法求无向图割边
  9. Hadoop新手学习指导
  10. 【计算方法】实验二:python实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组