基于Python的网络数据定时自动采集工具的设计

2021-11-20 00:21胡庆伟
电子技术与软件工程 2021年21期
关键词:爬虫邮件邮箱

胡庆伟

(中海油国际贸易有限责任公司 北京市 100000)

1 概述

随着移动互联网、物联网等新一代信息技术产业的快速发展,使得网络数据量产生了爆炸式的增长,每个人每天都要面对海量信息的轰炸,身处这样一个信息爆炸的时代,如何快速、有效的获取信息变得尤为重要,如果能够通过简单的编程,实现数据的自动获取、整理、分析,将极大的提升工作效率。大数据技术的发展促使网络爬虫技术应用愈加广泛,Python 编程语言因其简单易学的特性,使得更多非计算机专业人士也能够通过编程,开发出简单的工具来辅助日常办公。

在实际的办公场景中,经常需要每天到某网站收集数据的业务,例如财务工作者需要每天到人民银行官网查询当天人民币对外币的汇率,金融分析员需要在每天收盘后采集基金、股票、期货的交易数据,市场研究员需要每天访问不同的网站收集市场信息等。如果有一个工具能够每天定时的从网站采集数据并自动地发送到邮箱中,相关工作人员就只需要按时去查看,就可以节省大量工作时间,同时还可为后续利用进行数据分析和可视化奠定基础。

2 Python语言简介

Python 是由荷兰数学和计算机科学研究学会的Guido van Rossum 于1989年底发明的一种解释型、面向对象、动态数据类型的高级程序设计语言,是一种效率极高的语言,使用Python 编写时,程序包含的代码行数更少,代码更容易阅读、调试和扩展,被广泛用于编写网络爬虫、游戏、创建Web 应用程序等,不仅如此在科学领域也被大量运用,其提供的科学计算扩展库:NumPy、SciPy 和matplotlib,分别为Python 提供了快速数组处理、数值运算以及绘图功能,十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。本文中也将使用requests、openpyxl、pyinstaller 等第三方扩展库,在使用之前需要通过pip install xxxx 命令进行安装。

3 网络数据定时自动采集工具的实现

3.1 数据采集模块的实现

数据采集模块主要使用Python 第三方库requests 提供的网络爬虫框架搭建,网络爬虫是一种根据预先设计好的规则,从特定网站中获取相应数据的工具,主要应用于各种数据信息收集的场景,我们常见的百度、谷歌等搜索引擎就使用了网络爬虫技术。网络爬虫的实现通常分为四个关键步骤:

(1)数据获取。首先需要分析目标网站页面,明确爬取的数据源。打开上海国际能源期货交易中心每日交易快讯页面URL 地 址:http://www.ine.cn/statements/daily/?name=kx, 经观察可知交易详细数据会根据日期组件控制动态刷新,由此判断数据未直接存放在静态HTML 页面中,也就表示没办法使用BeautifulSoup 库对提取的数据进行解析。然后进入开发者模式,检查该Network 页签中动态页面加载情况,动态数据一般存放在XHR 文件中,因此可以优先查找XHR 中是否存放数据。经过分析可以看到期货交易数据实际保存的URL 地址为http://www.ine.cn/data/dailydata/kx/kx20210809.dat?temp2=1628514764422?r nd=0.028823041981317576,而该URL 中的“20210809”则控制具体显示某天的数据。明确数据存放的URL 地址后,就可以开始编写程序,在VS code 开发工具中新建名为download_ine.py 源文件,引用requests 库、time 库,获取当天日期并拼接目标URL 地址,为了避免网站的反爬虫设置,需要加上User-Agent 伪装成浏览器访问,最后再使用requests.get()方法完成数据抓取,主要代码如下:

import requests,time

today=time.strftime("%Y%m%d",time.localtime())#获取交易日期

url='http://www.ine.cn/data/dailydata/kx/kx'+today+'.dat?temp2=16 28170114791?rnd=0.2163361727157722'#将URL 中特定的日期替换成参数,确保程序每天都能找到对应的页面

headers={

'user-agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko) Chrome/90.0.4430.212 Safari/537.36'}

res=requests.get(url,headers=headers))#获取页面中的数据

(2)数据解析。通过前述分析可知交易详细数据是动态刷新的,因此步骤(1)获取到的数据无法通过静态页面解析库BeautifulSoap 进行解析。这种能够动态刷新的数据被存放在名为JSON 的数据结构中,可以使用requests 库中的JSON 解码器进行解析,仅用一行代码json_res=res.json()即可完成。

(3)数据提取。前面提到的JSON 是一种轻量级的文本数据交换格式,其具有的层次结构与Python 中的字典、列表结构较为类似,因此通过for 循环就可以将需要的数据字段如商品种类、交割月份、前结算、持仓手、持仓变化等逐行提取出来,并使用append 方法添加到自定义的data_list 列表中,主要代码如下:

instrument_list =json_res['o_curinstrument']#将json 格式的数据转换为列表

data_list =[]

for instrument in instrument_list:#循环列表提取数据

