怎么抓取所有股票列表(批量采集股票数据)

本文通过具体的案例,让读者掌握Python在爬虫项目中的应用。 通过本文的学习,读者可以掌握分析网页的技巧、Python编写网络程序的方法、Excel的操作,以及正则表达式的使用。这些都是爬虫项目中必备的知识和技能。

实例描述:通过编写爬虫,将指定日期时段内的全部上市公司股票数据爬取下来,并按照股票代码保存到相应的Excel文件中。

本文共计2100字左右。目录结构如下。

1 爬取股票代码

  • 1.1 找到目标网站
  • 1.2 打开调试窗口,查看网页代码
  • 1.3 在网页源码中找到目标元素
  • 1.4 分析目标源代码,找出规律
  • 1.5 编写代码抓取股票代码
  • 1.6 运行代码,显示结果

2 爬取股票内容

  • 2.1 编写代码抓取批量内容
  • 2.2 运行代码显示结果

怎么抓取所有股票列表


本案例主要分为两大步骤:

(1)要知道上市公司有哪些;

(2)根据每一个上市公司的股票编号爬取数据。

由于两部分代码相对比较独立,可以做成两个代码文件。一个文件用来爬取股票代码,另一个文件用来爬取股票内容。

1 爬取股票代码

爬取股票代码的基本思路是:

(1)分析网站上的网页源代码,找到目标代码。

(2)利用正则表达式,在整个网页里搜索目标代码,从而提取出所要的信息(股票代码)。

有关金融证券领域的网站一般都会有上市公司的股票代码信息。随便找一个即可。

1.1 找到目标网站

使用Chrome浏览器访问链接:http://quote.eastmoney.com/stocklist.html。可以看到全部的股票代码。

怎么抓取所有股票列表

股票代码网页

1.2 打开调试窗口,查看网页代码

保持当前浏览器窗口为活动页面,按F12键显示出网页的源代码调试窗口,单击调试窗口的Element按钮,可以看到页面的HTML代码。

怎么抓取所有股票列表

调试窗口

1.3 在网页源码中找到目标元素

网页的源代码是按照HTML的语法规则自动折叠的。可以用光标在HTML代码中任意单击将其展开。当光标移动到某个元素时,会看到右测网页中对应的元素会有变化,呈现被选中状态。

怎么抓取所有股票列表

选中元素

上图中,箭头所指的网页源代码,就是需要关注并爬取的内容。

1.4 分析目标源代码,找出规律

分析上图中左侧显示的内容,与右侧代码之间的对应关系。不难发现,左侧显示的每个股票代码所对应的源代码格式都是固定的。

目标源代码内容

