2016年12月30日 星期五

Python爬蟲抓取台灣銀行的牌告匯率

參考來源:大數軟體有限公司 [爬蟲實戰] 如何撰寫Python爬蟲抓取台灣銀行的牌告匯率?


來源:https://www.youtube.com/watch?v=-c5rrzjsN34
程式碼範例:
import pandas
dfs = pandas.read_html('http://rate.bot.com.tw/xrt?Lang=zh-TW')
currency = dfs[0]
currency = currency.ix[:,0:5]
currency.columns = [u'幣別',u'現金匯率-本行買入',u'現金匯率-本行賣出',u'即期匯率-本行買入',u'即期匯率-本行賣出']
currency[u'幣別'] = currency[u'幣別'].str.extract('\((\w+)\)')
print(currency)
currency.to_excel('currency.xlsx')


執行結果:
     幣別 現金匯率-本行買入 現金匯率-本行賣出 即期匯率-本行買入 即期匯率-本行賣出
0   USD      31.9    32.442      32.2      32.3
1   HKD     4.008     4.203     4.128     4.188
2   GBP     38.53     40.46      39.4     39.82
3   AUD     22.98     23.64     23.17      23.4
4   CAD     23.53     24.27      23.8     24.02
5   SGD     21.78     22.56      22.2     22.38
6   CHF     30.85     31.91     31.38     31.67
7   JPY    0.2672    0.2782    0.2736    0.2776
8   ZAR         -         -      2.32       2.4
9   SEK      3.15      3.66      3.49      3.59
10  NZD     22.06     22.69      22.3      22.5
11  THB    0.7965    0.9395     0.885     0.925
12  PHP    0.6019    0.7349         -         -
13  IDR   0.00208   0.00278         -         -
14  EUR      33.2     34.35      33.7      34.1
15  KRW   0.02506   0.02896         -         -
16  VND   0.00104   0.00154         -         -
17  MYR     6.105     7.705         -         -
18  CNY      4.52     4.682     4.592     4.642

2016年10月3日 星期一

遇到 JavaScript 網頁的爬蟲程式怎麼取得網頁內容

有些網頁利用JavaScript動態自後端取得資料後才在網頁呈現,單純的爬蟲程式遇到這個情況,該怎麼辦呢?

可以試試看自動化測試軟體 selenium 和 PhantomJS 來模擬瀏覽器瀏覽,取得網頁呈現的真實模樣。
  1. 先安裝 python selenium 套件
  2. 下載並解壓縮 PhantomJS 軟體,檔案路徑等下python程式碼中會用上
sudo pip install selenium

使用selenium 和 PhantomJS的程式碼範例:
from selenium import webdriver

driver = webdriver.PhantomJS(executable_path='/您的PhantomJS目錄/bin/phantomjs')
# 以PChome購物搜尋 macbook 為例
driver.get('http://ecshweb.pchome.com.tw/search/v3.3/?q=macbook')
pageSource = driver.page_source
print(pageSource)
driver.close()

接下來整合 BeautifulSoup 的程式碼範例:
import requests
from bs4 import BeautifulSoup
from selenium import webdriver

url = 'http://ecshweb.pchome.com.tw/search/v3.3/?q=macbook'

driver = webdriver.PhantomJS(executable_path='/您的PhantomJS目錄/bin/phantomjs')
driver.get(url)
pageSource = driver.page_source
#print(pageSource)

soup = BeautifulSoup(pageSource, "lxml")

item_count = 1
for item in soup.select('img'):
    #print(item)
    print('['+str(item_count)+']')
    print(item['title'])
    print(item['src'])
    item_count += 1

driver.close()

