共计 2410 个字符,预计需要花费 7 分钟才能阅读完成。
写在前面的叨叨
折腾了这么久,我终于在喝完一听快乐肥宅水后下定决心来学习写爬虫了。目标很简单,因为我想要爬一下“证券化率”,然后可视化输出结果。证券化率的基础就是上市公司的总市值,对于证券化率其实还蛮多说法的,比如雪球的这篇文。中国的真实证券化率是多少?爬虫对于证券类的分析来说,其实已经是司空见惯了,但是作为菜鸟小股民,希望自己在写完这个爬虫之后也对股票有更深的认识吧,然后能赚钱就更好啦~ 找了一个相对好入门的案例,来作为学习的范本。Python 爬虫抓取东方财富网股票数据并实现 MySQL 数据库存储
那就开工吧~
准备动作
主要使用的工具和模块包括:Anaconda Pandas MySQL
Anaconda 是之前就安装好了的,具体过程可以参考这个安装流程。Anaconda 完全入门指南
Pandas 是在 Anaconda 中用命令安装好的,还得摸索下这个工具。
pip install pandas
MySQL 以前写 PHP 的时候,都习惯直接用 Wamp 打包处理了,这会儿就来摸索下单独安装,安装教程参考这个。windows 下安装 Mysql—图文详解
整理思路
一共是四个步骤:
用爬虫将数据抓取到本地 csv 文件中
将 csv 文件内的数据导入到数据库中
MySQL 数据库内进行查询
我们今天的目标是完成第一步 —- 因为 MySQL 还没部署完毕 … 明天继续~
爬虫启动
#导入需要使用到的模块
import urllib
import re
import pandas as pd
import pymysql
import os
# 爬虫抓取网页函数
def getHtml(url):
html = urllib.request.urlopen(url).read()
html = html.decode(‘gbk’)
return html
# 抓取网页股票代码函数
def getStackCode(html):
s = r'<li><a target=”_blank” href=”http://quote.eastmoney.com/\S\S(.*?).html”>’
pat = re.compile(s)
code = pat.findall(html)
return code
Url = ‘http://quote.eastmoney.com/stocklist.html’# 东方财富网股票数据连接地址
filepath = ‘D:\\data\\’# 定义数据文件保存路径
#实施抓取
code = getStackCode(getHtml(Url))
#获取所有股票代码(以 6 开头的,应该是沪市数据)集合
CodeList = []
for item in code:
if item[0]==’6’:
CodeList.append(item)
#抓取数据并保存到本地 csv 文件
for code in CodeList:
print(‘ 正在获取股票 %s 数据 ’%code)
url = ‘http://quotes.money.163.com/service/chddata.html?code=0’+code+\
‘&end=20161231&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP’
urllib.request.urlretrieve(url, filepath+code+’.csv’)
我们看一下源代码是这样的,注释写的很清楚,我们来拆解一下。
引入模块,包括 pandas 和 re 等
分模块写函数
getHtml() 用于抓取网页,读取网页源码
getStackCode() 对抓取到的源码读取,拆解出 <li></li> 结构里面的链接,打开 Url 对应的地址,看到对应的图形结构,红框就是需要命中的目标。
根据代码,原作者只截取了 6 开头的大盘股的 list 存储入数组。
然后用 GET 方法获取每个代码对应的股票的数据,对每组数据进行存储。
测试代码
将代码放到本地跑一下,看下结果。正常应该是会下载数据到文件夹下,但是报错了。
应该是 request 模块下的 urlretrieve 函数报错。关联语句是
urllib.request.urlretrieve(url, filepath+code+’.csv’)
关于 urlretrieve() 这个方法,因为没有使用过,所以来看下详解。Python urllib 模块 urlopen() 与 urlretrieve() 详解
urlretrieve() 用于直接将远程数据下载到本地。
urllib.urlretrieve(url[, filename[, reporthook[, data]]])
参数说明:url:外部或者本地 urlfilename:指定了保存到本地的路径(如果未指定该参数,urllib 会生成一个临时文件来保存数据);reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示当前的下载进度。data:指 post 到服务器的数据。该方法返回一个包含两个元素的元组 (filename, headers),filename 表示保存到本地的路径,header 表示服务器的响应头。
会过来看我们的函数语句↓
urllib.request.urlretrieve(url, filepath+code+’.csv’)
指定了地址和文件名(保存到本地的路径),所以我试试在本地新建一个 600000.csv 来测试下结果。然后发现并没有结果。然后发现自己干了很蠢的事情 …..emmm…. 其实是我的路径写错了,然后实验结果是这样的~
未完待续~
现在就坐等爬完啦~ 然后安装 MySQL, 然后导入数据库。明天来尝试下自己复写一下这个爬虫~ 主要涉及的内容是网页结果和模块方法的使用。包括了:
request.urlopen()
re.compile()
request.urlretriev()
要好好学习~