本期我们将以上证50的五十只股票为例,学习如何使用爬虫工具 Beautiful Soup 爬取网站上的表格数据并将需要的数据以 pickle 的格式保存到本地。

前言

在这个系列中,我们将共同学习如何借助Python这个强大的工具处理金融数据。在正式开始这个系列的学习之前,需要您具有Python编程的基础知识,至少需要将Python安装好。如果暂时还不满足这一要求的,建议先关注公众号 IT信息教室,学习 Python入门教程。

内容首发于微信公众号IT信息教室,如果您想学习更多AI相关的技能,欢迎搜索关注或微信扫描下方二维码关注~~

数据的爬取

我们以上证50的股票为例,首先需要找到一个网站包含这五十只股票的股票代码,例如这里我们使用搜狐证券提供的列表。

https://q.stock.sohu.com/cn/bk_4272.shtml

可以看到,在这个网站中有上证50的所有股票代码,我们希望爬取的就是这个包含股票代码的表,并获取这个表的第一列。

爬取网站的数据我们使用 Beautiful Soup 这个工具包,需要注意的是,一般只能爬取到静态网页中的信息。

简单来说,Beautiful Soup 是 Python 的一个库,最主要的功能是从网页抓取数据。

像往常一样,使用这个库之前,我们需要先导入该库 bs4。除此之外,我们还需要使用 requests 这个工具获取网站信息,因此导入这两个库:

import bs4 as bs
import requests

我们定义一个函数 saveSS50Tickers() 来实现上证50股票代码的获取,获取的数据来自于搜狐证券的网页,使用 get() 方法获取给定静态网页的数据。

def saveSS50Tickers():resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml')

接下来我们打开搜狐证券的这个网址,在页面任意位置右键选择 查看元素,或者 Inspect Element,或者类似的选项来查看当前网站的源代码信息。

我们需要先在这里找出网页的一些基本信息和我们需要爬取的数据的特征。

首先,找到 Element,在下面的内容中找到网页的 头文件 (head)。然后找到网页的 文字的编码方式。这里这个网页文字的编码方式是 gb2312。

如果我们想爬取并正确显示这个网页上,就需要先对获取到的网页内容解码。

解码可以使用 encoding 这个方法:

resp.encoding = 'gb2312'

接下来使用 BeautifulSoup 和 lxml 解析网页信息:

soup = bs.BeautifulSoup(resp.text, 'lxml')

这里为了方便后期的处理,首先使用 resp.text 将网页信息转成了文本格式,然后再解析网页的数据。

接下来我们需要在网页的源码中找到需要爬取信息的标签,这里我们需要爬取这个表格中的信息,首先,可以通过网站源码的搜索功能搜索表格里的相关数据定位到表格的源码。

同样以这个页面为例,一般网页使用 HTML 语言编译的,因为要准确定位,我们需要了解一些 HTML 语言的基础内容。在这个页面的源码中,

首先,我们使用 soup.find 在网页信息中找到这个表格标签的入口:

table = soup.find('table', {'id': 'BIZ_MS_plstock'})

其中 ‘table’ 表示这里需要找到一个表格,{‘id’: ‘BIZ_MS_plstock’} 则是通过内容或者属性实现表格的进一步定位。

找到表格的位置之后,我们需要继续查找需要的数据,同样以这个页面为例:

在网页开发语言中,

通过该网页的源码,我们可以发现,

表格的第一行和第二行都是表头的信息,第三行开始是五十家公司的股票信息。另外每家公司的股票代码在表格的第一列位置。

因为,在Python中,我们需要从表格的第三行开始抓取,每行抓取表格的第一列的数据,将抓取到的数据转换成文本格式,我们用一个列表 tickers 来存储抓取到的数据:

tickers = []
for row in table.findAll('tr')[2:]:ticker = row.findAll('td')[0].texttickers.append(ticker  + '.SS')

在第一期中,我们曾提到使用 API 接口获取股票的交易数据时:

国内股市采用 “股票代码”+“对应股市” 的输入方式,上证股票在股票代码后面加上“.SS”,深圳股票在股票代码后面加上“.SZ”。

