Python 爬取网页数据(以基金净值数据为例子)

BeautifulSoup的使用

Python用来爬取网页数据是比较方便的,对于html格式的静态数据,使用python来获取数据效率很高。在PYTHON中,用的最多的爬取数据module就是beautifulsoup,下面就来详细介绍beautifulsoup的使用。

1.确认需要获取的数据对象

首先我们需要确认获取对象,这里我使用天天基金网的基金净值为例子:


黄色高亮是这次希望抓下来的数据,6.27的基金净值以及对应的基金symbol。

2.查看网页源(CTRL + U)

我们也可以右击然后点击inspect(ctrl+shift+i),由于现在很多网页时动态数据填写,往往inspect里面能看到的数据实际上是js填进去的,使用View page source可以看出来是静态网页还是动态网页(这里只介绍爬静态网页数据)。我们首先随意复制一个基金净值然后在代码源里搜索,如下图:


这个做法是为了锁定我们需要的数据在哪一块(如果稍微掌握一些html结构会更易理解爬虫原理),如上图所示,每一个基金净值都在td class=‘dwjz black’里面(第一个1.6830才是我们需要的基金净值,第二个是累计净值),知道了结构才好确认beautifulsoup里面的name以及attrs填写什么(见下方codes)。值得注意的是,在我们需要的净值之前,其实也会有一个td结构,而且很不幸其class也是等于‘dwjz black’,这个值是我们不需要的(这是6.28号的净值),但是又会被抓下来。所以之后的codes我们需要几步来处理掉这些数值。


思路到这,基本上就完全了,剩下的只是写code和debug,这里我分享一下我的code

以下为codes:

import pandas as pd
from urllib.request import urlopen
from bs4 import BeautifulSoup #导入modules
url= r'http://fund.eastmoney.com/QDII_jzzzl.html'  #网址
urlString= urlopen(url) 
ttFund= BeautifulSoup(urlString, 'html.parser')
value=ttFund.find_all(name='td',attrs={'class':'dwjz black'}) # 抓取下所有在td结构内,且class= ‘dwjz black’的数据
Nav=[] # 建一个空的list
n=0  #used as a conditinal selection
for nav in value:
    n+=1
    if n%2==0:     #如上面所说,我们只需要6.27的数据,这一步是为了将6.28的数据筛掉               
        Nav.append(float(nav.get_text().replace('---','0')))   #‘---’在网站里意味着无数据,我们用0代替(很多时候不能用0,但是这是净值,所以可行)
    #odd every 2 value in variable 'value' would be the NAV I need
temp= ttFund.find_all(name='td',attrs={'colspan':2}) #抓取下所需数据的date,也是通过观察所得
date=temp[1].get_text()
unidate=(temp[0].get_text())
# codes above is for getting the date of these NAVs, you can use datetime.now or datedelta()
NavDF=pd.DataFrame(Nav,columns=[date]) #dataframe Nav
symbol=[]  #以下步骤为了获取基金symbol,方法同上
symbolList= ttFund.find_all(name='td', attrs={'class','bzdm'})
for ID in symbolList:
    symbol.append(float(ID.get_text()))  #get fund symbols
colnames=['Symbol']
symbolDF= pd.DataFrame(symbol, columns= colnames)
dataCombined= pd.concat([symbolDF,NavDF],axis=1) #combined two dataframe by cols
filePath=r'D:/MS/TT_QDII.csv'  #设置自己的文件夹路径
dataCombined.to_csv(filePath, index=False) #输出为csv格式

最后输出的file如下图:


最后,如果我们需要的数据里面含中文,很可能在输出为csv file的时候乱码,这是由于编码的问题,我的上一篇博文里写到了解决方法,欢迎参阅。

猜你喜欢

转载自blog.csdn.net/clintlong/article/details/80846994