執行結果:
[1]
MacBook Air 13 吋:256GB(Z0TB0001U)
http://a.ecimg.tw/pic/v1/data/item/201606/D/G/A/X/5/Y/sDGAX5Y-A9007812U000_5752453b19aff.jpg
[2]
MacBook Air 13 吋:128GB(MMGF2TA/A)
http://a.ecimg.tw/pic/v1/data/item/201605/D/G/A/X/0/7/sDGAX07-A90077H7W000_5733ebfc0a883.jpg
[3]
MacBook Pro 13 吋:2.7GHz 256GB (MF840TA/A)
http://a.ecimg.tw/pic/v1/data/item/201511/D/G/A/X/9/6/sDGAX96-A9006MBQR000_563c649e0b12b.jpg
[4]
MacBook Pro 13 吋:2.7GHz 128GB (MF839TA/A)-0160830
http://a.ecimg.tw/pic/v1/data/item/201608/D/G/A/X/7/1/sDGAX71-A9007H2EZ000_57c53b72dab2e.jpg
[5]
MacBook Pro 13 吋:2.7GHz 128GB (MF839TA/A)
http://a.ecimg.tw/pic/v1/data/item/201601/D/G/A/X/7/H/sDGAX7H-19006S5WQ000_5695c64a6dfdf.jpg
[6]
MacBook Air 13 吋:256GB(MMGG2TA/A)
http://a.ecimg.tw/pic/v1/data/item/201605/D/G/A/X/0/7/sDGAX07-A90077H97000_5733ec30bc6f2.jpg
[7]
MacBook Air 13 吋:128GB(MMGF2TA/A) 
http://a.ecimg.tw/pic/v1/data/item/201609/D/G/A/X/0/7/sDGAX07-19007IBWT000_57d8cf53b058b.jpg
[8]
MacBook Air 13 吋:256GB(MMGG2TA/A)
http://a.ecimg.tw/pic/v1/data/item/201605/D/G/A/X/0/7/sDGAX07-A900799NW000_5742d25e860a6.jpg
[9]
MacBook 12 吋 256GB 玫瑰金 (MMGL2TA/A)
http://a.ecimg.tw/pic/v1/data/item/201605/D/G/A/X/4/X/sDGAX4X-A9007904G000_573d338a41048.jpg
[10]
MacBook Pro 13 吋:2.7GHz 128GB (MF839TA/A) 
http://a.ecimg.tw/pic/v1/data/item/201609/D/G/A/X/7/H/sDGAX7H-19007HCAE000_57c9111d721f8.jpg
[11]
MacBook Air 13 吋:128GB(MJVE2TA/A)-0160505
http://a.ecimg.tw/pic/v1/data/item/201605/D/G/A/X/7/1/sDGAX71-A90078DVN000_5731b259475be.jpg
[12]
MacBook Air 13 吋:256GB (Z0TB0001U)
http://a.ecimg.tw/pic/v1/data/item/201606/D/G/A/X/5/Y/sDGAX5Y-A9007AD55000_5757bc01e00b8.jpg
[13]
MacBook Pro 13 吋:2.7GHz 256GB (MF840TA/A)
http://a.ecimg.tw/pic/v1/data/item/201609/D/G/A/X/7/H/sDGAX7H-19007HCA4000_57c911687f3a0.jpg
[14]
MacBook Pro 13 吋:2.5 GHz 500GB (MD101TA/A)
http://a.ecimg.tw/pic/v1/data/item/201602/D/G/A/X/3/N/sDGAX3N-19006UUHB000_56cd1e246ef7f.jpg
[15]
MacBook 12 吋 512GB 太空灰(MJY42TA/A)-0160830
http://a.ecimg.tw/pic/v1/data/item/201608/D/G/A/X/7/1/sDGAX71-A9007H2M9000_57c541fe92913.jpg
[16]
MacBook Air 13 吋:128GB(Z0TA0001B)-01600830
http://a.ecimg.tw/pic/v1/data/item/201608/D/G/A/X/7/1/sDGAX71-A9007H1FX000_57c5056a09d5c.jpg
[17]
MacBook Air 13 吋:256GB(Z0TB0001U)
http://a.ecimg.tw/pic/v1/data/item/201606/D/G/A/X/5/Y/sDGAX5Y-A90078141000_5752441944474.jpg
[18]
MacBook Pro 13 吋:2.5 GHz 500GB (MD101TA/A)
http://a.ecimg.tw/pic/v1/data/item/201409/D/G/A/X/3/N/sDGAX3N-19005FWJW000_541a90b4ee17a.jpg
[19]
MacBook Pro 15 吋: 2.8GHz 512GB 配備Retina顯示器(P/N.Z0RG0010V)
http://a.ecimg.tw/pic/v1/data/item/201605/D/G/A/X/4/Y/sDGAX4Y-A90077V5U000_572869a2c5313.jpg
[20]
MacBook Air 11 吋:128GB(MJVM2TA/A)
http://a.ecimg.tw/pic/v1/data/item/201504/D/G/A/X/0/7/sDGAX07-A90060KEB000_552b96e29b665.jpg


延伸閱讀:

#

2016年6月21日 星期二

擷取PDF檔案內容進行中文分詞

目標:擷取PDF檔案內容並進行中文分詞。

Source : Uncalno Tekno
以 PDFMiner API 自PDF檔案擷取文字資料,再利用先前我們曾經使用過的jieba來進行中文分詞。 