因此为了方便后续进行数据处理,这里我们存储上证50的每家公司的股票代码时,都在代码后面再添加 ‘.SS’ 的字符。这时我们运行目前的代码,并将列表 tickers 输出:

# 导入 beautiful soup4 包,用于抓取网页信息
import bs4 as bs
# 导入 pickle 用于序列化对象
import pickle
# 导入 request 用于获取网站上的源码
import requestsdef saveSS50Tickers():resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml')resp.encoding = 'gb2312'soup = bs.BeautifulSoup(resp.text, 'lxml')# print(soup)table = soup.find('table', {'id': 'BIZ_MS_plstock'})# print(table)tickers = []# print(table.find_all('tr'))for row in table.findAll('tr')[2:]:# print(row)ticker = row.findAll('td')[0].texttickers.append(ticker  + '.SS') return tickerstickers = saveSS50Tickers()
print(tickers)

观察到输出信息如下:

['600036.SS', '601229.SS', '600031.SS', '601166.SS', '600104.SS', '600030.SS', '603259.SS', '601668.SS', '601628.SS', '601766.SS', '601857.SS', '601398.SS', '601390.SS', '600029.SS', '600028.SS', '601818.SS', '601211.SS', '601066.SS', '601111.SS', '600837.SS', '600887.SS', '601888.SS', '600690.SS', '600519.SS', '600016.SS', '601989.SS', '601988.SS', '601601.SS', '600019.SS', '601186.SS', '600703.SS', '600196.SS', '601318.SS', '601800.SS', '600050.SS', '601319.SS', '601288.SS', '601688.SS', '603993.SS', '600309.SS', '600048.SS', '600276.SS', '601138.SS', '601336.SS', '601088.SS', '600585.SS', '600000.SS', '601328.SS', '601939.SS', '600340.SS']

这样我们就从搜狐证券这个网站上爬取到了上证50的公司股票代码,并将其以字符串的格式存放在了一个列表变量中。

将股票代码保存到本地

一般像股票代码这种内容,短时间内不会有很大的变动,所以我们也不需要每次使用时重新爬取,一种方便的做法是可以将股票代码信息以文件的格式保存到本地,需要使用时直接从本地读取就可以了。

这里我们将股票代码数据保存为 pickle 格式。pickle 格式的数据可以在 Python 中高效的存取,当然,将文件导出成该格式前需要先导入相应的pickle 库:

import pickle

pickle可以保存任何数据格式的数据,在经常存取的场景(保存和恢复状态)下读取更加高效。

把文件导出成 pickle 格式的方法是 pickle.dump,同时需要结合文件读写操作:

with open('SS50tickers.pickle', 'wb') as f:pickle.dump(tickers, f)

这里的 ‘SS50tickers.pickle’ 就是保存的文件的名称,‘wb’ 则表示向文件中写入数据。pickle.dump(tickers, f) 表示将列表 tickers 写入到文件中。

参考代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-"""
Created on Thu Nov 12 15:57:13 2020
@author: IT信息教室(微信公众号)
"""# 导入 beautiful soup4 包,用于抓取网页信息
import bs4 as bs
# 导入 pickle 用于序列化对象
import pickle
# 导入 request 用于获取网站上的源码
import requestsdef saveSS50Tickers():resp = requests.get('https://q.stock.sohu.com/cn/bk_4272.shtml')resp.encoding = 'gb2312'soup = bs.BeautifulSoup(resp.text, 'lxml')# print(soup)table = soup.find('table', {'id': 'BIZ_MS_plstock'})# print(table)tickers = []for row in table.findAll('tr')[2:]:# print(row)ticker = row.findAll('td')[0].texttickers.append(ticker  + '.SS')with open('SS50tickers.pickle', 'wb') as f:pickle.dump(tickers, f)return tickerstickers = saveSS50Tickers()
print(tickers)

