一、背景
本想將 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 ----待分析解決