python爬虫之股票数据定向爬取

功能描述

  • 目标:获取上交所和深交所所有股票的名称和交易的信息
  • 输出:保存到文件中
  • 技术路线:requests-bs4-re

前期分析

  • 选取原则:股票的信息静态存在HTML页面中,非js代码生成,没有robots协议限制
  • 选取方法:查看网页原码不纠结于某个网站,多找信息源尝试

没有成功,价格没有搜索到

在源码中搜索价格,不存在


搜索价格没有

没有找到相关的价格信息

没有找到相关价格信息

没有找到相关的价格信息

多此尝试之后,发现基本上都没有找到,于是找教程推荐的
百度股票,已经不见了

  • 总结:个人观点,股票价格这种实时更新的数据怎么会写在网页,大部分应该都是写在js中,然后又服务器发送相关数据,但是仍旧不失为一个练习的思路,还是来分析一下吧

教程提供的信息:

  • 关于单个股票的信息

    • 点击每个股票的连接,发现会出现相关的跳转,反映在网址上的变化就是多了几个关键字
    • 思路:获取每个股票的标号,输入到对应的网址中,即可获得相关股票的实时价格

  • 通过东方财富网获取所有股票的序号

  • 东方财富网的股票的序号

从图上就可以看出,是在对应的a标签中,可以采用正则表达式进行筛选r’[zh|sh]\d{6}’

程序编写

  • 第一步,编写相关的整体步骤

    • 从东方财富网获取股票的列表 getHTMLText(url)
    • 根据股票列表逐个到百度股票中获取个股的信息 getStockList(lst,stockURL)
    • 将结果存储到文件中 getStockInfo(lst,stockURL,fpath)
    • main函数将所有的函数连接起来
import requests
import re
from bs4 import BeautifulSoup# 获取相关网页的html文件
def getHTMLText(url):return''# 获取所有股票的序号
def getStockList(lst,stockURL):return ''# 获取所有股票的价格
def getStockInfo(lst,stockURL,fpath):return ''def main():stock_list_url = 'http://quote.eastmony.com/stocklist.html'# 获取股票信息序号的网站stock_info_url = 'https://gupiao.baidu.com/stock/'# 获取单个股票的价格的网页output_file = 'D://SpiderTest//BaiduStockInfo.txt'# 文件保存的连接slist = []getStockList(slist,stock_info_url)getStockInfo(slist,stock_info_url,output_file)main()
  • 第二步,逐步完善各个步骤

    • 总是必须的获取相关页面的代码
def getHTMLText(url):try:r = requests.get(url)r.raise_for_status()r.encoding = r.apparent_encodingreturn r.textexcept:return''
  • 获取相关的股票列表

这里有值得学习的东西,先获取所有的a标签,然后再逐个进行排除,如果是a标签,那就添加,不是那就跳过当前的循环,学会用try——except语句

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))except:continue
  • 获取相关股票实时信息并将之写入相关的文件
def getStockInfo(lst,stockURL,fpath):count = 0for stock in lst:# 遍历所有的股票编码列表url = stockURL + stock + '.html'# 生成么一个股票特定的网页的信息html = getHTMLText(url)try :if html == '':# 如果没有获取到相关网页信息,说明网页没有意义,那就跳过当前的循环continueinfoDict = {}# 创建对应的字典容器,将存储股票序号——价格的键值对信息soup = BeautifulSoup(html,'html.parser')# 获取对应的网页的信息stockInfo = soup.find('div',attrs={'class':'bets-name'})# 结合属性和名称,获取特定的标签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].textval = valueList[i].textinfoDict[key] = valwith open(fpath,'a',encoding = 'utf-8') as f:f.write(str(infoDict) + '\n')except:traceback.print_exc()continue
  • 这里写的还是很好看的,分析一下,首先,看下图,百度股市通中,某单股的原码
  • 清晰可见,关于股票的信息都在对应的< div > … < /div >标签中,并且属性中的class是极特殊的class = ‘stock-bets’的
  • 而在< div > … < /div >的标签中的,a标签的值在对应的就是对应的信息,不同的信息他的属性又是不同
  • 在其子标签中dt和dd标签有都含有所有与该股票相关的信息
  • 第一步,先获取最外层最特殊的div标签,并且说明属性
  stockInfo = soup.find('div',attrs={'class':'stock-bets'})# 结合属性和名称,获取特定的标签
  • 第二步,提取div标签的具有相关信息属性的标签,这个属性,就说明了这个标签代表的内容就是名字或者对应的信息

    • 注意:这里有一个注意点,这里标签的text属性,不是对应的string属性,text是输出所有的子节点和自身的string内容,用空格连接
      。string仅仅输出当前节点的string内容,如果有字节点,那就输出None
      详见 https://www.cnblogs.com/gl1573/archive/2018/11/14/9958716.html
   name = stockInfo.find_all(attrs={'class':'bets-name'})[0]infoDict.update({'股票名称':name.text.split()[0]})
  • 第三步,提取所有的dd标签和dt标签,二者的数量相同,并作为键值对进行保存
  keyList = stockInfo.find_all('dt')valueList = stockInfo.find_all('dd')for i in range(len(keyList)):key = keyList[i].textval = valueList[i].textinfoDict[key] = val
  • 第四步,采用IO流进行写入,注意类型的转换
  with open(fpath,'a',encoding = 'utf-8') as f:f.write(str(infoDict) + '\n')
  • 最后一步,就是异常的处理,调用traceback库,进行异常的处理
  except:traceback.print_exc()continue