工具:
Python Packages 也可以 pip 方式進行安裝:
export http_proxy=http://proxy.hinet.net:80
export https_proxy=http://proxy.hinet.net:80

pip install pdfminer
pip install jieba


程式:
# -*- coding: utf-8 -*-
import sys
import jieba
from cStringIO import StringIO
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage

def convert_pdf_to_txt(path):
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    codec = 'utf-8'
    laparams = LAParams()
    device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
    fp = file(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    password = ""
    maxpages = 0
    caching = True
    pagenos=set()
    for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
        interpreter.process_page(page)
    fp.close()
    device.close()
    str = retstr.getvalue()
    retstr.close()
    return unicode(str, 'utf-8')

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print 'python %s <your PDF filename>' % (sys.argv[0])
        sys.exit()
    else:
        for filename in sys.argv[1:]:
            # 載入使用者自建詞庫
            jieba.load_userdict("userdict.txt")
            # PDF檔案內容轉換為文字資料
            pdf_content = convert_pdf_to_txt(filename)
            pdf_content = pdf_content.replace('\n','').replace(' ','')
            # 對 pdf_content 進行中文分詞
            print("------開始進行中文分詞------")
            words = jieba.cut(pdf_content, cut_all=True)
            print("  Full Mode: " + "/ ".join(words))
            print("----------------------------")
            words = jieba.cut(pdf_content, cut_all=False)
            print("  Default Mode: " + "/ ".join(words))
            print("----------------------------")
            words = jieba.cut_for_search(pdf_content)
            print("  Search Engine Mode: " + ", ".join(words))
            print ''


執行結果:
$ python extractPDF.py test.pdf
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.687 seconds.
Prefix dict has been built succesfully.
------開始進行中文分詞------
  Full Mode: 五大/ 支付/ App/ 最高/ 回饋/ 30/ / 行動/ 動支/ 支付/ 技術/ 有/ 許多
...
美容, 舒壓, 、, 購物, 、, 寵物, 等, 領域, ,, 在, 精選, 店家, 消費, ,, 最高, 滿千, 就, 送, 300, 元, ,, 等於, 現, 賺, 30, %, 左右, 的, 回饋, ;, 不, 指定, 店家, 也能, 有, 5, %, 的, 街口, 幣, 回饋, ,, 一塊, 街口, 幣, 可以, 抵, 消費, 1, 元, ,, 最高, 折抵, 40, %, 。, LINEPay, 主要, 以, 網路, 店家, 為主, ,, 將近, 200, 個, 品牌, 都可, 可以, 都可以, 透過, 它, 來, 支付, ,, 而, 實體, 店僅, 6, 家, 支援, ,, 其中, 包含, 美麗, 華, 百貨, 公司, 百貨公司, 。, Line, 與, 各家, 銀行, 推出, 的, 優惠, ,, 像是, 刷, 玉山, 滿, 388, 元, 就, 回饋, 50, 元, ,, 刷滿, 888, 元, 就, 回饋, 100, 元, ;, 綁定, 國泰, 世華卡, ,, 不用, 消費, 就, 送, 50, 元, 刷卡, 金, ;, 刷, 富邦, 、, 中信, 還能, 抽, LINE, 周邊, 商品, 。,


延伸閱讀:




參考資料:

#

2016年5月15日 星期日

遠端 shutdown linux 系統

提供給自己的筆記: 

自 Ubuntu Linux 遠端 shutdown 的 Raspberry Pi ,可透過 ssh 指令協助達成:

ssh <username>@<ip> sudo /sbin/shutdown -h now

#

2016年4月5日 星期二

檢查 Ubuntu release 版本

簡單指令:

lsb_release -a

執行結果範例:
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 15.04
Release:        15.04
Codename:       vivid

Raspberry Pi DHT11溫溼度感測器 + MQTT 傳送感測訊息

  1. Ubuntu Server 擔任 MQTT Server
  2. sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa 
    sudo apt-get update 
    sudo apt-get install mosquitto
    sudo apt-get install mosquitto-clients
    

  3. Ubuntu 向執行MQTT Server註冊接收來自hello/world 的訊息
  4. mosquitto_sub -d -t hello/world
    
    視窗暫時不要關閉
  5. Raspberry 安裝 DHT11 溫溼度感測器及軟體
  6. 可參考 葉難:Raspberry Pi 溫溼度感測器DHT11
    sudo apt-get update
    sudo apt-get install build-essential python-dev
    git clone https://github.com/adafruit/Adafruit_Python_DHT.git
    cd Adafruit_Python_DHT
    sudo python setup.py install
    

  7. 讀取Pi上溫溼度感測結果,DHT11感測器data pin接在Pi上GPIO 2
  8. cd examples
    sudo ./AdafruitDHT.py 11 2
    
    執行結果:
    Temp=25.0*  Humidity=48.0%
    

  9. Raspberry Pi 安裝 MQTT Client
  10. wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
    sudo apt-key add mosquitto-repo.gpg.key
    cd /etc/apt/sources.list.d/
    
    接著視 Pi 作業系統版本而定
    sudo wget http://repo.mosquitto.org/debian/mosquitto-wheezy.list
    
    sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
    
    sudo apt-get update
    sudo apt-get install mosquitto
    sudo apt-get install mosquitto-clients
    

  11. Pi 向 Ubuntu MQTT Server (IP:192.168.0.xx) 註冊接收來自 hello/world 的訊息
  12. mosquitto_sub -h 192.168.0.xx -d -t hello/world
    

  13. Pi執行讀取DHT11感測器資料,並將結果作為訊息內容發佈到 hello/world
  14. mosquitto_pub -h 192.168.0.xx -d -t hello/world -m "`/root/AdafruitDHT.py 11 2`"
    

  15. Ubuntu或Pi上向MQTT Server註冊接收來自hello/world 訊息的視窗
  16. 應該都可以看到類似的執行結果:
    Client mosqsub/30610-myUbuntu received PINGRESP
    Client mosqsub/30610-myUbuntu received PUBLISH (d0, q0, r0, m0, 'hello/world', ... (26 bytes))
    Temp=25.0*  Humidity=48.0%
    


延伸閱讀:


 #

2016年1月29日 星期五

pip 指令更新 python packages

以下皆以 pip 指令進行示範:
  • 更新一個已知名稱的 Python package,如 numpy package
  • pip install -U numpy
    
    或是
    pip install --upgrade numpy
    


  • 更新所有已安裝的packages
    pip list |awk '{print $1}' |xargs -n 1 pip install --upgrade
    
    或是
    for i in `pip list |awk '{print $1}'`; do echo $i; pip install --upgrade $i; done
    

#

2016年1月4日 星期一

Windows 7/8 (免費)資料夾同步比對 robocopy 批次檔

前一篇才寫了 「FreeFileSync 免費資料夾(目錄)比對同步軟體」推薦 FreeFileSync 這套免費的檔案同步軟體。這一篇則是想要用 Windows 7/8內建的 robocopy命令列指令來達成同樣的資料夾(目錄)同步比對工作。



工具:
  • Windows 7/8 命令列 (cmd) 下的 robocopy 指令
  1. Windows 鍵 > cmd 開啟命令列視窗
  2. 命令列視窗模式下輸入 robocopy,應可看到下列訊息:
C:\Windows\system32>robocopy

---------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows

---------------------------------------------------------------------

  已啟動 : Mon Jan 04 11:19:12 2016

       簡單使用方式 :: ROBOCOPY source destination /MIR

             source :: 來源目錄 (drive:\path 或 \\server\share\path)。
        destination :: 目的地目錄  (drive:\path 或 \\server\share\path)。
               /MIR :: 鏡像完整的樹狀目錄。

    如需有關使用方式的詳細資訊,請執行 ROBOCOPY /?


****  /MIR 可以刪除檔案以及複製檔案!



編輯同步批次檔autosync.bat :
robocopy C:\來源資料夾1\ D:\目標資料夾1\ /MIR /XO /E /R:2

robocopy C:\我的資料夾\ D:\備份資料夾\ /MIR /XO /E /R:2
編輯完成後,記得存檔喔~

robocopy 指令參數說明:

  • /MIR :: 鏡像完整的樹狀目錄。
  • /XO :: 排除較舊的檔案。 (目標資料夾中若有相同檔案就不再複製)
  • /E :: 複製子目錄,包括空的子目錄。
  • /R:n :: 失敗複本的重試次數: 預設值是 1 百萬次。



設定開機自動執行批次檔:

如果您想要每次電腦開機後,會自動執行剛才完成的同步動作設定,那就必須在Windows的「啟動」資料夾中設定批次檔的執行捷徑或直接將批次檔存在啟動資料夾中:
  • 開啟Windows的「啟動」資料夾
    %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
  • 在資料夾內新增剛才儲存的 autosync.bat 檔案的捷徑

Windows 按鈕 > 執行(R)

開啟(O) : %USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
新增批次檔的捷徑或將批次檔儲存於啟動資料夾中

完成後,下次開機就能自動執行前面設定的同步工作囉~


#