• 通过pandas库可以方便地爬取网页中的表格数据,对数据进行结构化处理,并导出为Excel工作簿等文件。

6.1.1用read_html()函数快速爬取网页表格数据

  • 使用pandas库中的read_html()函数可以快速爬取网页中的表格数据。用搜索引擎搜索并打开“新浪财经数据中心”,然后选择“投资参考”中的“大宗交易”,如下图所示。下面就以爬取该页面(http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/dzjy/index.phtml)中的表格为例,讲解read_html()函数的用法。
  • 如果用传统方法解析每一个表格数据,会非常繁琐,而用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 #这是Jup中打印输出变量的方法
  • 第3行代码用read_html()函数通过访问网址来爬取网页,它会自动提取网页上所有表格,并以列表的形式返回,网页中有几个表格,列表中就有几个元素。这里虽然只有一个表格,但是仍需要通过[0]的方式提取列表中的第1个元素。
  • 最终的爬取结果如下图所示,可以看到成功爬取到表格。
  • 上面这个例子中的网页没有反爬措施,相对容易爬取。实战中还有很多网页是动态渲染的,通过read_html()函数访问网址的方式无法爬取,需要先用Selenium库获取网页源代码,再用read_html()函数从源代码中提取表格数据。将read_html()函数的这两种用法总结于下表,6.2节会讲解具体案例。

6.1.2 pandas库在爬虫领域的核心代码知识

  • read_html()函数只是pandas库强大功能的冰山一角,本节将讲解pandas库在爬虫领域更多核心代码知识。

1.创建DataFrame

  • DataFrame是pandas库用于组织和管理数据的一种二维表格数据结构,可以将其看成一个Excel表。创建DataFrame常用的方法有两种:通过列表创建和通过字典创建。

(1)通过列表创建DataFrame

  • 通过列表创建DataFrame有两种方法。第1中方法的代码如下:
import pandas as pd
a = pd.DataFrame([[1,2],[3,4],[5,6]])
a
  • 在jup中打印输出a,结果如下,该二维表格会自动创建数字序号形式(从0开始)的行索引和列索引。
  • 我们还可以在创建DataFrame时自定义列索引和行索引,代码如下:
import pandas as pd
a = pd.DataFrame([[1,2],[3,4],[5,6]],columns=['date','score'],index=['A','B','C'])
a
  • 通过DataFrame代表列索引,index代码行索引,此时a的打印输出结果如下:
  • 通过DataFrame的columns属性可以查看和修改列索引,代码如下:
print(a.columns) #查看列索引
a.columns = ['日期','分数'] #修改列索引,在6.2节会用到
  • 第二种方法较为灵活,无须知道数据的具体数量,直接将列表拼接成列即可。该方法在实战中很常用(在6.3节会用到),演示代码如下:
a = pd.DataFrame() #创建一个空DataFrame,用于存储之后要拼接的列数据
date = [1,3,5]
score = [2,4,6]
a['日期'] = date
a['分数'] = score
a

(2)通过字典创建DataFrame

  • 通过字典创建DataFrame的代码如下:
# 通过字典创建DataFrame
b = pd.DataFrame({'date':[1,2,3],'score':[2,4,6]})
b
  • b的打印输出结果如下,可以看到以字典的键名作为列索引。

2.数据文件的读取和写入

  • pandas库可以从多种类型的数据文件中读取数据,并且可以将数据写入这些文件中。本节以Excel工作簿和CSV文件为例进行讲解。

(1)文件读取

  • 用read_excel()函数可以读取Excel工作簿中的数据,代码如下:
import pandas as pd
data = pd.read_excel('data.xlsx') #data为DataFrame结构
  • 这里读取的Excel工作簿扩展名为“.xlsx”,如果是2003版或更早版本的Excel工作簿,其扩展名为“.xls”。这里使用的文件路径为相对路径,也可以使用绝对路径,相关知识点点见3.3.2节的“补充知识点1”。通过打印输出data便可查看读取的表格内容。如果只想查看查看表格的前5行数据,可以使用如下代码:
data.head() #这里协程head(10)则可查看前10行数据,一次类推
  • read_excel()函数还可以设定参数,演示代码如下:
data = pd.read_excel('data.xlsx',sheet_name=0)
  • 这里的参数sheet_name用于指定要读取的工作表,其值可以工作表名称,也可以是数字(默认为0,即第1个工作表)。此外,还可用参数index_col来指定某一列作为行索引。
  • CSV文件也是一种常见的数据格式文件格式,它在本质上是一个文本文件,可以用Excel或文本编辑器(如“记事本”)打开。CSV文件中存储的是用逗号分隔的数据,但不包含格式、公式、宏等,因而占用的存储空间通常较小。用read_csv()函数可以读取CSV文件中的数据,代码如下:
data = pd.read_csv('data.csv')
  • read_csv()函数也可以指定参数,代码如下:
data = pd.read_csv('data.csv',delimiter=',',encoding='utf-8')
  • 其中参数delimiter用于指定数据的分隔符,默认为逗号;参数encoding用于设置编码格式,如果出现中文乱码,则需要设置为’utf-8’或’gbk’。此外,还可以通过参数index_col设置索引列。

(2)文件写入

  • 用to_excel()函数可以将DataFrame中的数据写入Excel工作簿,代码如下:
data = pd.DataFrame([[1,2],[3,4],[5,6]],columns=['A列','B列'])
data.to_excel('data_new.xlsx') #这里使用相对路径,也可使用绝对路径
  • 运行之后,将在代码文件所在的文件夹下生成一个Excel工作簿“data_new.xlsx”,其内容如下图所示。
  • 从上图可以看出,工作表的第1列还保留了行索引信息,如果想在写入数据时不保留行索引信息,可以将to_excel()函数的参数index设置为False(设置为True则表示保留行索引信息),代码如下:
data.to_excel('data_new.xlsx',index=False)
  • to_excel()函数还有一些常用的参数:sheet_name用于指定工作表名称;columns用于指定要写入的列。
  • 用to_csv()函数可以将DataFrame中的数据写入CSV文件,代码如下:
data.to_csv('data_new.csv')
  • 与to_excel()函数类似,to_csv()函数也可以设置index、columns、encoding等参数。如果导出的CSV文件出现了中文乱码现象,可尝试encoding设置为’utf-8’,如果还是无效,则需要设置成’utf_8_sig’,代码如下:
data.to_csv('演示.csv',index=False,encoding='utf_8_sig')

3.DataFrame 中数据的常用操作

  • 创建了DataFrame之后,就可以根据需要操作其中的数据。首先创建一个3行3列的DataFrame用于演示,行索引设定为r1、r2、r3,列索引设定为c1、c2、c3,代码如下:
import pandas as pd
data = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],index=['r1','r2','r3'],columns=['c1','c2','c3'])
data

  • 下面讲解数据的选取、筛选、整体情况查看等常用操作。

(1)按列选取数据

  • 先从简单的选取单列数据入手,代码如下:
a = data['c1']
a
  • a的打印输出结果如下:
  • 可以看到返回的结果不包含列索引信息,这是因为通过data[‘c1’]选取单列时返回的是一个一维的Series格式的数据。如果要返回二维的DataFrame格式的数据,可以使用如下代码:
b = data[['c1']]
b

  • 如果要选取多列,则需要在中括号[]中以列表的形式给出列索引值。例如,选取c1和c3列的代码如下:
c = data[['c1','c3']] #不能写成data['c1','c3']
c
  • c的打印输出结果如下:

(2)按行选取数据

  • 可以根据行序号选取数据,代码如下:
#%%
# 选取第2行和第3行的数据,注意序号从0开始,左闭右开
a = data[1:3]
a
  • a的打印结果如下:
  • 而pandas库的官方文档推荐使用iloc方法来根据行序号选取数据,这样更直观,而且不像data[1:3]可能会引起混淆报错。代码如下:
b = data.iloc[1:3]
b

  • 而且如果要选取单行,就必须使用iloc方法。例如,选取倒数第1行,代码如下:
c = data.iloc[-1]
c
  • 如果使用data[-1],那么pandas库可能会认为-1是列索引,导致混淆报错。
  • 除了根据行序号选取数据外,还可以根据loc方法根据行索引选取数据,代码如下:
d = data.loc[['r2','r3']]
d

  • 如果行数很多,可以用head()函数选取前5行数据,代码如下:
e = data.head()
  • 这里因为data中只有3行数据,所以data.head()会选取所有数据。如果只想选取前两行数据,可以写成data.head(2)。

(3)按区块选取数据

  • 按区块选取是指选取某几行的某几列数据。例如,选取c1和c3列的前两列的前两行数据,代码如下:
a = data[['c1','c3']][0:2] #也可以写成data[0:2][['c1','c3']]
a

  • 在实战中选取区块链数据时,通常先用iloc方法选取行,再选取列,代码如下:
b = data.iloc[0:2][['c1','c3']]
b

  • 两种方法的选取效果是一样的,但第二种方法逻辑更清晰,不容易出现混淆报错,它也是pandas库的官方文档推荐的方法。
  • 如果要选取单个值,该方法就更有优势。例如,选取c3列第1行数据,就不能写成data['c3'][0]data[0]['c3'],而要先用iloc[0]选取第1行,在选取c3列,代码如下:
c = data.iloc[0]['c3']
c
  • 也可以使用iloc和loc方法同时选取行和列,代码如下:
d = data.loc[['r1','r2'],['c1','c3']]
d
e = data.iloc[0:2,[0,2]]
e

loc方法使用字符串作为索引,iloc方法使用数字作为索引。这里介绍一个简单的记忆方法:loc是location(定位、位置)的缩写,所以是用字符串作为索引;iloc中多了一个字母i,而i有经常代表数字,所以用数字作为索引。

  • d和e的打印结果如下:

(4)数据筛选

  • 通过在中括号里设置条件可以对行数进行筛选。例如,选取c1列中数字大于1的行,代码如下:
a = data[data['c1'] > 1]
a

  • 如果有多个筛选条件,可用“&”(表示“且”)或“|”(表示“或”)连接。例如,筛选c1列中数字大于1且c2列中数字等于5的行,代码如下(在筛选条件两侧要加上小括号):
b = data[(data['c1'] > 1) & (data['c2'] == 5)] # 用 “==” 而不是"="来判断是否相等
b
  • b的打印输出结果如下:

(5)数据整体情况查看

  • 通过DataFrame的shape属性可以获取表格的行数和列数,从而快速了解表格的数据量大小,代码如下:
data.shape
  • 运行结果如下,其中第1个数字为行数,第2个数字为列数。因此,通过data.shape[0]和data.shape[1]可分别获取行数和列数。此外,通过len(data)也可以获取行数。
(3, 3)

(6)数据运算

  • 通过数据运算可利用已有的列创建新的一列,代码如下:
data['c4'] = data['c3'] - data['c1']
data.head()

(7)数据排序

  • 用sort_values()函数可以将数据按列排序。例如,按c2列进行降序排序的代码如下:
a = data.sort_values(by='c2',ascending=False)
a
  • 参数by用于指定哪一列来排序;参数ascending默认为True,表示升序排序,若设置为False则表示降序排序。a的打印结果如下。

(8)数据删除

  • 用drop()函数可以删除指定的列和行,其常用语法格式如下:
    DataFrame.drop(index=None,columns=None,inplace=False)
  • 这里列出的几个常用参数的含义:index用于指定要删除的行;columns用于指定要删除的列;inplace默认为False,表示该删除操作不改变原DataFrame,而是返回一个执行删除操作后的新DataFrame,如果为True,则会直接在原DataFrame中执行删除操作。
  • 删除单列,如c1列,代码如下:
a = data.drop(columns='c1')
  • 删除多列,如c1和c3列,可以通过列表的方式声明,代码如下:
b = data.drop(columns=['c1','c3'])
b

注意:删除行时要输入行索引而不是行序号,除非行索引本来就是数字,才可以输入对应的数字。

  • 用drop_duplicates()函数删除内容重复的行,代码如下:
d = data.drop_duplicates() #默认保留首次出现的行,删除之后的重复的行
d
  • dropna()函数可以删除空行(含有空值的行),代码如下:
e = data.dropna()
  • 这种删除方法是只要含有空值的行都会被删除。如果只想删除全为空值的行,可以写成:
data.dropna(how='all')
  • 还可以用参数thresh来限定非空值的个数,代码如下:
data.dropna(thresh=2) #表示行内至少要有两个非空值,否则删除该行
  • 上面的代码都是删除数据后又赋给新的变量,不会改变data的内容。如果想改变data的内容,可以删除数据后重新赋值给data,或者将参数inplace设置为True,代码如下:
#%%
data = data.dropna()
data.drop(inplace=True)

4. DataFrame 拼接

  • pandas 库提供的数据合并与重塑功能极大方便了两个DataFrame的拼接,主要涉及merge()、concat()、append()等函数。这里主要介绍append()函数,它可以方便地将结构相同的DataFrame拼接起来,在爬虫任务中经常会用到。
  • 先创建两个DataFrame用于演示,代码如下:
import pandas as pd
df1 = pd.DataFrame({'公司':['万科','阿里'],'分数':[90,95]})
df2 = pd.DataFrame({'公司':['百度','京东'],'分数':[80,90]})
  • 现在需要对df1和df2进行上下合并,核心代码如下:
df3 = df1.append(df2)
df3

  • 可以看到行索引还是原DataFrame的行索引,如果想忽略原DataFrame的行索引,可以将参数ignore_index设置为True,代码如下:
df3 = df1.append(df2,ignore_index=True)
df3

  • 也可以不设置ignore_index,在用to_excel()函数导出Excel工作簿设置index=False来忽略行索引。爬虫实战中,通常是创建一个空的DataFrame,然后用append()函数一次添加每个表格的数据(参见6.3.2节的具体应用)。
  • 实际上,排序、删除、拼接等操作都不会改变元DataFrame的内容,笔者推荐重新赋值的方式来获取修改后的DataFrame。