最后一步,代码的优化
  • 为了创造一个更好的用户体验,就创建了写入一个会实时显示进度的语块
  count = count + 1print('\r 当前进度:{:.2f}%'.format(count * 100 / len(lst)),end = "")

‘\r’会将输出的光标移到开头,覆盖原来的输出

总结
  • 关于搜索特定的标签,不仅仅是结合标签的名称,更是要结合标签的属性,通过属性和名称可以很好的对某一个标签进行定位
  • 关于try—except的处理,要知道引用traceback库函数,会反应出报错对的地方,不然不知道哪里出错很郁闷
  • 有一种设想,从一个网站爬取一定的数据或者项目序列,可以连续的爬取多个同类的网站

python爬虫之股票数据定向爬取相关推荐

  1. python网络爬虫:股票数据定向爬取

    百度股票(https://gupiao.baidu.com/stock/)属于静态网页数据,适合定向数据爬取:新浪股票(http://finance.sina.com.cn/stock/)数据存取在j ...

  2. 股票数据定向爬取(可运行) Python网络爬虫与信息提取(北京理工大学—嵩天)

    注意:由于东方财富网与百度股票网站发生变动,所以选择了与原先百度股票类似的股城网作为信息爬取的目标网站.(感谢文章:(4条消息) Python爬虫入门实例八之股票数据定向爬取并保存(优化版)_Mr.Q ...

  3. php 爬取股票数据库,【实例】--股票数据定向爬取

    从股票列表网页获取股票代码 根据股票代码去股票详情页面获取股票详细信息 1. 股票列表页面 凤凰网财经-股票信息 http://app.finance.ifeng.com/list/stock.php ...

  4. Python爬虫入门实例八之股票数据定向爬取并保存(优化版)

    文章目录 写在前面 一.准备工作 1.功能描述 2.候选数据网站的选择 3.程序的结构设计 4.本篇选取的数据网站 (1)网站链接 (2)网站内容 二.数据网站分析 1.股票列表的分析 2.个股信息的 ...

  5. python爬虫实现豆瓣数据的爬取

    本文利用urllib在python3.7的环境下实现豆瓣页面的爬取! 用到的包有urllib与re两个模块,具体实现如下! import urllib.request import re import ...

  6. python爬虫微博粉丝数据_Scrapy 爬取新浪微博数据分析男女粉丝数量

    通过之前爬取新浪微博发现,无论通过http://m.weibo.cn这里,还是http://weibo.cn这里,都没办法获取全部粉丝数据 那如果我想分析一个明星的男女粉丝数据怎么办,比如想知道某明星 ...

  7. 【Python爬虫】股票数据定向爬虫

    爬取网站: http://quote.eastmoney.com/center/gridlist.html https://stockapp.finance.qq.com/mstats/ import ...

  8. Python爬虫对json数据解析爬取

    使用工具 PyCharm 2018.2.3 Anaconda Navigator Python 3.6 解析目标 [{"导航鸭 ♪(^∀^●)ノ": [{"name&qu ...

  9. Python 爬虫实战,模拟登陆爬取数据

    Python 爬虫实战,模拟登陆爬取数据 从0记录爬取某网站上的资源连接: 模拟登陆 爬取数据 保存到本地 结果演示: 源网站展示: 爬到的本地文件展示: 环境准备: python环境安装 略 安装r ...

最新文章

  1. nginx+keepalived高可用及双主模式
  2. PostgreSQL的configure 干了些什么(二)
  3. Python实现全民K歌歌曲下载
  4. java中换行符号_Java中的回车换行符/n /r /t分析
  5. EEPROM和flash的区别
  6. oracle的ocm怎么算通过,Oracle 11g OCM的通过祝贺信
  7. 电信烽火2821t虚拟服务器设置,iTV使用指南-烽火智能高清机顶盒装维手册
  8. Graphpad prism 使用教程汇总(更新)
  9. 未来学院计算机,感念过往,不畏将来:计算机学院的2019!
  10. z8350mini盒子装fedora无线wifi命令研究
  11. 概率论的学习和整理--番外5:等差数列求和公式,等比数列求和公式,以及比较 数列,函数,级数等相似概念
  12. 为什么很多人工资不高,却还是要拥挤在大城市生活?
  13. 一道搜狗机试题的解答
  14. 【探花交友】day06—即时通信
  15. SPSS 22.0下载、授权及汉化
  16. 初羡微商代理发货系统授权系统开发
  17. CacheCloud管理平台
  18. 出大事了!IBM的数仓项目黄了,赔了好几亿!
  19. 第二章计算机网络答案,计算机网络第二章作业参考答案
  20. 济南职业学院计算机就业好吗,济南职业学院好不好?排名怎么样评价如何

热门文章

  1. Java高级--->多线程的学习
  2. Carsim所能实现的功能
  3. Linux系统(Centos7)了解DNS服务
  4. 学好编程必需先学好的基础
  5. 支付宝小程序唤起独立签约
  6. 基于QT实现简易音视频播放器
  7. JSP影视评价系统JSP影评系统JSP电影评价系统jsp电影评论网站jsp电影管理系统
  8. 树莓派4B-buster安装ROS Melodic流程
  9. C# 计算两条线段交点的位置
  10. ESP8266 UART 使用说明