本文目錄一覽:
- 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文件的內容將它切成可管理的塊,然後解析和處理每個塊,終於可以確保不再需要更長的時間來把它全部處理完。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/275754.html