Python 爬蟲[在公開資訊站_年報下載PDF]

哈囉~各位帥哥美女,是不是有一些困擾,例如 : 用手動的方式去公開資訊站年報,然後在輸入你要分析的那家公司和年份,再下載pdf檔;之後在從pdf檔案中找尋你要的資訊,一個一個的把值打進你的Excel 或 Word 報告裡面。

身為資工的我看在眼裡,心理非常的想寫一套程式幫各位一手包辦這些事情,且在短短幾秒鐘內完成。

於是…..ㄐㄧㄤ ㄐㄧㄤ ~~~!!!!,就是底下我將介紹的內容。

p.s.等等看到程式碼會心悸、噁心、癲癇和孕吐的人,拜託你先看醫生,然後再回來努力看到第二段就好,謝謝(´・ω・`)

code本體 -> 傳送門

## 第一段 : 創一個虛擬網路,模擬我們手動執行

基本上想做到按鍵觸發、鍵盤輸入都需要用到selenium這套件,那我模擬的環境是用chrome,所以執行這段會跑出一個乾淨的網頁。

## 第二段 : 創一個虛擬網路,模擬我們手動執行

這裡就是使用者輸入想要找的年度和公司代碼,所以看不懂程式碼的你只要改這裡的值就好,其他程式碼你一律直接執行到最後就好了。

url字串可以發現?後面是分別加入我們輸入的值,利用這些參數就可以到查詢的結果,無須手動方式輸入,這叫url request的方式呼叫。

參數分別有
* step = 1
以市場別/產業別查詢代號
* colorchg=1
背景變白色
* co_id={number} -> 這寫法是python獨特寫法的
公司代號
* year={year}
年度
* mtype=F
資料類型
Q : 我怎知道參數的名稱?
A : 你可以到網站按F12,看看你手動輸入的格子他的name是什麼。例如mtype

## 第三段 : 取得”股東會年報”,點pdf

* 執行結果:
link = javascript:readfile2(“F”,”2330",”2018_2330_20190605F04.pdf”);
pdf_name = 2018_2330_20190605F04.pdf

link 是 從這網站找到”F04" 且 “.pdf” 的<a href的文字 。(xpath:[詳細內容])
<a href=”javascript:readfile2(&quot;F&quot;,&quot;2330&quot;,&quot;2018_2330_20190605F04.pdf&quot;);”>2018_2330_20190605F04.pdf</a>

之後找到link取得pdf_name,找到點擊下去,如下。

你會發現它新增了一個分頁~~

## 第四段 : 切換瀏覽器分頁

* 執行結果 :
`’https://doc.twse.com.tw/server-java/t57sb01'`

可以發現目前的模擬瀏覽器停留在新的分頁。
之所以要time.sleep是要評估開啟瀏覽器需要幾秒,沒設sleep的話可能會跟不上程式的速度而產生錯誤,這點需要特別注意。

## 第五段 : 切換瀏覽器分頁

* 執行結果:
`’https://doc.twse.com.tw/pdf/2018_2330_20190605F04_20201228_142438.pdf'`

ActionChains 是模擬滑鼠點擊,點擊.pdf的連結,切到最新頁面。
由結果知道原來這個pdf檔案是在這個url,也可以發現說他最後一串url的數字是隨機的,並且還具有時效性。

然後取完url後,再把虛擬網頁關掉。

## 第六段 : 自動下載

根據上一段可以知道我們還需要做點擊才能夠下載,那我這方法是希望能夠不用點擊即可下載,原因是下載圖示是抓不到的資訊,所以需要用其他方法完成他。

Options來設定:
1. default_directiory: ‘./’ 預設下載地址
2. prompt_for_download: False 定義下載不彈窗
3. directory_upgrade”: True 得到default_directiory位置
4. always_open_pdf_externally :True 打開pdf

之後.get(url)就可以根據你設定的參數達成無點擊下載了。

就這樣可以把熱騰騰的資料在短短幾秒抓下來咯~~

ㄙㄨㄚˋ

--

--