这条源代码内容,便是要找到的目标代码。将其整理成如下字符串模版:

  • 其中,“.html”前面的“股票代码”就是需要抓取的内容。分析到这里,开发任务就转化成:在整个网页的源码中,找到这样结构的字符串,并将其中的股票代码提取出来。

    1.5 编写代码抓取股票代码

    编写代码实现urlTolist函数,并在该函数里实现主要的抓取功能:

    (1)通过使用urllib.request模块中的urlopen函数访问目的链接;

    (2)通过urlopen返回值的read方法获得网页的全部内容;

    (3)使用re模块下的compile函数来做正则表达式的计算模版,其模版字符串就是之前分析的网页目标代码;

    (4)调用re.compile返回对象的findall方法,来对网页的HTML代码进行正则表达式计算。得到的返回值code便是最终的爬取结果。

    代码1:爬取股票代码

    01 import urllib.request #网络请求模块

    import re #正则表达式模块

    stock_CodeUrl = 'http://quote.eastmoney.com/stocklist.html' #要爬取的目的地址

    def urlTolist(url): #获取股票代码列表

    allCodeList = []

    html = urllib.request.urlopen(url).read() #请求链接,获取网页

    html = html.decode('gbk') #转码

    s = r'

  • '

    pat = re.compile(s) #创建正则表达式模版

    code = pat.findall(html) #正则表达式计算

    for item in code:

    if item[0]=='6' or item[0]=='3' or item[0]=='0':

    allCodeList.append(item)

    return allCodeList #返回结果

    if __name__=='__main__':

    allCodelist = urlTolist(stock_CodeUrl) #调用函数

    print(allCodelist[:10]) #显示前10条数据

  • 在上面代码中,函数urlTolist的最后4行代码是为了让结果更加有效而做的数值验证。即,只有6(上海证交所)、0(深圳证交所)、3(创业板)打头的股票代码是有效代码。

    在代码中,正则表达式的模版部分(代码中的第9行),有这么一段代码“\S\S(.*?)”。其中,两个“\S”表明每个股票代码的前两个都是字符,是要跳过的地方。后面的括号及里面的内容,表示需要让正则表达式来抓取的部分。(关于正则表达式,不在本书介绍的内容之内,有兴趣的读者可以自行研究。不了解也没关系,直接这么使用即可。)

    1.6 运行代码,显示结果

    代码运行后,显示如下内容

    ['600000', '600001', '600002', '600003', '600004', '600005', '600006', '600007', '600008', '600009']

    可以看到,爬取的结果是以list的方式存放的。前10条都是上海证交所的股票。

    2 爬取股票内容

    通过访问网易提供的服务接口,可以获取到股票内容。只需按照其提供的请求格式,传入股票代码及所要查看的时间段,即可得到该股票的具体数据。

    为了爬取全部数据,需要遍历所有的股票代码,并调用网易的服务接口。

    2.1 编写代码抓取批量内容

    在代码实现上,仍然使用urllib.request模块进行网络请求,并将调用urllib.request模块下的urlretrieve函数,将返回的数据保存到Excel表里。代码如下:

    代码2:爬取股票内容

    import urllib.request #网络请求模块

    getstocklist = __import__("11-1 爬取股票代码") #导入自定义模块

    urlTolist = getstocklist.urlTolist

    stock_CodeUrl = 'http://quote.eastmoney.com/stocklist.html' #爬取股票代码的目的地址

    start = '20161131' #设置查询股票的时间段

    end='20161231'

    allCodelist = urlTolist(stock_CodeUrl) #获得全部股票代码

    for code in allCodelist: #遍历全部代码,调用163接口获得数据

    print('正在获取%s股票数据...'%code)

    if code[0]=='6':

    url = 'http://quotes.money.163.com/service/chddata.html?code=0'+code+\

    '&start='+start+'&end='+end+'&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP'

    else:

    url = 'http://quotes.money.163.com/service/chddata.html?code=1'+code+\

    '&start='+start+'&end='+end+'&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;TURNOVER;VOTURNOVER;VATURNOVER;TCAP;MCAP'

    urllib.request.urlretrieve(url,'d:\\all_stock_data\\'+code+'_'+end+'.csv') #保存到Excel

    代码中,设置的时间段为1个月,即从20161131到20161231。

    保存的结果放在D盘的all_stock_data路径下。为了保证保存操作正常运行,需要确保D盘下存在all_stock_data文件夹(若没有,需要创建一个)。

    2.2 运行代码显示结果

    运行代码,输出如下结果:

    正在获取600000股票数据...

    正在获取600001股票数据...

    正在获取600002股票数据...

    正在获取600003股票数据...

    正在获取600004股票数据...

    正在获取600005股票数据...

    正在获取600006股票数据...

    正在获取600007股票数据...

    正在获取600008股票数据...

    正在获取600009股票数据...

    正在获取600010股票数据...

    正在获取600011股票数据...

    ……

    代码运行结束之后,可以D盘的all_stock_data文件夹下找到生成的股票数据文件。

    怎么抓取所有股票列表

    股票数据文件

    至此,爬取股票数据的案例就结束了。读者可以根据上面的知识,在网上爬取更多自己需要的内容。另外,爬取的结果还可以保存到MySQL或其他类型文件中。


    本文选自以《Python带我起飞——入门、进阶、实战》一书,作者李金洪,电子工业出版社2018年7月出版。本书采用“教学视频+ 图书+ QQ群交流、答疑”三维学习方案,让Python学习更轻松。

    本文由 hot金融 作者:hot金融 发表,其版权均为 hot金融 所有,文章内容系作者个人观点,不代表 hot金融 对观点赞同或支持。如需转载,请注明文章来源。

    发表评论