python解析慢,python速度慢怎麼解決

本文目錄一覽:

如何解決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-hant/n/275754.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-17 16:06
下一篇 2024-12-17 16:06

相關推薦

  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論