Python爬虫抓取基金数据

来源:互联网 发布:电信网络诈骗的危害 编辑:程序博客网 时间:2024/04/28 02:15
Python做网络爬虫需要学习额外基本知识:
        1.HTML。基金所需的数据都通过HTML网页的形式返回,数据和HTML tag通过一定的规范组成渲染后的形成网页。了解HTML是为了有效地剥离数据。
        2.Python的正则表达式。正则表达式对文字的筛选效率十分高。上面已经说明数据需要剥离,而正则表达式正为了完成这项工作。正则表达式一定要学,不然所有东西都白搭。同时这个也是最繁复的,需要根据结果适当调整正则表达式。
        3.报文的格式及类型,为了得到需要的数据,我们需要向服务器提出请求。有的请求设置需要使用到POST的知识,如向学校教务网站登陆等等。但是这里用不上,做爬虫这个点迟早会用上,要多多钻研。
        4.一些抓包软件(插件) firebug、或使用Chrome抓包也可以。我们通过抓包来了解浏览器向服务器POST和GET了什么数据,通过模拟数据的传输来要求服务器返回正确页面来满足我们的需要。抓包软件有很多种,但是我们主要用来看POST的数据。有时我们还需要用抓包软件浏览一下响应的网页,抓包软件自动排版代码会比浏览器直接浏览源代码拥有更高的可读性。我选择使用Firebug.

        得益于Python中自带大量功能丰富的库,很多工作只要使用这些库就能够完成,没有的也能从外部导入。

        Python有Python2.*和Python3.*,两个主要差别是库的导入名称、语法和功能增删有点不一样。我的建议是新手务必使用python2.*。成功完成一个脚本后,再迁移到python3上测试,一边debug,一边修改代码。

        值得一提的是,python3比python2对网页中中文编码有更好的兼容性。在python2中网页会有不少中文字出现乱码无法显示,而在python3中则一切正常。

        那为什么还要同时学习python2和python3而不直接学python3?因为urllib功能在python2中使用简便,文字编码的问题顾虑比python3要少得多。况且网络上python2教程比python3更多,遇到问题有更多解决方案以供参考,以致新手使用python2学习速度要比python3快。

        在Python2中,这次主要使用URL库的名称是urllib和urllib2。他们俩不是升级关系,而是互补关系,有的功能需要他们共同来完成。但是在python3中,变成了urllib和urllib.request这两个名称,感到略坑。一开始使用python3的时候不知道有所改变,在python3中死活无法引入urllib2(新手容易陷入的误区),因为名称改为urllib.request。百度很多的页面都没有说明两者的差别,是后来一边写一遍找的时候才总结出差别.....结果爬虫在Python2.*中才顺利完成,而文章也以此为基础介绍。

        因为还要使用到正则表达式去匹配网页中的基金代码、基金净值和基金的实时更新时间,所以还需要引入正则表达式库re。

Python2.*中库的引入,使用import语句。如果要提高性能,可以使用import * as *

import urllib
import urllib2
import re


python3.*中库名的差别

import urllib
import urllib.request
import re


为了方便,我直接把多个网页放在一个列表当中,通过遍历打开网页开展工作。
import urllib
import urllib2
import re

url=["http://fund.eastmoney.com/000051.html",
"http://fund.eastmoney.com/213008.html",
"http://fund.eastmoney.com/000173.html",
"http://fund.eastmoney.com/000477.html"]

        这种URL很方便,直接就是 http://fund.eastmoney.com/********.html 的基本格式。如果组织更复杂一点,恐怕对我这种基础水平的人来说就无法完成了。*号就是基金代码。

       因为这个爬虫只是抓取信息,不用登陆,很多东西都用不上,基本的知识都能在百度上找到。由于每个网页编写的结构都不一样,抓取的信息所使用的正则表达式必须要对应相应的网页才能正确抓取。

        其实我之前是没有去学正则表达式,就算学业上只是看了JAVA中的正则表达式的一些内容,写的时候根本没有作用,对Python来说也不能说可以用上。我是一边写,一边找其他人的爬虫来学习。正则表达式虽说好用,能模仿别人的正则表达式格式并拿来修改。但是对于我这种入门的新手来说,还是挺繁复,要不断修改语句去提高分析精确度。结果是能用还是不知道为什么实现了....只求可用,暂时不求甚解。

        在网页中选中净值数值,用firebug查看,就能看html的组成。用正则表达式匹配格式,就能把数值抠出来。

        用同样的方法把更新时间爬出来。至于基金的代码,因为在URL中已经有了,所以直接对网页URL进行分析。本来还想把基金的名字分析出来,但是这部分的正则表达式始终不能正常抓取关键字,所以最终没有成功抠取名字。
