馬力歐及樂高中正紀念堂的模型
今天帶小孩及跟爸媽看樂高展及逛了一下新光三越 A8 五樓的玩具店,順手用 123D Catch 掃描了幾個 3D 模型,然後下載成 obj 檔,匯入 blender 修剪以及簡化,最後再用 blend4web 匯出成 .html 檔,過程相當無腦。掃描的結果如下。
有個老人愛清靜,可附近常有小孩玩,吵得要命。 於是他把小孩召集過來, 說:「我這很冷清,謝謝你們讓這更熱鬧」 說完分給每人三顆糖孩子們很開心,之後就天天來玩。幾天後,每人只給2顆,再後來給1顆,最後就不給了。於是,孩子們生氣了,說:「以後再也不來這給你熱鬧了」很多人詬病考試領導教學,也有不少建議要如何改善考試的方式。 其中很多意見都不錯,雖然實際執行還有很多技術細節及現實上的問題(勿忘建構式數學),但整體來說,我對於整體教育的改善是樂觀的。
import spynner
import os, sys
from PyQt4.QtWebKit import QWebSettings # 用來設定 QtWebKit
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest # 控制 browser 的網路連線
from PyQt4.QtCore import QUrl # Qt 的 Url 類別
# 下面是新增的兩個 module
import urllib2
from multiprocessing.pool import ThreadPool
# 下面是 IPython 相關
from IPython.display import display, Image
from IPython.html.widgets import ImageWidget, IntProgressWidget
# 建立瀏覽器
browser = spynner.Browser(debug_level=spynner.ERROR, debug_stream=sys.stderr)
# 建立一個 webview
browser.create_webview()
settings = browser.webview.settings()
# settings.setAttribute(QWebSettings.AutoLoadImages, False)
settings.setAttribute(QWebSettings.JavaEnabled, False) # 不需要 Java
settings.setAttribute(QWebSettings.DnsPrefetchEnabled, True) # 試著節省 Dns 花的時間
settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True) # 不需要瀏覽紀錄或者 cookie
# 建立一個空的 url
BLANK_REQUEST = QNetworkRequest(QUrl())
# 建立一個空的圖片 url
DUMMY_IMG_REQUEST = QNetworkRequest(QUrl("data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="))
# 客製化的 NetworkAccessManager
class EightComicNetworkAccessManager(QNetworkAccessManager):
# 只需要取代 createRequest 這個 method 即可
def createRequest(self, op, request, device=None):
url = str(request.url().toString()) # 參數很多,但只取 url 就夠用
if 'comic' not in url[:20]:
# 用很醜的方式來判斷非 8comic 網站的 url
# 用空的 url 取代原本的 url
return QNetworkAccessManager.createRequest(self, self.GetOperation, BLANK_REQUEST)
elif not url.endswith('js') and not url.endswith('css') and '.html' not in url:
# 凡是 .js .css .html 之外的,都用空的圖片 url 取代原本的 url
return QNetworkAccessManager.createRequest(self, self.GetOperation, DUMMY_IMG_REQUEST)
else:
# 傳回原本的 url
return QNetworkAccessManager.createRequest(self, op, request, device)
# 設定 browser 的 NetworkAccessManager
browser.webpage.setNetworkAccessManager(EightComicNetworkAccessManager())
browser.show()
# 漫畫的網頁
base_url = 'http://new.comicvip.com/show/cool-5614.html?ch='
# 要下載第一本
book_no = 1
# 取得總頁數
browser.load(base_url+str(book_no))
total_pages = browser.runjs('ps').toInt()[0]
# 建立 Image Widget 用來顯示圖片預覽
img = ImageWidget()
img.set_css("height", 300) # 讓圖片不要太大
# 顯示下載進度的 Progress bar
html_progress = IntProgressWidget(min=1, value=1, max=total_pages)
img_progress = IntProgressWidget(min=1, value=1, max=total_pages)
# 顯示 Widget
display(html_progress)
display(img_progress)
display(img)
# 建立一個下載目錄
dir_name = "download/{:02d}".format(book_no)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
print "Download to {}/{}".format(os.getcwd(), dir_name)
sys.stdout.flush()
# 建立 ThreadPool, 5 條 thread
pool = ThreadPool(5)
# 開始下載
downloaded_images = 0
for page in range(1, total_pages+1):
# 取得 image url
browser.load("{}{}-{}".format(base_url, book_no, page))
img_url = str(browser.runjs('document.getElementById("TheImg").getAttribute("src")').toString())
# 將下載圖片的工作包成 save_img,推進 pool 裡
def save_img(img_url, page):
global downloaded_images
fn = "{}/{:03d}.jpg".format(dir_name, page)
data = urllib2.urlopen(img_url).read()
with open(fn, "wb") as f:
f.write(data)
# 更新 widget 的狀態
downloaded_images += 1
img_progress.description = "img: %d/%d"%(downloaded_images, total_pages)
img_progress.value = downloaded_images
img.value = Image(filename=fn).data
pool.apply_async(save_img, (img_url, page))
# 更新 Widget 的狀態
html_progress.description = "html: %d/%d"%(page, total_pages)
html_progress.value = page
# 等待所有任務結束
pool.close()
pool.join()
import spynner
import os, sys
from PyQt4.QtWebKit import QWebSettings # 用來設定 QtWebKit
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest # 控制 browser 的網路連線
from PyQt4.QtCore import QUrl # Qt 的 Url 類別
# 下面這行是 IPython 相關
from IPython.display import display, Image
from IPython.html.widgets import ImageWidget, IntProgressWidget
# 建立瀏覽器
browser = spynner.Browser(debug_level=spynner.ERROR, debug_stream=sys.stderr)
# 建立一個 webview
# 我們不設定 AutoLoadImages=False, 但增加一些其他設定
# 這裡並不是重點,但適合我們的應用
browser.create_webview()
settings = browser.webview.settings()
# settings.setAttribute(QWebSettings.AutoLoadImages, False)
settings.setAttribute(QWebSettings.JavaEnabled, False) # 不需要 Java
settings.setAttribute(QWebSettings.DnsPrefetchEnabled, True) # 試著節省 Dns 花的時間
settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True) # 不需要瀏覽紀錄
# 建立一個空的 url
BLANK_REQUEST = QNetworkRequest(QUrl())
# 建立一個空的圖片 url
DUMMY_IMG_REQUEST = QNetworkRequest(QUrl("data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="))
# 因為只需要用一次,可以取個又臭又長的名字
class EightComicNetworkAccessManager(QNetworkAccessManager):
# 只需要取代 createRequest 這個 method 即可
def createRequest(self, op, request, device=None):
url = str(request.url().toString()) # 參數很多,但只取 url 就夠用
if 'comic' not in url[:20]:
# 用很醜的方式來判斷非 8comic 網站的 url
# 用空的 url 取代原本的 url
return QNetworkAccessManager.createRequest(self, self.GetOperation, BLANK_REQUEST)
elif not url.endswith('js') and not url.endswith('css') and '.html' not in url:
# 凡是 .js .css .html 之外的,都用空的圖片 url 取代原本的 url
return QNetworkAccessManager.createRequest(self, self.GetOperation, DUMMY_IMG_REQUEST)
else:
# 傳回原本的 url
return QNetworkAccessManager.createRequest(self, op, request, device)
# 設定 browser 的 NetworkAccessManager
browser.webpage.setNetworkAccessManager(EightComicNetworkAccessManager())
# 漫畫的網頁
base_url = 'http://new.comicvip.com/show/cool-5614.html?ch='
# 顯示瀏覽器,確認 browser 內容乾淨清爽
browser.show()
# 要下載第一本
book_no = 1
# 取得總頁數
browser.load(base_url+str(book_no))
total_pages = browser.runjs('ps').toInt()[0]
# 建立 Image Widget 用來顯示圖片預覽
img = ImageWidget()
img.set_css("height", 300) # 讓圖片不要太大
# 顯示下載進度的 Progress bar
progress = IntProgressWidget(min=1, value=1, max=total_pages)
# 顯示 Widget
display(progress)
display(img)
# 建立一個下載目錄
dir_name = "download/{:02d}".format(book_no)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
print "Download to {}/{}".format(os.getcwd(), dir_name)
sys.stdout.flush()
# 開始下載
for page in range(1, total_pages+1):
# 取得 image url
browser.load("{}{}-{}".format(base_url, book_no, page))
img_url = str(browser.runjs('document.getElementById("TheImg").getAttribute("src")').toString())
# 下載圖片
fn = "{}/{:03d}.jpg".format(dir_name, page)
with open(fn, "wb") as f:
browser.download(img_url, outfd=f)
# 更新 Widget 的狀態
progress.description = "%d/%d"%(page, total_pages)
progress.value = page
img.value = Image(filename=fn).data
import spynner
import os, sys
from PyQt4.QtWebKit import QWebSettings # 用來設定 QtWebKit
# 下面是 IPython 相關
from IPython.display import display, Image
from IPython.html.widgets import ImageWidget, IntProgressWidget
base_url = 'http://new.comicvip.com/show/cool-5614.html?ch='
# 建立瀏覽器
browser = spynner.Browser(debug_level=spynner.ERROR, debug_stream=sys.stderr)
# 建立一個 webview,並且設定不要自動載入圖片
browser.create_webview()
settings = browser.webview.settings()
settings.setAttribute(QWebSettings.AutoLoadImages, False)
# 要下載第一本
book_no = 1
# 取得總頁數
browser.load(base_url+str(book_no))
total_pages = browser.runjs('ps').toInt()[0]
# 建立 Image Widget 用來顯示圖片預覽
img = ImageWidget()
img.set_css("height", 300) # 讓圖片不要太大
# 顯示下載進度的 Progress bar
progress = IntProgressWidget(min=1, value=1, max=total_pages)
# 顯示之前建立的 Widget
display(progress)
display(img)
# 建立一個下載目錄
dir_name = "download/{:02d}".format(book_no)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
print "Download to {}/{}".format(os.getcwd(), dir_name)
sys.stdout.flush()
# 開始下載
for page in range(1, total_pages+1):
# 取得 image url
browser.load("{}{}-{}".format(base_url, book_no, page))
img_url = str(browser.runjs('document.getElementById("TheImg").getAttribute("src")').toString())
# 下載圖片
fn = "{}/{:03d}.jpg".format(dir_name, page)
with open(fn, "wb") as f:
browser.download(img_url, outfd=f)
# 更新 Widget 的狀態
progress.description = "%d/%d"%(page, total_pages)
progress.value = page
img.value = Image(filename=fn).data
easy_install -N spynner
!easy_install spynner
(win8 可用搜尋找到 IPython)# This is for windows
# on linux, simply sudo easy_install spynner in command line
!easy_install spynner
# restart the kernel
import spynner
import os, sys
# 下面這行是 IPython 相關
from IPython.display import display, Image
browser = spynner.Browser(debug_level=spynner.ERROR, debug_stream=sys.stderr)
browser.show() # 告訴 browser,要它之後不要隱身
# 為了避免法律上的疑慮,這裡你要自己找到適當的 url,把 ???? 換掉
base_url = 'http://???.com/show/????-????.html?ch='
browser.load( base_url+'1')
browser.load_jquery(True) # spynner 內建有 jquery,用這個 method 載入,比較方便。
img_url = str(browser.runjs('$("#TheImg").attr("src")').toString())
print img_url
# 當然不用 jquery 也可以
img_url = str(browser.runjs('document.getElementById("TheImg").getAttribute("src")').toString())
print img_url
# 直接顯示 url 看看
display(Image(url=img_url, width=200))
# 先用 browser 抓下圖檔內容, 然後顯示
display(Image(data=browser.download(img_url), width=200))
total_pages = browser.runjs('ps').toInt()[0]
print total_pages
book_no = 1
for page in range(1, total_pages+1):
browser.load("{}{}-{}".format(base_url, book_no, page))
img_url = str(browser.runjs('document.getElementById("TheImg").getAttribute("src")').toString())
print page, img_url
display(Image(url=img_url, width=100))
continue
# 上面只是顯示每一頁的圖片
# 如果你現在就想真的抓檔案下來, 把上面那個 continue 註解掉
with open("{}-{}.jpg".format(book_no, page), "wb") as f:
browser.download(img_url, outfd=f)
print "File saved in", os.getcwd()
Copyright ©
松鼠博士的魔法眼鏡 | Powered by Blogger
Design by SimpleWpThemes | Blogger Theme by NewBloggerThemes.com