第6章 数据结构化与数据存储(6.1数据结构化神器——pandas库,读取网页中的表格数据)相关推荐

  1. 读取excel中的表格数据到字典dict中--python

    读取excel中的表格数据到字典dict中--python: 工作中需要把excel表格中的数据读取出来放到字典中,便于检索和数据处理 主要有两种常用方式: 1.表头在第一行,其他行都是数据 2.表头 ...

  2. 如何使用matlab读取excel中的表格数据

    如何使用matlab读取excel中的表格数据? 设备系统:win10. 操作软件:matlab2020b. 1.首先打开matlab软件,点击[新建]-[脚本]. 2.在脚本中输入代码 A=xlsr ...

  3. java抓取页面表格_用java实现爬虫抓取网页中的表格数据功能源码

    [实例简介] 使用java代码基于MyEclipse开发环境实现爬虫抓取网页中的表格数据,将抓取到的数据在控制台打印出来,需要后续处理的话可以在打印的地方对数据进行操作.包解压后导入MyEclipse ...

  4. python提取网页中表格数据_Python2 BeautifulSoup 提取网页中的表格数据及连接

    网址:http://quote.eastmoney.com/ce- 要做的是提取网页中的表格数据(如:板块名称,及相应链接下的所有个股,依然是个表格) 暂时只写了这些代码: import urllib ...

  5. pandas库读取多个excel文件数据并进行筛选合并处理后导入到新表格中

    一.说明: 通过pandas库解决生活中的实际问题,关键词:pandas:Series/DataFrame 实际场景: ①前几日家中的服装店部分库存需要补货,店长向厂家下了部分订单: ②几日后到了一批 ...

  6. python读取html中的表格数据_Python 数据处理(十八)—— HTML 表格

    HTML 1 读取 HTML 内容 顶级 read_html() 函数可以接受 HTML 字符串.文件或URL,并将 HTML 表解析为 pandas DataFrames 列表. 注意:即使 HTM ...

  7. vb 读取oracle中的表格数据,如何将数据库信息读取导出excel表格中-VB 从SQL数据库中把数据导出到Excel表格中,怎么写?...

    VB 从SQL数据库中把数据导出到Excel表格中,怎么写? INSERT INTO OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data Source=&q ...

  8. MATLAB中把Excel数据矩阵化,excel将表格数据矩阵-MATLAB怎么读取EXCEL中矩阵形式的数据,并存放在一......

    求EXCEL表格高手,如何在已知矩阵中,符合矩阵内条... =SUM((B$8=TRANSPOSE(OFFSET($B$1:$C$1,MATCH($A9,$A$2:$A$6,),)))*1) 数组公输 ...

  9. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

最新文章

  1. 漫画 | 如何用 Kubernetes 实现 CI/CD 发布流程?
  2. netty websocket客户端_Websocket操作字节序 之 服务端
  3. 传输文件过程中遇到异常被中断
  4. python中分支结构与c语言中有何区别_C语言的分支语句有哪几种?C语言分支结构的基本形式是什么,区别是什么?...
  5. 树莓派该文件名_树莓派学习笔记(2):常用linux命令
  6. python全栈学习--day12(函数高级应用-带参数的装饰器,多个装饰器装饰一个函数)...
  7. python单行箭头_在Python中,如何让箭头尖在指定的坐标处开始/结束?
  8. linux上点时间延时,Linux上时间和定时器
  9. Linux下执行程序出现 Text file busy 时的解决办法。
  10. android window 半透明,popupWindow半透明背景
  11. v4l2-ctl 控制命令
  12. jQuery库简介及下载引入
  13. cmd常用命令 cmd打开文件软件等
  14. C28x DSP程序加载与运行
  15. 无线路由器实现局域网内中继功能
  16. dll,sys文件被认定为病毒后如何删除
  17. RISC-V数据模型,-mabi=ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d
  18. 使用pygame前的小插曲
  19. sail.js学习 - 安装篇
  20. 数字编码;数字语音编码

热门文章

  1. 产品开发与python_生产 - MBA智库百科
  2. vrep学习笔记_V-rep学习笔记:力传感器
  3. 2020年最流行的自动化测试工具有哪些?-全网最全最细都在这里了!
  4. 督办管理系统私有化部署+天翎myapps低代码
  5. 很多蓝牙设备搜到不到,怎么办
  6. 通过demo学习OpenStack开发所需的基础知识 -- 单元测试
  7. 曾国藩家训经典语录50条,条条入心
  8. 计算机指令的执行过程详解
  9. Windows 工具快捷键 推荐
  10. 分割的单阶段,两阶段,实时分割模型