原因是太繁琐了,而且对于每种网页都需要写特定的表达式,不可通用。
后面在查找相关资料时,发现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
为例,我们要抓取股票和概念的数据,那么查看其网页源码,将要解析的代码段摘出来,如下:
-
<
tr
height
=
"30"
>
<
td
align
=
"center"
>
<
a
href
=
"http://yunvs.com/600401"
target
=
"_blank"
>600401
<
/
a
>
<
/
td
>
-
<
td
align
=
"center"
>
<
a
href
=
"http://yunvs.com/600401"
target
=
"_blank"
>海润光伏
<
/
a
>
<
/
td
>
-
<
td
align
=
"center"
>17876
.8
<
/
td
>
-
<
td
align
=
"center"
>2005
.74
<
/
td
>
-
<
td
align
=
"center"
>
<
font
color
=
"#C00"
>
<
b
>
+791
.28
%
<
/
b
>
<
/
font
>
<
/
td
>
-
<
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
>
- < / 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