通过pandas库可以爬取网页中的表格数据,对数据进行结构化处理,并导出Excel工作簿。
read_html()爬取网页表格数据:
import pandas as pd
url='http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/dzjy/index.phtml'
table=pd.read_html(url)[0]
table #这是Jupyter Notebook中打印输出变量的方法
动态渲染出来的不能用read_html()函数以访问网址的方式爬取数据,而是需要先用Selenium库获取网页源代码,再用read_html()函数解析网页源代码,提取表格数据。
DataFrame:
DataFrame是pandas库用于组织和管理数据的一种二维表格数据结构,可以看做一个Excel工作表。
可通过列表创建和通过字典创建:
(1)通过列表创建
第一种方法:
import pandas as pd
a=pd.DataFrame([[1,2],[3,4],[5,6]])
第二种方法:自定义列索引和行索引
a=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['a','b','c'])
通过DataFrame的colunms属性可以查看和修改列索引:
print(a.columns) #查看列索引
a.columns=['日期','分数'] #修改列索引
无需知道数据的具体数量,直接将列表拼接成列:
a=pd.DataFrame() #创建一个空DataFrame,用于存储之后要拼接的列数据
date=[1,3,5]
score=[2,4,6]
a['date']=date
a['score']=score
(2)通过字典创建DataFrame
b=pd.DataFrame({'date':[1,3,5],'score':[2,4,6]})
数据文件的读取和写入:
(1)文件读取
用read_excel()函数读取Excel工作簿的数据:
import pandas as pd
data=pd.read_excel('data.xlsx',sheet_name=0)
#data为DataFrame结构,参数sheet_name用于指定要读取的工作表,其值可以是工作表名称,也可以是数字(默认为0,即第1个工作表)
CSV文件本质上是一个文本文件,可以用Excel或文本编辑器打开。
CSV文件中存储的是用逗号分隔的数据,但不包含格式、公式、宏等。
用read_csv()函数读取CSV文件中的数据。
data=pd.read_csv('data.csv',delimiter=',',encoding='utf-8')
#delimiter用于指定数据的分隔符,默认为逗号,encoding用于设置编码格式
(2)文件写入
to_excel()函数可以将DataFrame中的数据写入Excel工作簿:
data=pd.DataFrame([[1,2],[3,4],[5,6]],columns=['A列','B列'])
data.to_excel('data_news.xlsx',index=False)
#这里使用相对路径,index设置为True表示保留行索引信息
DataFrame中数据的常用操作:
(1)按列选取数据
#返回不包含列索引信息的一维格式的数据
a=data['c1']
#返回包含包含列索引信息的二维格式数据
b=data[['c1']]
#返回多列,需要在中括号中以列表的形式给出列索引值
c=data[['c1','c3']]
(2)按行选取数据
#选取第2行和第3行的数据,注意序号从0开始,左闭右开,选取单行必须使用iloc方法
a=data.iloc[1:3]
#还可使用loc方法根据行索引选取数
d=data.loc[['r2','r3']]
#如果行数很多,可以用head()函数选取前5行数据
e=data.head(5)
(3)按区块选取数据
按区块选取是指选取某几行的某几列数据。
a=data[['c1','c3']][0:2]
#也可以写成data[0:2][['c1','c3']]
#用iloc方法选取行,再选取列
b=data.iloc[0:2][['c1','c3']]
#选取c3列第1行的数据
c=data.iloc[0]['c3']
不能写成data['c3'][0]或data[0]['c3']
(4)数据筛选
通过在中括号里设置条件可以对行数据进行筛选。
#选取c1列中数字大于1的行
a=data[data['c1']>1]
如果有多个筛选条件,可用&(表示“且”)或| (表示“或”)连接。
#筛选c1列中数字大于1且c2列中数字等于5的行
b=data[(data['c1']>1)&(data['c2']==5)]
(5)数据整体情况查看
通过DataFrame的shape属性可以获取表格的行数和列数:data.shape
(6)数据运算
可以通过数据运算利用已有的列创建新的一列:
data['c4']=data['c3']-data['c1']
data.head()
#data.head()会输出所有行
(7)数据排序
用sort_values()函数可以将数据按列排序
#按c2列进行降序排序
a=data.sort_values(by='c2',ascending=False)
ascending默认为True,表示升序排列,by用于指定按哪一列来排序
(8)数据删除
用drop()函数可以删除指定的列或行
DataFrame.drop(index=None,columns=None,inplace=False)
index用于指定要删除的行,columns用于指定要删除的列
inpalce默认为False,表示该删除操作不改变原DataFrame,而是返回一个执行删除操作后的新DataFrame
用drop_duplicates()函数可以删除内容重复的行
用dropna()函数可以删除空行(含有空值的行),可以用参数thresh来限定非空值的个数
示例:
#先导入selenium库,然后访问网址,获取网页源代码
from selenium import webdriver
browser=webdriver.Chrome()
url='http://vip.stock.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/stockid/600519/displaytype/4.phtml'
browser.get(url)
data=browser.page_source
#导入pandas库,用read_html()函数解析网页源代码,提取表格数据
import pandas as pd
table=pd.read_html(data)
#通过for循环语句遍历列表table,然后依次打印出各个表格的序号和内容
for i in range(len(table)):
print(i)
print(table[i])
df=table[14]
df #在Jupyter Notebook中打印输出
df.columns=df.iloc[0] #设置列索引为原表格的第一行
df=df[1:] #从第2行开始选取数据
df=df.dropna() #删除含有空值的行,若只想删除全为空值的行,可写成dropna(how='all')
df #在Jupyter Notebook中打印输出
df.to_excel('1.xlsx',index=False) #将数据导出为Excel工作簿,设置index=False以忽略行索引