Python 与金融科技4|网页爬取上证50股票代码相关推荐

  1. Python数据分析:爬虫从网页爬取数据需要几步?

    对于数据分析师来说,数据获取通常有两种方式,一种是直接从系统本地获取数据,另一种是爬取网页上的数据,爬虫从网页爬取数据需要几步?总结下来,Python爬取网页数据需要发起请求.获取响应内容.解析数据. ...

  2. Python简单数据处理(静态网页爬取,jupter实现)

    对于哔哩哔哩动漫排行榜网页信息的爬取及处理(静态网页) 1.数据来源: 哔哩哔哩排行榜 2.数据描述: 利用python的第三方库requests对网页进行爬取 利用re库提供的正则表达式对网页数据进 ...

  3. python爬虫学习(二) 简易网页爬取

    先在网页进行搜索 得到url https://www.sogou.com/web?query=波晓张&_asf=www.sogou.com&_ast=&w=01019900&a ...

  4. python 实现分步累加_Python网页爬取分步指南

    python 实现分步累加 As data scientists, we are always on the look for new data and information to analyze ...

  5. Python数据采集与处理之网页爬取

    第1关:request模块的基本使用 任务描述 本关我们将使用 Python 程序,实现通过网页的 url,获得服务器返回的超文本文件,并保存到 txt 文件的功能. 相关知识 下面通过文字进一步详细 ...

  6. mac如何用python爬网页数据_Mac——利用Python进行网页爬取

    Mac--利用Python进行网页爬取 目标:利用Python爬取网页中的指定内容,例如,爬取百度百科网页中四川省的别名.html 输出:四川省的别名为:川.蜀.天府之国python 我的经验,网页爬 ...

  7. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  8. 爬取电影资源之网页爬取篇(python)

    不知道大家平常喜不喜欢待在宿舍一个人看电影? 作为一个高龄屌丝,电影对我来说是必不可少的.平常无聊时自己一个人待在宿舍看看电影,看看书. (人闲下来就会胡思乱想,不能让寂寞侵蚀自己的内心) 其实还是喜 ...

  9. 【Python】网页爬取CVPR论文

    动机 利用python自动下载 cvpr论文 流程 获取网页内容 找到所有论文链接 下载 1. 获取网页内容 所用模块:requests 重要函数:requests.get 输出:web_contex ...

最新文章

  1. python调用shell命令-Python调用shell命令常用方法(4种)
  2. python自带gui_一个极简易上手的 Python GUI 库
  3. yxy和志愿者小姐姐番外篇之大宝宝123追番记(补题,淘汰赛)
  4. Django Sqlite3 数据库向MySQL迁移
  5. 关于SAP Kyma在国内的落地情况
  6. 元件又焊反了,电路板又在冒烟了!
  7. Derby的jar说明
  8. 菜鸟做HTML5小游戏 - 刮刮乐
  9. 站在巨人的肩膀,2020我在使用和涉及到的开源项目
  10. 消费者驱动的契约测试_告诉我们您想要什么,我们将做到:消费者驱动的合同测试消息传递...
  11. 在WPF中实现玻璃模糊效果
  12. VIM - 01. 标准模式 - 下简单操作
  13. “项目运行时出错,无法启动调试。绑定句柄无效”的解决办法
  14. 30m服务器可以用多少人在线,30m网速(30m宽带够几个人用)
  15. CSDN日报180605——《认知升级是令我们变得优秀的重要基石》
  16. 片上总线Wishbone 学习(七)总线周期之握手协议
  17. 倾斜摄影相机焦距与实景三维模型效果的关系
  18. 混jdon坛子的一些思考
  19. Java List转Map时发生Duplicate key
  20. ENSP模拟实验OSPF虚链路

热门文章

  1. 机器学习-聚类(学习向量量化算法)
  2. 改进StyleGANv2的容貌年龄预测系统
  3. mongodb java 子查询_MongoDB 怎么计算子查询
  4. NumPy之argmax()方法理解
  5. python试题出现次数最多的数字_python统计一个数值连续出现的次数
  6. Yii PHP Framework有用新手教程
  7. RHCE红帽认证工程师
  8. 记录一个问题的解决过程
  9. printJS 打印 常用功能收录
  10. win10同账号多人远程破解