Python爬虫抓取基金数据

2023-05-16

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是格式相关的,请主要逻辑关系。

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

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


        最后做了一些代码上的精简,代码更简洁,性能也更好,结果没有变,足足少了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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫抓取基金数据 的相关文章

随机推荐

  • lsusb命令

    在 Linux 中我们可以使用 lsusb 来列出 USB 设备和它的属性 xff0c lsusb 会显示驱动和内部连接到你系统的设备 直接在控制台输入 lsusb 即可 如果无法运行 lsusb xff0c 使用以下命令安装 xff08
  • 现代控制理论基础——卡尔曼滤波(kalman filtering)

    现代控制理论基础 卡尔曼滤波 xff08 kalman filtering xff09 什么是卡尔曼滤波 xff1f 在任何含有不确定信息的动态系统中使用卡尔曼滤波 xff0c 对系统下一步的走向做出有根据的预测 xff0c 对系统状态进行
  • C/C++中的'\0'

    在C C 43 43 语言中 xff0c 字符是按其所对应的ASCII码来存储的 xff0c 一个字符占一个字节 xff0c 而 0 就是ASCII码表中的第一个字符 xff0c ASCII码为00000000 xff0c 它被称为空字符
  • OpenCV 创建图像时,CV_8UC1,CV_32FC3,CV_32S等参数的含义

    形式 xff1a CV lt bit depth gt S U F C lt number of channels gt bit depth xff1a 比特数 代表8bite 16bites 32bites 64bites 举个例子吧 比
  • 解决apt-get update更新错误

    sudo apt get update出现解析错误 xff0c 如下 fkuner 64 data3 span class token function sudo span span class token function apt get
  • C++初阶:vector类

    vector 0 vector的介绍 vector是用数组实现的 可变长度的顺序容器 xff0c 本质是一种类模板 span class token keyword template span span class token operat
  • Git之分支创建策略

    分支类型 git上始终保持两个分支 xff0c master分支 develop分支 master分支主要用于发布时使用 xff0c 而develop分支主要用于开发使用 除了以上两个常驻分支外 xff0c 我们还可以适当分支出三种分支 x
  • ubuntu 设置pip源

    前言 在Ubuntu下我们一般使用pip工具去管理我们的Python包 但是在使用pip命令操作的时候一般都是使用的默认设置 xff0c 使用的是国外的镜像 xff0c 这就导致了我们在国内下载安装包的时候很慢 xff08 乌龟慢慢爬 xf
  • 27.串口通信实验源码讲解

    串口通信实验源码讲解 笔记基于正点原子官方视频 视频连接https www bilibili com video BV1Wx411d7wT p 61 71 amp spm id from 61 333 1007 top right bar
  • 国内快速下载keil的pack文件包

    问题 xff1a 国内keil官网下载pack文件包太慢 xff0c 网上很多网盘资源如果没有VIP也是很慢 解决方案 xff1a https www keil com dd2 pack 第一步 xff1a 首先去上面的keil官网找自己需
  • forensics - make virtual machine with E01[ewf] files on OSX ———— 电子取证 MAC OS平台仿真

    forensics make virtual machine with E01 ewf files on OSX 电子取证 MAC OS平台仿真1挂载库安装osxfuselibewf 2 虚拟机存储文件qemu 3 开始实验 amp amp
  • 如何从官网下载 Google Chrome 离线安装包

    Google Chrome 已经是许多人的默认浏览器 xff0c 但由于 你懂的 原因 xff0c 在线安装基本没有成功过 xff0c 他自己的自动更新也多数一直在加载中 xff0c 所以我们会到一些下载站下载安装包 xff0c 但我的多次
  • 腾讯资深3D游戏建模师你不知道的5个3DMAX细节

    首先我们要清楚的是行业划分 3DMAX的用途非常广泛 xff0c 所涉及的行业大致有 xff0c 园林景观 城市规划 建筑设计 室内设计 动漫设计 商业动画制作等 所以我们在入手学3DMAX软件时 xff0c 大家应该分清楚 xff0c 你
  • 通过GetProcessNameByProcessId得到进程路径

    写主防时 xff0c 为了拿到进程路径 xff0c 所以查询发现一种发现一种方式是通过PID xff0c 调用PsLookupProcessByProcessId ProcessId amp ProcessObj 拿到进程的EPROCESS
  • 10.Python修炼之路【14-链表】2018.05.11

    关键字 xff1a 单链表 双链表 循环单链表 循环双链表 一 链表 1 为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间 xff0c 而在进行扩充时又需要进行数据的搬迁 xff0c 所以使用起来并不是很灵活 链表结构可
  • 谈谈Linux内核的实时性优化

    1 实时系统的概念 1 1什么是实时操作系统 什么是实时操作系统 xff1f 接触过嵌入式的小伙伴可能会知道 xff0c 实时操作系统是指在嵌入式领域广泛应用的各类RTOS Real Time Operating System 其中最具代表
  • docker 命令详解(十八):port

    一 命令作用 列出指定的容器的端口映射 xff0c 或者查找将 PRIVATE PORT NAT 到面向公众的端口 二 命令语法 docker port OPTIONS CONTAINER PRIVATE PORT PROTO 三 使用示例
  • 在Ubuntu 20.04上面搭建嵌入式开发环境

    电脑系统盘出故障了 xff0c 重新安装了Ubunt20 04 xff08 之前用的是18 04 日常工作编译基于Rockchip和AM335x系列芯片的内核和U boot比较多 xff0c 所以先搭建它们的开发环境 包括并不限依赖的库和常
  • 自下而上和自上而下的注意力:不同的过程和重叠的神经系统 2014sci

    摘要 大脑在处理物理世界中任何时刻出现的所有感官刺激的能力是有限的 xff0c 相反 xff0c 它依赖于根据瞬间的偶然性集中神经资源的注意力的认知过程 注意可以分为两种不同的功能 自下而上的注意 xff0c 指的是单纯 由外部 驱动因素对
  • Python爬虫抓取基金数据

    Python做网络爬虫需要学习额外基本知识 xff1a 1 HTML 基金所需的数据都通过HTML网页的形式返回 xff0c 数据和HTML tag通过一定的规范组成渲染后的形成网页 了解HTML是为了有效地剥离数据 2 Python的正则