記一次為解決Python讀取PDF文件的Shell操作



一、背景

本想將 PDF 文件轉換為 Word 文檔,然后網上搜索了一下發現有挺多轉換的軟件。有的是免費的、收費,咱也不知哪個好使,還得一個個安裝試用。先不說能不解決問題,就這安裝試用想想就腦殼疼。便想起了"Python 大法",隨即搜了幾篇看起來比較完整的博客,二話不說粘貼復制,改改運行試試。使用環境(python3.6+pdfminer3k),代碼這里就不放出來了。

二、問題

運氣不好,這一試就報錯WARNING:root:GBK-EUC-H,然后又搜了一下有同樣的報錯問題,但是這篇博客沒啥大用,僅僅是知道缺了相關的字體文件,通過其中的鏈接順藤摸瓜找到了 github 上的字體文件列表頁
https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap

三、解決

下載了報錯的對應文件 GBK-EUC-H.pickle.gz,然后將其文件解壓把放置 Python 的安裝目錄下 Lib\site-packages\pdfminer\cmap 路徑中,再次運行又報錯 "pdfminer.converter:undefined: <PDFCIDFont: basefont='΢ÈíÑźÚ', cidcoding='Adobe-GB1'>, 3027" 。可以說明第一個問題已經解決了,接下來的報錯按照這個方法來就行了。但是想想等下有報錯還得下,索性全部下下來。

四、一頓分析及 Shell 操作

1.先網頁 F12 打開控制台分析 Element 元素,Xpath 信息 "//td[@class='content']/span/a/@href"

2.使用 curl 命令獲取響應並處理 (通過"檢查網頁源碼"發現 span 標簽和 a 標簽同行)

  • 先確認是否與步驟 1 中的數量一致
# 通過獲取父標簽信息的之后的行
curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap | grep -A1 '<td class="content">' |grep "<span" | wc -l
# 直接正則匹配到行
curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap | grep -E '\s+<span.*><a.*title' |wc -l
  • 確認一致,則進行下一步數據清理,進而獲得所有字體文件列表
curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap | grep -E '\s+<span.*><a.*title' |awk -F '"' '{print $6}'

3.進入某個文件詳情頁,分析下載請求地址
將下面鏈接放入地址欄,會進入文件下載操作,所以這就是文件的真實下載地址

4.對其他兩三個文件進行同樣分析,發現其規律,部分固定鏈接地址
https://raw.githubusercontent.com/euske/pdfminer/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap

5.開始命令行構造下載地址

curl -s https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap \
|grep -E '\s+<span.*><a.*title'|awk -F '"' '{print $6}'|while read line; do echo \
"https://raw.githubusercontent.com/euske/pdfminer/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/$line"; done

6.升級-->構造及文件下載腳本

# !/usr/bin/bash

# 參數校驗
folder=$1
# 參數為空判斷
[ -z $folder ] && folder="downfiles"

# 為文件且存在判斷,不能重名
if [ -f $folder ]
then
    echo "Error: 【$folder】 already exist! and it's file"
    exit
fi

# 不存在則創建
if [ ! -e $folder ]
then
    mkdir $folder
fi

echo ""   
echo "文件保存路徑為: $PWD/$folder"
echo ""


# github 主頁列表顯示地址
listPage="https://github.com/euske/pdfminer/tree/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap"

# github 詳情顯示地址
# https://github.com/euske/pdfminer/blob/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/
# github 下載按鈕地址
# https://github.com/euske/pdfminer/raw/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/

 
# 真實下載地址
base="https://raw.githubusercontent.com/euske/pdfminer/f1d5d681b6d2ab0ddeaea925ba784ebb94f6d509/pdfminer/cmap/"
# 模擬瀏覽器
userAgent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"


files=`curl -s -A "${userAgent}" $listPage | grep -E '\s+<span.*><a.*title' | awk -F '"' '{print $6}'`

if [ -z "$files" ]
then
    echo "獲取列表信息失敗!!!"
    exit
else
    num=`echo $files| awk 'BEGIN{RS=" "}END{print NR}'`
    echo "成功獲取列表信息, 總共 $num"
fi

echo ""

for name in $files
do
    # infos="curl -s -A \"${userAgent}\" -w %{http_code} \"$base$name\" -o $folder/$name"
    sleep 1
    res=`curl -s -A "${userAgent}" -w %{http_code} "$base$name" -o $folder/$name`
    if [ "$res" = "200" ] 
    then
        echo "SUCCESS: 【$name】 下載成功" 
    else
        # echo $infos
        echo "ERROR: 【$name】 下載失敗--$res"
        sleep 0.5
    fi
done

五、后續

文件下載失敗返回碼為 000 ----待分析解決


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM