library(ggmap)
for (i in 1:nrow(data)) {
if (data$lat[i] == 0) {
addr <- data$service_addr[i]
url = paste('http://maps.google.com/maps/api/geocode/xml?address=', addr,'&sensor=false',sep='')
doc = xmlTreeParse(url)
root = xmlRoot(doc)
data$lat[i] = xmlValue(root[['result']][['geometry']][['location']][['lat']])
data$lng[i] = xmlValue(root[['result']][['geometry']][['location']][['lng']])
}
}
# 將 data 內容寫入檔案 mymap.csv
write.table(data, file = "mymap.csv", sep = "," )
#
2017年2月21日 星期二
R 以地址取得經緯座標值
假如data.frame data中的lat值為0時,則利用google maps api geocode 查詢地址的經緯座標,並存回 data$lat 與 data$lng 中:
2017年2月20日 星期一
取得政府資料開放平台資料資源,將資料分類統計以R語言繪製成圓餅圖
library(data.table)
# 取得政府資料開放平台資料資源 (file format = csv)
data <- fread("http://search.data.gov.tw/wise/query?q=%2A%3A%2A&export=true&format=csv&rows=2147483647&d=1", header="auto", encoding = "UTF-8")
# 統計資料分類及分類數量, 統計結果以 data.frame 儲存至 categories
categories <- as.data.frame(table(data$服務分類))
# 計算每個分類百分比,取小數點第2位,將結果存於 pct
pct <- round(categories$Freq/sum(categories$Freq)*100,2)
# 把原來的分類"名稱 百分比 %" 存回原來的名類名稱中
categories$Var1 <- paste(categories$Var1, pct, "%", sep=" ")
#繪製圓餅圖 Piechart
pie(categories$Freq, labels=categories$Var1, main="政府資料開放平台資料資源", col=rainbow(length(categories$Var1)))
執行結果:
標籤:
2017,
程式,
programming,
R
2017年1月16日 星期一
awk / sed 清除HTML Tags
# 移除空白行
sed '/^\s*$/d'
# 移除所有的HTML Tags,但 javascript <script> </script> 的程式碼內容則仍存在
sed 's/<[^>]*>//g'
# 移除所有的javascript Tags 與程式碼內容
awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}'
# 移除所有的 javascript Tags 與程式碼內容和HTML Tags
awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}' | sed 's/<[^>]*>//g'
sed '/^\s*$/d'
# 移除所有的HTML Tags,但 javascript <script> </script> 的程式碼內容則仍存在
sed 's/<[^>]*>//g'
# 移除所有的javascript Tags 與程式碼內容
awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}'
# 移除所有的 javascript Tags 與程式碼內容和HTML Tags
awk 'BEGIN{RS="</script>"}/<script/{gsub("<script.*","")}{print}END{if(RS=="")print}' | sed 's/<[^>]*>//g'
2017年1月1日 星期日
excel - 分離字串中的中文與英文
| 點擊看大圖 (原圖) |
藉由LENB的函數特性來計算屬於中文自述的長度。再搭配 LEFT() 和 RIGHT() 等文字函數來分離原文資料的中文與英文部分。
B欄:原文
C欄:=LEN(B欄)
D欄:=LENB(B欄)
E欄:=LEFT(B欄, (D欄-C欄)
F欄:=RIGHT(B欄, (C欄 - (D欄-C欄)))
參考資料:Excel函數 (官方)
2016年12月30日 星期五
Python爬蟲抓取台灣銀行的牌告匯率
參考來源:大數軟體有限公司 [爬蟲實戰] 如何撰寫Python爬蟲抓取台灣銀行的牌告匯率?
來源:https://www.youtube.com/watch?v=-c5rrzjsN34
程式碼範例:
執行結果:
來源: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 來模擬瀏覽器瀏覽,取得網頁呈現的真實模樣。
使用selenium 和 PhantomJS的程式碼範例:
接下來整合 BeautifulSoup 的程式碼範例:
執行結果:
延伸閱讀:
#
可以試試看自動化測試軟體 selenium 和 PhantomJS 來模擬瀏覽器瀏覽,取得網頁呈現的真實模樣。
- 先安裝 python selenium 套件
- 下載並解壓縮 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檔案內容並進行中文分詞。
以 PDFMiner API 自PDF檔案擷取文字資料,再利用先前我們曾經使用過的jieba來進行中文分詞。
工具:
程式:
執行結果:
延伸閱讀:
參考資料:
![]() |
| Source : Uncalno Tekno |
工具:
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, 周邊, 商品, 。,
延伸閱讀:
- Python 基本爬蟲程式 + jieba 中文分詞 範例 - 以 Google 新聞為例
- Python 基本爬蟲程式 (crawler) 範例 - 以 Google 新聞為例
- 下載使用者自建詞庫 userdict.txt (補充自小麥注音輸入法詞庫)
參考資料:
- How do I use pdfminer as library (stackoverflow)
- Programming with PDFMiner (官網文件說明)
訂閱:
文章 (Atom)