PRODUCTNAME=instrument['PRODUCTNAME']#商品种类DELIVERYMONTH=instrument['DELIVERYMONTH']#交割月份

......

OPENINTEREST=instrument['OPENINTEREST']#持仓手

OPENINTERESTCHG=instrument['OPENINTERESTCHG']# 持仓变化

data_list.append([PRODUCTNAME,DELIVERYMONTH,......,OP ENINTEREST,OPENINTERE

STCHG])

(4)数据存储。常见的数据存储方式有两种,存储为CSV 格式或Excel 文件,本文介绍第三方库openpyxl 的使用方法,将数据存储到Excel 文件,其基本操作流程为创建工作簿对象、激活sheet页、循环填充数据、保存文件到指定路径,主要代码如下:

book = Workbook() #创建Workbook 对象

sheet = book.active #激活sheet 页

for row in data_list: #循环列表并添加到Excel

sheet.append(row)

book.save("D:/Python/workspace/export_INE.xlsx")# 保存Excel文件

3.2 邮件发送模块的实现

邮件发送功能需要用到Python 的smtplib、email 两个库,其中smtplib 库主要负责连接服务器、登录、发送和退出,email 库则主要处理邮件主题、收件人、发件人、正文、附件等。实现步骤大体包括连接邮件服务器、通过账号密码登录邮箱、填写收件人、填写主题、撰写正文、添加附件、发送邮件、退出邮箱八个部分,主要代码如下:

sender = "xxx@qq.com"#发件人邮箱

password = "***"#发件人邮箱的密码

to = "xxx@163.com"#收件人邮箱

msg = MIMEMultipart()#创建MIME

msg["Subject"]= "INE DATA --"+ today#添加邮件主题

msg["From"]= sender #添加发件人

msg["To"]= to #添加收件人

text = "上海国际能源交易中心期货合约行情--""+today#添加正文内容

multipart = MIMEText(text) #创建MIMEText

msg.attach(multipart)#添加到msg

multipart= MIMEApplication(open('D:/Python/workspace/export_INE.xlsx','rb').read())#读取附件创建MIMEApplication

multipart.add_header('Content-Disposition','attachment',filename="

export_INE.xlsx")#添加信息头

msg.attach(multipart)

s = smtplib.SMTP("smtp.qq.com", timeout=30) #连接邮件服务器

s.login(sender, password))#登录邮箱

s.sendmail(sender, to,msg.as_string()) )#发送邮件

s.close()#关闭邮件连接

3.3 将python程序生成为可执行文件

为了使Python 程序具有更强的适用性,可以将Python 源文件生成为.exe 可执行文件,.exe 文件是一种不依赖于Python 开发运行环境,可以在Windows 操作系统中直接运行的文件类型,对非程序员的使用者更加友好。使用pyinstaller 第三方库可以实现生成可执行文件的操作,在安装pyinstaller 时需要与Python 放到相同目录,安装完成后进入download_ine.py 文件所在目录,并运行命令pyinstaller -F download_ine.py,参数“-F”表示将Python 程序生成为单个可执行文件,从而避免因某些动态库文件丢失导致程序无法正确运行。命令运行完毕后会在当前目录新增加build 和dist 两个目录,新生成好download_ine.exe 可执行文件存放在dist 文件夹中。

3.4 定时任务功能实现

在Python 程序中,定时任务功能可以通过schedule 库来实现,但是这种方法需要将程序部署在服务器或持续运行的PC 机上,并且安装Python 运行环境,对于普通使用者来说既不经济,也不方便。因此,本文采取通过Windows 操作系统的“任务计划程序”功能,实现数据采集工具程序的定时自动运行。在装有Windows操作系统的电脑中,按顺序打开“控制面板-管理工具-任务计划程序”,新建基本任务,选择每日22:00 点运行download_ine.exe程序,并勾选“错过计划开始时间立即启动任务”选项。如此即可每日22:00 由操作系统自动运行download_ine.exe 程序,从上海国际能源交易中心网站上采集当日期货交易数据存储到Excel 文件中,并通过邮件发送到指定的邮箱。

4 结语

本文基于Python 程序语言,详细介绍了从指定网站中进行数据采集、数据解析、数据提取、数据存储的过程,对发送邮件、生成可执行文件、设置定时任务等进行详细阐述。通过实例详细介绍了requests、openpyxl、smtplib、email、pyinstaller 等Python 自 有和第三方库的使用方法。对于具有数据采集、邮件发送、定时任务等需求场景的读者,本文提供了一种具有较高适用性的解决方案。

猜你喜欢
爬虫邮件邮箱
利用网络爬虫技术验证房地产灰犀牛之说
基于James的院内邮件管理系统的实现
基于Python的网络爬虫和反爬虫技术研究
来自朋友的邮件
没问题邮箱
CMailServer
一封邮件引发的梅赛德斯反弹
利用爬虫技术的Geo-Gnutel la VANET流量采集
大数据环境下基于python的网络爬虫技术
关于停止使用dianxunjishu@china.com邮箱的通知