一、需求

由于该网站(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批量爬取人民币外汇数据并整理储存可视化!相关推荐

  1. python为啥爬取数据会有重复_利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?...

    原标题:利用Python来爬取"吃鸡"数据,为什么别人能吃鸡? 首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波 ...

  2. 详细分析如何利用python批量爬取百度图片

    这篇文章主要写的是利用python网络爬虫批量来爬取百度图片并保存到文件夹中. 首先我们打开百度图片这个网页:https://image.baidu.com/ 我们现在随便搜一个类型的图片,比如小狗, ...

  3. 利用Python来爬取“吃鸡”数据,为什么别人能吃鸡?

    首先,神装镇楼 背景 最近老板爱上了吃鸡(手游:全军出击),经常拉着我们开黑,只能放弃午休的时间,陪老板在沙漠里奔波. 上周在在微信游戏频道看战绩的时候突发奇想,是不是可以通过这个方式抓取到很多战斗数 ...

  4. 利用python批量爬取网页图片_使用python来批量抓取网站图片

    今天"无意"看美女无意溜达到一个网站,发现妹子多多,但是可恨一个page只显示一张或两张图片,家里WiFi也难用,于是发挥"程序猿"的本色,写个小脚本,把图片扒 ...

  5. python webshell_使用 Python 批量爬取 WebShell

    使用 Python 批量爬取 WebShell 还在用爬虫爬一些简单的数据?太没意思了!我们来用爬虫爬 WebShell! 0. 引子 前些天访问一个平时经常访问的网站,意外的发现这个站出了问题,首页 ...

  6. python自动搜索爬取下载文件-python批量爬取下载抖音视频

    本文实例为大家分享了python批量爬取下载抖音视频的具体代码,供大家参考,具体内容如下 import os import requests import re import sys import a ...

  7. 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...

    [爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...

  8. 疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息

    疫情过去女朋友想去重庆玩,python批量爬取小猪短租重庆民宿信息 随着时间的流逝,在中国共产党的领导,全国人民的共同努力下,疫情逐渐受到了控制,逐渐好转,复工,开学有望.最近在和女朋友的闲聊当中得知 ...

  9. Python批量爬取王者荣耀英雄高清壁纸

    Python批量爬取王者荣耀英雄高清壁纸 文章目录 Python批量爬取王者荣耀英雄高清壁纸 前言 爬虫步骤 python代码实现 总结 前言 很多喜欢玩王者的朋友很希望把王者荣耀的英雄图片拿来做壁纸 ...

最新文章

  1. linux如何修改网卡序号,CentOS双网卡时改变网卡编号和配置静态路由的方法
  2. IDEA切换全屏模式
  3. qq发送消息时变成表情
  4. 如何在html中在线预览pdf文件
  5. Julia·Pluto·Plots报错解决方法
  6. MSM8998(高通835处理器)外接指纹识别传感器linux驱动如何与设备树进行匹配
  7. 冒泡排序算法,简单明了哦。
  8. 四种类型的数据节点 Znode
  9. 计算机网络-15 网络测量
  10. windows:将网络共享文件夹映射为网络硬盘
  11. 穷举法求经典数学问题(鸡和兔)
  12. 如何使用Win10自带的截图工具截屏
  13. vb.net 教程 1-12 Hashtable
  14. MongoDB 查询语法与常用查询语句总结
  15. 算法题:分苹果(2016京东招聘笔试题)
  16. 在自己电脑上搭建一个FTP服务器
  17. 男宝宝起名的三大思路
  18. 无法导入net.sf.json.JSONObject解决方案
  19. python分析微博粉丝_GitHub - rainpenber/python_weiboSpider: 微博粉丝数据爬取分析僵尸粉...
  20. Linux之fdisk的使用

热门文章

  1. NC | 中国农大草业学院杨高文组揭示发现多因子干扰会降低土壤微生物多样性的积极效应...
  2. 自己不行,别抱大腿!
  3. excel 透视表动态数据源
  4. java cnn图像识别_Java分布式神经网络库Deeplearning4j之上手实践手写数字图像识别与模型训练...
  5. ★Navicat For Mysql 数据库备份与还原
  6. 【第一篇】商城系统-系统架构演变
  7. HihoCoder - 1789
  8. java中的继承详解
  9. 一个国外创业者总结的创业的7个原则
  10. 2024QS世界大学排名公布!