Python使用pyquery抓取股票行情数据实例

2017-12-30 11:18:00
六月
来源:
http://blog.csdn.net/baidu_21833433/article/details/70313814
转贴 1285
最近由于公司业务上的需求,要网络采集一些数据,并格式化以供应用的调取,前期想到用正则表达式来对网页格式串进行过滤和抓取,在进行了一系列尝试之后放弃,
原因是太繁琐了,而且对于每种网页都需要写特定的表达式,不可通用。
    后面在查找相关资料时,发现python也提供一个类似jquery的包,叫做pyquery,可用以进行网络抓取,遂安装研究了一下,发现确实挺好用,不用写复杂的表达式即可
对数据进行抓取和过滤。

下面就以一个网页为例,来抓取指定格式的数据,并记录过程。

http://yunvs.com/list/mai_1.html

下面,我们就通过python的第三方扩展包pyquery来对此网页进行抓取。
我现在需要抓取股票与概念的关系,以便应用可以方便的通过股票查找其所属的概念,也可以通过热点概念定位相关股票。
但是从网页上我们可以看到,数据是以行的形式来展现的,单只股票后面跟了多个概念,且概念与概念之间以空格为分隔符,所以我们不仅仅要对数据进行抓取,同时还要对其格式进行处理。


1.安装pyquery包

具体的安装过程就不在这里详述了,python的包安装可以通过一个工具叫做easy_install来进行安装和管理,大家百度一下即可得到相关资料。
pyquery包解析html以来lxml包,所以这里要安装pyquery和lxml两个包才可使用pyquery.

pyquery的官网地址:  http://pythonhosted.org//pyquery/api.html  ,上面有详细的每个api的使用方法

2.导入pyquery包

from pyquery import PyQuery as pq
from lxml import etree

3.加载需要解析的数据源

v_source=pq(" ")   ---直接加载一个html串
v_source=pq(filename=path_to_html_file)                 ---加载位于指定路径下的html文件
v_source=pq(url='http://yunvs.com/list/mai_1.html')                ---加载url地址直接进行解析

在这里我们就直接使用第三种方式,直接加载网页来进行数据抓取,这样显得更直观和实用。

4.分析要解析的html网页代码

http://yunvs.com/list/mai_1.html  为例,我们要抓取股票和概念的数据,那么查看其网页源码,将要解析的代码段摘出来,如下:

  1. < tr  height = "30"  >  < td  align = "center" > < a  href = "http://yunvs.com/600401"  target = "_blank" >600401 < / a > < / td >
  2.          < td  align = "center" > < a  href = "http://yunvs.com/600401"  target = "_blank" >海润光伏 < / a > < / td >
  3.          < td  align = "center" >17876 .8 < / td >
  4.          < td  align = "center" >2005 .74 < / td >
  5.          < td  align = "center" > < font  color = "#C00" > < b > +791 .28 % < / b > < / font > < / td >
  6.          < td  align = "left" > < a  href = "http://yunvs.com/theme/t640.html"  target = "_blank" >光伏 < / a > & nbsp ; & nbsp ; < a  href = "http://yunvs.com/theme/t323.html"  target = "_blank" >太阳能 < / a > & nbsp ; & nbsp ; < a  href = "http://yunvs.com/theme/t225.html"  target = "_blank" >阶梯电价受益 < / a > & nbsp ; & nbsp ; < a  href = "http://yunvs.com/theme/t105.html"  target = "_blank" >多晶硅 < / a > & nbsp ; & nbsp ; < a  href = "http://yunvs.com/theme/t285.html"  target = "_blank" >券商 (龙头 ) < / a > & nbsp ; & nbsp ; < a  href = "http://yunvs.com/theme/t230.html"  target = "_blank" >金太阳工程 < / a > & nbsp ; & nbsp ; < / td >
  7.      < / tr >

可以看到,单只股票的数据都是包含在一个大的 tr标签里面,那么我们第一步过滤就是将网页里面所有的tr段截取出来。

第一步过滤可以这样写:

v_source=pq(url='http://yunvs.com/list/mai_1.html')

v_source('tr')    ----这里就是将所有以tr打头的html段过滤出来

PS:如果报错UnicodeEncodeError: 'gbk' codec can't encode character,则在程序头部加入字符集支持 #coding=utf-8
基本上我们需要的核心块都被抓取出来了
我们也可以以text文本的方式输出,这样就去掉了html标记


#coding=utf-8
from pyquery import PyQuery as pq
from lxml import etree
from pyquery import PyQuery as pq
from lxml import etree


v_source=pq(url='http://yunvs.com/list/mai_1.html')  


for data in v_source('tr'):
    v_code = pq(data).find('td').eq(0).text()
    v_name = pq(data).find('td').eq(1).text()
    v_ind = pq(data).find('td').eq(5)

    for i in range(len(pq(v_ind).find('a'))):
        v_indname = pq(v_ind).find('a').eq(i).text()
        print v_code
        print v_name
        print v_indname
发表评论
评论通过审核后显示。