前言!
前段时间微博上有人举报韩红基金会啥啥啥的,我只想劝那些举报者善良。我的这个小案例就是和韩红慈善基金会有关系。
案例任务!
- 爬取韩红基金会信息公示栏下的捐赠项目,捐赠金额。
- 对每日各项目基金会受捐情况进行统计,我选择的就是柱状图来展示,以项目为x轴,以捐款金额作为y轴。
案例目的!
- 掌握一种反反爬虫的解决方法。
- 巩固Plotly绘图的知识。
- 通过查看韩红各项目受捐情况,可以大致上分清各项目的重要程度。
案例声明!
- 本人对韩红基金会表示尊敬与感谢。
- 本文不爬取任何的私人数据,例如姓名,手机号数据,性别,年龄,交易单号等等。
Ajax简介!
Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
有事我们在抓取网页中发现一个现象,那就是我们抓取的网页源码和我们在浏览器上看到的内容不一样。开始我们会怀疑是自己的代码有问题,后来我们就会发现这是网站使用了Ajax技术。还有一个表现就是我们在点击下一页的时候我们会发现网页的url没有发生变化。
案例分析!
由于网站使用的是Ajax技术,通过抓包我发现可以通过API接口来获取网站的数据。url中有三个参数需要我们注意一个是开始时间,一个是结束时间,还有一个是页码。在我的案例中我的起始时间是2020-02-20,结束时间是2020-02-27,这个日期还需要加上时分秒。我选择抓取前92页的数据。
代码实现!
import requests
import plotly as py
import json
import re
import time
import plotly.graph_objs as go
pyplt=py.offline.plot
def get_data():
amount={}
i=1
while True and i<=92:
url='http://www.hhax.org/api/trade/trade/jet/selectSimpleByPage?pageNo={}&pageSize=20&payState=1&startDate=2020-2-20%2000:00:00&endDate=2020-2-27%20{}'.format(i,time.strftime("%H:%M:%S"))
i+=1
try:
txt=requests.get(url).text
print(url)
except:
break
txt=re.sub(' \d{2}:\d{2}:\d{2}','',txt)
list1=json.loads(txt,encoding='UTF-8')['dataPoints']['list']
# print(list1)
for one in list1:
money=one['amount']
projectTitle=one['projectTitle']
if projectTitle not in amount:
amount[projectTitle]=money
else:
amount[projectTitle]+=money
time.sleep(3)
return amount
def get_plot(amount):
x,y=[],[]
for k,v in amount.items():
x.append(k)
y.append(v)
trace0=[go.Bar(
x=x,
y=y,
)]
layout=go.Layout(
title='2020-02-20至2020-02-27日韩红基金会各项目受捐情况',
xaxis=dict(tickangle=-45)
)
fig=go.Figure(data=trace0,layout=layout)
pyplt(fig,filename='韩红基金会.html')
if __name__ == '__main__':
amount=get_data()
get_plot(amount)
效果截图!
反思与总结!
- 开始时我想做一个复杂的图表,但是就我掌握的数据量和韩红基金会上爬取的数据信息来说,不适合使用复杂的图形。
- 对于程序的健壮性做的不够好,考虑的信息不够全面。
- 在我想做复杂的数据分析图表的时候,我却发现自己并没有将那些完全战功,自己还需要进行大量的练习。
关注微信公众号,一起学习,一起成长。里面含有学习资源