Python数据分析从入门到放弃(十五)爬虫(番外)基金选取实例
2018-01-23 15:15阅读:
Python基金选取实例
目标:
选择多个周期内,同时出现在排名前列的基金
工具:
l Python3
l
Pycharm——
Python IDE,社区版免费
l Chrome
l
Pandas,
requests,
lxml——用到的
Python库
可能了解:
l Python爬虫
l Pandas操作
l 抓取
JS生成的网页
l
纯属技术娱乐,不作为投资建议
准备数据:
1、既然是挑选基金,我们选比较热的天天基金网为例,用
Chrome打开,选择基金排行
http://fund.eastmoney.com/data/fundranking.html#tall;c0;r;szzf;pn50;ddesc;qsd20170123;qed20180123;qdii;zq;gg;gzbd;gzfs;bbzt;sfbb
2、右键
->查看源代码,我们居然找不到基金数据
3、没事,
F12—Network—F5,找到用时最长的那个
4、右键
—Open in new
tab,然后把链接贴出来,好长
……
http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft=all&rs=&gs=0&sc=zzf&st=desc&sd=2017-01-23&ed=2018-01-23&qdii=&tabSubtype=,,,,,&pi=1&pn=50&dx=1&v=0.3980120725890699
5、数据正是我们要的,这里有两个日期,是自定义数据的开始和结束日期,我们要用到,另外有意思的是,我们已经做好一页页爬数据的准备了,但是,这里有“
&pi=1&pn=50&dx=”,实验得,改成
5000都木有问题。
6、有了这些就可以写代码了
……
准备包:
Pycharm为例,
file-settings-project
inspector—加需要的包,具体怎么换源啥的,自己搜,如果不是
pycharm,自己
pip
install或者
conda
install,
pandas,requests,lxml,这里会自动加一些必须的包
代码部分:
1、引用包
Python Code
1
2
3
4
|
|
import
pandas as
pd import
requests from
lxml import
etree import
datetime
|
2、获得网页
这个函数利用
requests来获取网页信息,返回字符串
Python Code
1
2
3
4
5
6
7
8
|
|
def
get_html(url):
#取得HTML文本
try:
r
= requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return
''
|
3、凑出
URL
这里,我们利用字符串的
replace方法,来替换
url中需要动态处理的部分,包括自定义时间的开始和结尾,每页显示的基金数等。
Python Code
1
2
3
4
5
6
7
8
9
10
|
|
def
get_fund():
#取得基金列表
#先凑一个我们需要的URL出来
max_jj='5000'
#调试5
工作5000
fromstr =
datetime.datetime.now().strftime('%Y-%m-%d')
url =
'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft=all&rs=&gs=0&sc=zzf&st=desc&sd=#custday&ed=#nowdate&qdii=&tabSubtype=,,,,,&pi=1&pn=#count&dx=1'
url =
url.replace('#count',max_jj)
url =
url.replace('#nowdate',fromstr)
tostr =
(datetime.datetime.now()-
datetime.timedelta(days=5*365+1)).strftime('%Y-%m-%d')
url =
url.replace('#custday',tostr)
|
4、具体处理数据
这部分代码写的我并不满意,很不美观和优雅,有点凑的意思,但抱着实用主义的态度,我们就那么凑凑吧。最后返回一个
Dataframe对象,并写入到相应的
csv文件中。其实到了这里,已经可以直接用
Excel打开这个
csv分析了。
Python Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
|
#取得文本
s = get_html(url)
#去掉冗余信息,这里应该有更好的方法,但懒得折腾了,这样简单,十分钟搞定
s =
s[22:-159]
s =
s.replace(''','')
s =
s.replace('[',
'')
s =
s.replace(']',
'[')
lst =
s.split(',')
lst =
split_list(lst,25)
frame =
pd.DataFrame(lst,columns=['code','name','py','3','4','jz','day1','week1','month1','month3','month6','year1','year2','year3','year0','yearall','fromdate','17','year5','19','20','21','22','23','24'])
frame =
frame.iloc[:,[0,1,2,5,6,7,8,9,10,11,12,13,14,15,16,18]]
frame.to_csv('fund.csv')
return
frame
|
5、最后的处理
这里我们可以直接用刚才的函数获得数据,也可以用刚才函数保存的数据做基础来计算。读取数据后,我们先分别对数据用不同期限的列进行排序,然后赋值给相应的
Dataframe,然后去做一个交集,
Dataframe的交集用
merge函数,具体参数不再罗列,也可以做并集的。最后我们打印结果保存数据,以备后查。
Python Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
|
def main():
get_fund()
#如果每次都需要用最新数据,用这句
df_full =
pd.DataFrame.from_csv('fund.csv')
#节省网络流量,就用这句
X = 50
#取排名前多少的基金
df_full =
df_full.sort_values(by='year1',
axis=0,
ascending=False)
df =
df_full.head(X)
for xx
in
['year1','year2','year3','year5','month6']:
tmp
= df_full.sort_values(by=xx,
axis=0,
ascending=False).head(X)
|