MENU

数据采集与数据分析(python)

爬虫技术学习笔记与遇到的问题

案例:使用Pdfplumber+Camelot解提取年报中的表格数据

很多朋友会问,pdfplumber也能解析表格,为什么还要使用Camelot呢?这因为年报中的表格很多都是一个单元格中有多个换行,像这样:
多行.jpg
pp的解析结果是每个换行都是表格中的一样,这很难提取出准确的数据。
相对于多换行,这样的pdfplumber就能正常解析:
QQ截图20210427172430.png

面对这一问题,使用Camelot的stream模式就能好解决,但是有个遗憾,就是它无法提取全文的字符串,只能提取表格,和所有与表格相关的元素。所以需要结合pdfplumber,通过pp来解决查找关键词。





Read More

使用Python3+Camelot+Pdfplumber+Centos8 解析pdf表格过程中的问题

环境:
系统:Centos8 Python3版本:3.9.2 Camelot-py库的版本:0.57

在Centos8环境下遇到的问题

  • Centos下运行程序报错ModuleNotFoundError: No module named '_sqlite3'

报这个错误的原因是Centos没有安装sqlite-devel库

dnf install sqlite-devel

安装后运行程序发现让然报错。后来发现sqlite-devel需要在编译python之前安装,那么好吧,接下来重新编译python3

cd /usr/local/lib/python3.x
.configure --prefix=/usr/local/lib/
make&make install

再次运行程序,就不会出现报错了~


  • Centos下运行程序报错ModuleNotFoundError: No module named '_bz2'

出现这种错误的原因一般是由于python3的lib-dynload中缺少 _bz2.cpython-38-x86_64-linux-gnu.so这个动态链接库
造成这种情况很有可能是:后期在系统中安装了其他或更高的python版本所导致。解决办法就是将系统中原有的那个python链接库复制到新版本的里面来就可以。那么开始操作。(没有的可以下载我这个~)
_bz2.cpython-36m-x86_64-linux-gnu.so
将这个so文件放入/usr/local/lib/python3.x/lib-dynload/文件夹下,并改名为_bz2.cpython-3[Xm]-x86_64-linux-gnu.so
这里注意中括号里的变量X和m字符,X表示你的python版本,m的意思是:3.9以下版本必须添加m,3.9及以上版本无需m。
如果使用的是我的文件,请设置好执行权限

chmod +x _bz2.cpython-39-x86_64-linux-gnu.so

接下来运行程序,已无报错!

到目前为止,由于Centos8环境所造成的问题,只发现这2个,后续出现还会更新~







Read More

linux CentOS8 安装Ghostscript

最近在研究使用Camelout解析PDF表格。Camelot有点像selenium那样会驱动浏览器,只不过Camelot驱动的是Ghostscript。
那么Ghostscript又是什么呢,下面点解了解一下:

Ghostscript是一套建基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等而编译成的免费软件。

进入正题 - linux CentOS8 安装Ghostscript


Read More

python3解析JSONP数据

Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据。
爬虫场景:发送请求后,返回JSONP,格式如: callbackFunction(["customername1","customername2"])
解决方法:使用正则表达式提取callbackFunction()以外的数据。
具体实施:

import json, re
JSONP = 'callbackFunction(["customername1","customername2"])'
j = json.loads(re.findall(r'^\w+\((.*)\)$',JSONP)[0])
print(type(j),j)

<class 'list'> ['customername1', 'customername2']

另外发现还有一种发放很有意思:(如果你肯定返回的jsonp是安全的情况下可以使用eval)

JSONP = 'callbackFunction(["customername1","customername2"])'

def callbackFunction(lists):
    print lists
eval(JSONP)

['customername1', 'customername2']



Read More

Cookie基础

Cookie可以理解为在HTTP协议下,服务器或其他脚本语言维护客户端信息的一种方式,是保存在客户端(比如浏览器)的文本文件,Cookie中往往包含客户端或者用户的相关信息。

Read More