初试Python爬虫抓取基金净值 - 狐影 - Stand Higher

对应的正则表达式如下,这句是抠净值的:

find_re = re.compile(r'<div id="statuspzgz" class="fundpz"><span class=".+?">(.+?)</span>',re.DOTALL)


把基金的代码是更新时间抓取的正则表达式:

html_re = re.compile(r'http://fund.eastmoney.com/(.+?).html',re.DOTALL) #分离基金代码
time_re = re.compile(r'<p class="time">(.+?)</p>',re.DOTALL) #分离更新时间


        最后组合上面的东西算是最简单的步骤了,一个for循环对应一个基金的数据抓取,把所有的正则表达式操作都放在里面运行。代码一共30行左右,但是对我来说以后查询就省事很多了,简而言之就是一劳永逸。

import urllib
import urllib2
import re

url=["http://fund.eastmoney.com/000051.html",
"http://fund.eastmoney.com/213008.html",
"http://fund.eastmoney.com/000173.html",
"http://fund.eastmoney.com/000477.html"]

find_re = re.compile(r'<div id="statuspzgz" class="fundpz"><span class="red bold">(.+?)</span>',re.DOTALL)
html_re = re.compile(r'http://fund.eastmoney.com/(.+?).html',re.DOTALL)
time_re = re.compile(r'<p class="time">(.+?)</p>',re.DOTALL)

for ul in url:

html=urllib2.urlopen(ul).read()

for x in html_re.findall(ul):
print "基金代码:"+x

for y in find_re.findall(html):
print "单位净值:"+y

for z in time_re.findall(html):
print "最后更新时间:"+z

raw_input()


        python是格式相关的,请主要逻辑关系。

爬虫工作结果
初试Python爬虫抓取基金净值 - 狐影 - Stand Higher
 
        说实话,这个爬虫结构简单,甚至连数据结构的东西都没有用上。现在同时做的一个爬虫不仅要登录网页,还要会相应网页的自动跳转,然后分析表格在整理并显示,这个有点麻烦。

=========================我是分界线=========================


        最后做了一些代码上的精简,代码更简洁,性能也更好,结果没有变,足足少了10行代码。
from urllib2 import urlopen as uu
import re

url=["http://fund.eastmoney.com/000051.html",
"http://fund.eastmoney.com/213008.html",
"http://fund.eastmoney.com/000173.html",
"http://fund.eastmoney.com/000477.html"]

find_re = re.compile(r'<div id="statuspzgz" class="fundpz"><span class=".+?">(.+?)</span>',re.DOTALL)
html_re = re.compile(r'http://fund.eastmoney.com/(.+?).html',re.DOTALL)
time_re = re.compile(r'<p class="time">(.+?)</p>',re.DOTALL)

for ul in url:
html=uu(ul).read()
print "基金代码:" + str(html_re.findall(ul))
print "单位净值:" + str(find_re.findall(html))
print "最后更新时间:" + str(time_re.findall(html))
print ''

raw_input()

        基金爬虫是python爬虫中最基本爬虫中的一类,每次只处理一个页面、页面组织简单、正则表达式逻辑简单。下一次,我们学习如果使用带Cookies、需要登陆并需要页面跳转的python爬虫。

感谢以下内容作者:
参考页面:http://xiaoxia.org/2012/11/02/python-cralwer/  

首次编写:2015-3-2 14:22:49
一次修改:2015-3-5 15:47:10
原创粉丝点击