如何利用Python批量爬取人民币外汇数据并整理储存可视化!
一、需求
由于该网站(http://www.safe.gov.cn/safe/rmbhlzjj/index.html)日期选择最长间隔只能90天,因此如果手动点击下载表格,需要多次选择日期,并且将多个表格手动合并后存入数据库。为了解决这些问题,本篇使用爬虫爬取,pandas整理数据后存入数据库。
二、实现
STEP1 爬取第一批数据
打开网站,输入在允许范围内的日期,点击查询,就发送了一个POST请求
F12打开开发者工具刷新后,可以看到这个请求的url和请求体信息,仿照该请求体,设置发送请求的data参数
import requests payload = { 'startDate':'2020-01-01', 'endDate':'2020-03-30', 'queryYN':'true' } res = requests.post('http://www.safe.gov.cn/AppStructured/hlw/RMBQuery.do', data = payload) 1234567
STEP2 解析数据
用查看器查看表格位置(id=“InfoTable”),使用beautifulsoup解析数据
from bs4 import BeautifulSoup soup = BeautifulSoup(res.text, 'html.parser') type(soup.select('#InfoTable')[0]) >>>bs4.element.Tag 1234
pd.read_html()需要传入的io:str or file-like,需要用prettify()方法格式化一下,顺便设置下编码
import pandas as pd dfs = pd.read_html(soup.select('#InfoTable')[0].prettify('utf-8'), header=0) df_rates=dfs[0] df_rates.head() 1234
STEP3 数据转换
得到的数据是一个二维表,需要存储到数据库,为了以后更好地使用,需要降低维度
使用pd.melt()方法逆透视
df_rates=pd.melt(df_rates,col_level=0, id_vars=['日期']) df_rates.columns = ['date', 'currency', 'exchange'] df_rates.head() 123
或者一步步转
se=df_rates.set_index('日期').stack() se.index.names=['date', 'currency'] df_rates=se.reset_index(name='exchange') df_rates.head() 1234
STEP4 存储数据到数据库
import sqlite3 with sqlite3.connect('currency.sqlite') as db:df_rates.to_sql('currency_data', con=db, if_exists='replace', index = None) 123
STEP5 整合成自定义方法
上述4个步骤已经完成了一次完整的抓取-处理-存储过程,之后只要改变request请求的日期就能完成长时间距离的数据获取,因此可以将上述步骤整合成可调用的自定义方法,只需要传入时间参数
import requests import pandas as pd from bs4 import BeautifulSoup import sqllite3 def getCurrency(start, end):#STEP 1payload = {'startDate':start,'endDate':end,'queryYN':'true'}res = requests.post('http://www.safe.gov.cn/AppStructured/hlw/RMBQuery.do', data = payload)#STEP2soup = BeautifulSoup(res.text, 'html.parser')dfs = pd.read_html(soup.select('#InfoTable')[0].prettify(), header=0)df_rates=dfs[0]#STEP3df_rates=pd.melt(df_rates,col_level=0, id_vars=['日期'])df_rates.columns = ['date', 'currency', 'exchange']#STEP4with sqlite3.connect('currency.sqlite') as db:df_rates.to_sql('currency_data', con=db, if_exists='append', index = None) 1234567891011121314151617181920212223242526
STEP6 使用循环
上述4个步骤已经完成了一次完整的抓取-处理-存储过程,如果需要抓取365天至今的数据,至少需要math.ceil(365/90)=5次,每次请求体中日期之间都是等距的90天
from datetime import datetime, timedelta current_time = datetime.now() for i in range(-1,365-1,90):start_date = (current_time - timedelta(days = i + 90)).strftime('%Y-%m-%d')end_date = (current_time - timedelta(days = i +1)).strftime('%Y-%m-%d')#print(start_date, end_date)getCurrency(start_date, end_date) 1234567
STEP7 取数可视化
上述步骤已经将所需数据存入数据库,可以在python中使用pandas执行SQL语句查询到所需数据进行分析
1.查询“美元“的汇率中间价
with lite.connect('currency.sqlite') as db:df = pandas.read_sql("SELECT * FROM currency_data WHERE currency = '美元'", con=db) 12
2.修改数据类型
#df.info() df['date'] = pandas.to_datetime(df['date'], format= '%Y-%m-%d') 12
3.将日期列转为索引
df=df.set_index('date') 1
4.可视化数据
% pylab inline #线图 df.plot(kind = 'line') #30天移动平均线 df['mvg30'] = df['exchange'].rolling(window=30).mean() #同时展示 df[['exchange', 'mvg30']].plot(kind = 'line') 1234567
如果同时取”美元”和“英镑“,多个系列在同一张图上,需要将项透视成列
with sqlite3.connect('currency.sqlite') as db:df = pd.read_sql("SELECT * FROM currency_data WHERE currency IN ('美元', '英镑') ", con=db)df['date'] = pandas.to_datetime(df['date'], format= '%Y-%m-%d')#建立数据透视表 df2 = df.pivot_table(index= 'date', columns= 'currency')#绘图 plt.rcParams['font.sans-serif']=['SimHei'] df2.plot(kind= 'line', rot= 30)
源码获取加群哦:1136192749
如何利用Python批量爬取人民币外汇数据并整理储存可视化!相关推荐
- python为啥爬取数据会有重复_利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?...
原标题:利用Python来爬取"吃鸡"数据,为什么别人能吃鸡? 首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波 ...
- 详细分析如何利用python批量爬取百度图片
这篇文章主要写的是利用python网络爬虫批量来爬取百度图片并保存到文件夹中. 首先我们打开百度图片这个网页:https://image.baidu.com/ 我们现在随便搜一个类型的图片,比如小狗, ...
- 利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?
首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波. 上周在在微信游戏频道看战绩的时候突发奇想,是不是可以通过这个方式抓取到很多战斗数 ...
- 利用python批量爬取网页图片_使用python来批量抓取网站图片
今天"无意"看美女无意溜达到一个网站,发现妹子多多,但是可恨一个page只显示一张或两张图片,家里WiFi也难用,于是发挥"程序猿"的本色,写个小脚本,把图片扒 ...
- python webshell_使用 Python 批量爬取 WebShell
使用 Python 批量爬取 WebShell 还在用爬虫爬一些简单的数据?太没意思了!我们来用爬虫爬 WebShell! 0. 引子 前些天访问一个平时经常访问的网站,意外的发现这个站出了问题,首页 ...
- python自动搜索爬取下载文件-python批量爬取下载抖音视频
本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...
- 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...
[爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...
- 疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息
疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息 随着时间的流逝,在中国共产党的领导,全国人民的共同努力下,疫情逐渐受到了控制,逐渐好转,复工,开学有望.最近在和女朋友的闲聊当中得知 ...
- Python批量爬取王者荣耀英雄高清壁纸
Python批量爬取王者荣耀英雄高清壁纸 文章目录 Python批量爬取王者荣耀英雄高清壁纸 前言 爬虫步骤 python代码实现 总结 前言 很多喜欢玩王者的朋友很希望把王者荣耀的英雄图片拿来做壁纸 ...
最新文章
- linux如何修改网卡序号,CentOS双网卡时改变网卡编号和配置静态路由的方法
- IDEA切换全屏模式
- qq发送消息时变成表情
- 如何在html中在线预览pdf文件
- Julia·Pluto·Plots报错解决方法
- MSM8998(高通835处理器)外接指纹识别传感器linux驱动如何与设备树进行匹配
- 冒泡排序算法,简单明了哦。
- 四种类型的数据节点 Znode
- 计算机网络-15 网络测量
- windows:将网络共享文件夹映射为网络硬盘
- 穷举法求经典数学问题(鸡和兔)
- 如何使用Win10自带的截图工具截屏
- vb.net 教程 1-12 Hashtable
- MongoDB 查询语法与常用查询语句总结
- 算法题:分苹果(2016京东招聘笔试题)
- 在自己电脑上搭建一个FTP服务器
- 男宝宝起名的三大思路
- 无法导入net.sf.json.JSONObject解决方案
- python分析微博粉丝_GitHub - rainpenber/python_weiboSpider: 微博粉丝数据爬取分析僵尸粉...
- Linux之fdisk的使用