本文目录一览:
- 1、如何解决Python读取PDF内容慢的问题
- 2、python 爬虫 解析效率如何提升
- 3、python beautifulsoup 解析 xml 速度很慢
- 4、shell脚本做文本解析同php和python比哪个效率更高
- 5、如何使用python解析超大XML文档
如何解决Python读取PDF内容慢的问题
1,引言
晚上翻看《Python网络数据采集》这本书,看到读取PDF内容的代码,想起来前几天集搜客刚刚发布了一个抓取网页pdf内容的抓取规则,这个规则能够把pdf内容当成html来做网页抓取。神奇之处要归功于Firefox解析PDF的能力,能够把pdf格式转换成html标签,比如,div之类的标签,从而用GooSeeker网页抓取软件像抓普通网页一样抓取结构化内容。
从而产生了一个问题:用Python爬虫的话,能做到什么程度。下面将讲述一个实验过程和源代码。
2,把pdf转换成文本的Python源代码
下面的python源代码,读取pdf文件内容(互联网上的或是本地的),转换成文本,打印出来。这段代码主要用了一个第三方库PDFMiner3K把PDF读成字符串,然后用StringIO转换成文件对象。(源代码下载地址参看文章末尾的GitHub源)
from urllib.request import urlopenfrom pdfminer.pdfinterp import PDFResourceManager, process_pdffrom pdfminer.converter import TextConverterfrom pdfminer.layout import LAParamsfrom io import StringIOfrom io import opendef readPDF(pdfFile):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, laparams=laparams)
process_pdf(rsrcmgr, device, pdfFile)
device.close()
content = retstr.getvalue()
retstr.close() return content
pdfFile = urlopen("")
outputString = readPDF(pdfFile)print(outputString)
pdfFile.close()
如果PDF文件在你的电脑里,那就把urlopen返回的对象pdfFile替换成普通的open()文件对象。
3,展望
这个实验只是把pdf转换成了文本,但是没有像开头所说的转换成html标签,那么在Python编程环境下是否有这个能力,留待今后探索。
4,集搜客GooSeeker开源代码下载源
1. GooSeeker开源Python网络爬虫GitHub源
5,文档修改历史
2016-05-26:V2.0,增补文字说明
2016-05-29:V2.1,增加第六章:源代码下载源,并更换github源的网址
python 爬虫 解析效率如何提升
提高爬虫效率的方法
协程。采用协程,让多个爬虫一起工作,可以大幅度提高效率。
多进程。使用CPU的多个核,使用几个核就能提高几倍。
多线程。将任务分成多个,并发(交替)的执行。
分布式爬虫。让多个设备去跑同一个项目,效率也能大幅提升。
打包技术。可以将python文件打包成可执行的exe文件,让其在后台执行即可。
其他。比如,使用网速好的网络等等。
反爬虫的措施
限制请求头,即request header。解决方法:我们可以填写user-agent声明自己的身份,有时还要去填写origin和referer声明请求的来源。
限制登录,即不登录就不能访问。解决方法:我们可以使用cookies和session的知识去模拟登录。
复杂的交互,比如设置“验证码”来阻拦登录。这就比较难做,解决方法1:我们用Selenium去手动输入验证码;方法2:我们用一些图像处理的库自动识别验证码(tesserocr/pytesserart/pillow)。
ip限制。如果这个IP地址,爬取网站频次太高,那么服务器就会暂时封掉来自这个IP地址的请求。 解决方法:使用time.sleep()来对爬虫的速度进行限制,建立IP代理池或者使用IPIDEA避免IP被封禁。
python beautifulsoup 解析 xml 速度很慢
那你为什么要用 美丽的汤 来解析xml呢?
为什么不用 xml.dom.minidom.parseString 或者别的 专门解析xml的模块呢?
shell脚本做文本解析同php和python比哪个效率更高
N年前为了每天分析数十GB的日志,正好做过测试。测试是在Linux环境下(Redhat ES
3),测试处理一个数百兆的日志文件进行汇总分析(邮件日志),分别用C, Perl,
Python,Shell做同样的处理。处理速度排名是CPerlpythonshell。C是最快的,比别的快上至少
一个数量级;其次是Perl,毕竟是为文本处理而生,最强的内置正则表达式;Python比Perl慢了点,记得速度是Perl的60%左右;shell
最慢,虽然sed, grep,awk都不慢(其实都是C写的),但通过shell组合在一起效率还是差了不少。
如何使用python解析超大XML文档
在工作时最有吸引力的地方在于可以尽量避免使用昔日的技术。主机、租用线路、COBOL语言......没有人应该要处理这些东西了,对不对?不幸的是,你最终会与现实发生冲突,即使是2014年,大家都知道JSON是最好的方式,你的票务供应商(你无法控制的)会告诉你,只有使用XML导出才能让大容量的数据输出他们的系统。
唉~~~~,好,很好,无所谓。这只是一次性的事情,我不需要照顾和养活这个XML,我只需要解析它并将数据保存到Postgres中,我们就可以利用它。不应该太困难,我需要写一点python脚本…
import xml.etree.cElementTree as ET
tree = ET.parse('huge.xml')
for ticket_node in tree.findall('ticket'):
#etc...
......这将工作的非常好,如果我们谈论的是一个几MB的XML文档,但是如果遇到的是huge.xml它是1.3GB的巨大文档,这种方法只会融化你的笔记本电脑(以16GB的MacBookPro,一旦python的过程花了超过约3GB的内存,系统变得几乎完全反应迟钝,并且它几乎还没有完成)。回到原点。
首先让我们快速浏览一下我们的数据。
?xml version="1.0" encoding="UTF-8"?
tickets report_date="20140217"
ticket
!-- various ticket fields, some of which I want --
comments type="array"
comment
!-- various comment fields, some of which I want --
/comment
!-- possibly more comment tags --
/comments
/ticket
!-- many, many ticket tags --
/tickets
不是很复杂,作为一个整体它不是一个真正的文件中,ticket节点只是一个列表,每一类又是一个小文件,我想挑出几部分出来。我不需要做针对树的任何复杂的遍历,只是希望从每个ticket节点获得一些数据然后把它扔掉再读下一个。原来ElementTree的对眼前这个场景提供了一个工具:iterparse()。让我们再试一次:
import xml.etree.cElementTree as ET
for event, element in ET.iterparse('huge.xml'):
if event == 'end' and element.tag == 'ticket':
#process ticket...
…什么? !我的笔记本电脑又融化了!跟parse-the-whole-file的方法一样使用了完全相同的内存(和系统响应能力)。到底发生了什么事?
好吧,稍微google了一下,google告诉我,当iterparse()读取元素时,它仍然是在内存中建立了一个完整的文档树,就像我一开始使用parse()方法一样。几个博客和stackoverflow的答案推荐添加element.clear()方法在循环结束时清理你不需要的对象,可以限制内存消耗。我拯救了你的麻烦:它不工作。其他博客,so的答案,甚至一个IBM白皮书表明需要在循环结束时进行更彻底的清扫工作结束:
import lxml.etree as ET #the IBM piece used lxml but I tried cElementTree also
for event, element in ET.iterparse('huge.xml'):
if event == 'end' and element.tag == 'ticket':
#process ticket...
element.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
......哎呀!我溶化了另一台笔记本电脑!
为什么不工作?坦率地说,我不知道。
我稍微离题一下来说说为什么我爱Python。作为一个DBA和系统工程师,我面对着大量的一次性编程挑战。移动这个从这里到那里、Munge数据、将数据从这里迁移到哪里。这种类型的挑战是非常适合于蛮力编程解决问题的这种方式。总之,有时是不值得在建立一个优雅的、易于维护的解决方案上花费任何时间。有时候,你只需要解决这个问题,然后忘掉它。 在处理这类问题上Python最棒的,简洁的语法、良好的设计理念、丰富的库都有助于这个工具,很容易快速解决您碰到的任何问题。即使速度比同等的Java解决方案的10倍还慢,如果需要5分钟的时间写而不是5小时,我更愿意使用python,因为人类工时比CPU工时更有价值。
所有这一切都证明下述方式解决了我的问题,而不会融化的笔记本电脑:
import xml.etree.cElementTree as ET
def process_buffer(buf):
tnode = ET.fromstring(buf)
#pull it apart and stick it in the database
inputbuffer = ''
with open('huge.xml','rb') as inputfile:
append = False
for line in inputfile:
if 'ticket' in line:
inputbuffer = line
append = True
elif '/ticket' in line:
inputbuffer += line
append = False
process_buffer(inputbuffer)
inputbuffer = None
del inputbuffer #probably redundant...
elif append:
inputbuffer += line
不是最优雅,或有效率,或者通用的解决方案,但它可以工作。刚刚看了手边的手册,利用其结构的简单性,在解析之前根据xml文件的内容将它切成可管理的块,然后解析和处理每个块,终于可以确保不再需要更长的时间来把它全部处理完。