本文将展现一个稍微不同点的爬虫。
以往咱们的爬虫都是从网络上爬取数据,由于网页通常用HTML,CSS,JavaScript代码写成,所以,有大量成熟的技术来爬取网页中的各类数据。此次,咱们须要爬取的文档为PDF文件。本文将展现如何利用Python的camelot模块从PDF文件中爬取表格数据。
在咱们的平常生活和工做中,PDF文件无疑是最经常使用的文件格式之一,小到教材、课件,大到合同、规划书,咱们都能见到这种文件格式。但如何从PDF文件中提取其中的表格,这倒是一个大难题。由于PDF中没有一个内部的表示方式来表示一个表格。这使得表格数据很难被抽取出来作分析。那么,咱们如何作到从PDF中爬取表格数据呢?
答案是Python的camelot模块!
camelot是Python的一个模块,它可以让任何人轻松地从PDF文件中提取表格数据。可使用如下命令安装camelot模块(安装时间较长):html
pip install camelot-py
camelot模块的官方文档地址为:https://camelot-py.readthedoc...。
下面将展现如何利用camelot模块从PDF文件中爬取表格数据。python
首先,让咱们看一个简单的例子:eg.pdf,整个文件只有一页,这一页中只有一个表格,以下:web
使用如下Python代码就能够提取该PDF文件中的表格:算法
import camelot # 从PDF文件中提取表格 tables = camelot.read_pdf('E://eg.pdf', pages='1', flavor='stream') # 表格信息 print(tables) print(tables[0]) # 表格数据 print(tables[0].data)
输出结果为:微信
<TableList n=1> <Table shape=(4, 4)> [['ID', '姓名', '城市', '性别'], ['1', 'Alex', 'Shanghai', 'M'], ['2', 'Bob', 'Beijing', 'F'], ['3', 'Cook', 'New York', 'M']]
分析代码,camelot.read_pdf()为camelot的从表格中提取数据的函数,输入的参数为PDF文件的路径,页码(pages)和表格解析方法(有stream和lattice两个方法)。对于表格解析方法,默认的方法为lattice,而stream方法默认会把整个PDF页面当作一个表格来解析,若是须要指定解析页面中的区域,可使用table_area这个参数。
camelot模块的便捷之处还在于它提供了将提取后的表格数据直接转化为pandas,csv,JSON,html的函数,如tables[0].df,tables[0].to_csv()函数等。咱们以输出csv文件为例:网络
import camelot # 从PDF文件中提取表格 tables = camelot.read_pdf('E://eg.pdf', pages='1', flavor='stream') # 将表格数据转化为csv文件 tables[0].to_csv('E://eg.csv')
获得的csv文件以下:函数
在例2中,咱们将提取PDF页面中的某一区域的表格的数据。PDF文件的页面(部分)以下:spa
为了提取整个页面中惟一的表格,咱们须要定位表格所在的位置。PDF文件的坐标系统与图片不同,它以左下角的顶点为原点,向右为x轴,向上为y轴,能够经过如下Python代码输出整个页面的文字的坐标状况:.net
import camelot # 从PDF中提取表格 tables = camelot.read_pdf('G://Statistics-Fundamentals-Succinctly.pdf', pages='53', \ flavor='stream') # 绘制PDF文档的坐标,定位表格所在的位置 tables[0].plot('text')
输出结果为:code
UserWarning: No tables found on page-53 [stream.py:292]
整个代码没有找到表格,这是由于stream方法默认将整个PDF页面看成表格,所以就没有找到表格。可是绘制的页面坐标的图像以下:
仔细对比以前的PDF页面,咱们不难发现,表格对应的区域的左上角坐标为(50,620),右下角的坐标为(500,540)。咱们在read_pdf()函数中加入table_area参数,完整的Python代码以下:
import camelot # 识别指定区域中的表格数据 tables = camelot.read_pdf('G://Statistics-Fundamentals-Succinctly.pdf', pages='53', \ flavor='stream', table_area=['50,620,500,540']) # 绘制PDF文档的坐标,定位表格所在的位置 table_df = tables[0].df print(type(table_df)) print(table_df.head(n=6))
输出的结果为:
<class 'pandas.core.frame.DataFrame'> 0 1 2 3 0 Student Pre-test score Post-test score Difference 1 1 70 73 3 2 2 64 65 1 3 3 69 63 -6 4 … … … … 5 34 82 88 6
在具体识别PDF页面中的表格时,除了指定区域这个参数,还有上下标、单元格合并等参数,详细地使用方法可参考camelot官方文档网址:https://camelot-py.readthedoc...。
注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎你们关注哦~~