基于Python爬取搜狐证券股票过程解析


Posted in Python onNovember 18, 2020

数据的爬取

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

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

基于Python爬取搜狐证券股票过程解析

可以看到,在这个网站中有上证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,或者类似的选项来查看当前网站的源代码信息。

基于Python爬取搜狐证券股票过程解析

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

基于Python爬取搜狐证券股票过程解析

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

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

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

resp.encoding = 'gb2312'

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

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

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

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

基于Python爬取搜狐证券股票过程解析

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

基于Python爬取搜狐证券股票过程解析

<table表示表格开始,后面是这个表格的一些属性。</table>表示表格结束。

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

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

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

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

基于Python爬取搜狐证券股票过程解析

在网页开发语言中,

<tr表示表格中开始新的一行,<td表示在这一行中又新建了一列,而</td>则表示这一列结束了,对应的</tr>则表示这一行结束了。

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

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

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

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

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

# 导入 beautiful soup4 包,用于抓取网页信息
import bs4 as bs
# 导入 pickle 用于序列化对象
import pickle
# 导入 request 用于获取网站上的源码
import requests

def 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].text
    tickers.append(ticker + '.SS') 
  return tickers

tickers = 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写入到文件中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python ZipFile模块详解
Nov 01 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
Windows下使Python2.x版本的解释器与3.x共存的方法
Oct 25 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
python中日志logging模块的性能及多进程详解
Jul 18 Python
python实现猜单词小游戏
May 22 Python
python操作excel的方法
Aug 16 Python
Appium+python自动化怎么查看程序所占端口号和IP
Jun 14 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
详解Python文件修改的两种方式
Aug 22 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
python 弧度与角度互转实例
Apr 15 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
Nov 18 #Python
Anaconda的安装与虚拟环境建立
Nov 18 #Python
如何基于Python pygame实现动画跑马灯
Nov 18 #Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 #Python
jupyter使用自动补全和切换默认浏览器的方法
Nov 18 #Python
Python urllib3软件包的使用说明
Nov 18 #Python
Python从文件中读取数据的方法步骤
Nov 18 #Python
You might like
php 方便水印和缩略图的图形类
2009/05/21 PHP
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
激活 ActiveX 控件
2006/10/09 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
js获取本机的外网/广域网ip地址完整源码
2013/08/12 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
jQuery切换网页皮肤并保存到Cookie示例代码
2014/06/16 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
个人总结的一些JavaScript技巧、实用函数、简洁方法、编程细节
2015/06/10 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
JS实现滑动门效果的方法详解
2016/12/19 Javascript
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
vue2.0获取鼠标位置的方法
2018/09/13 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
使用Python的判断语句模拟三目运算
2015/04/24 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python调用opencv实现猫脸检测功能
2019/01/15 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
结构工程研究生求职信
2013/10/13 职场文书
承认错误的检讨书
2014/01/30 职场文书
音乐教学反思
2014/02/02 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
出纳试用期自我评价
2015/03/10 职场文书