2013年6月30日 星期日

[Javascript] 處理新舊網站網址對應問題,以 PIXNET 與 Blogger 為例

PIXNET 公告版面

最近剛從 PIXNET 移到 Blogger 服務,對於之前在 PIXNET 的資料(流量)是否有好的解法呢?嘗試處理一下,的確有解 :)

問題:
  • 舊網站網址與新網站的規則不一樣:http://old_site/blog/post/xxxx 與 http://new_site/2013/06/oooo.html
因此,就算一開始在舊網站採用個人 domain name 網址也無法透過更改 DNS record 方式無痛切換到新網站。

解法:
當使用者逛舊網站時,引導使用者到新網站。由於新舊網站的文章標題一致,可以善用這個特性。
因此,可以透過 Javascript 來解決!先建立一份新網站文章標題與網址對應表後,在舊網站植入 Javascript 程式碼後,每當使用者逛舊網站文章時,當下動態取得文章標題後,查表取得新網站的網址,引導使用者切換過去即可。
PIXNET 公告版面

對 PIXNET 來說,它提供公告版面,這是個不錯的 javascript 植入位置。我將 Javascript 擺放在 github.com 這免費空間中,每當使用者在舊網站讀文章時,我在公告版面顯示新網站位置以及新網站此文章的網址,方便使用者點選,若測試無誤後,也可以考慮直接用 javascript 將使用者導向新網站。

有興趣的可以繼續參考:

[Python] 製作 Blogger 文章標題與網址對應表 (JSON Format) - 簡易 Blogger Crawler

有一些需要,想要知道 Blogger 文章標題與網址的對應,所以寫了隻 python 程式,撈了一遍 blogger 出來 XD 其實 Blogger 有提供 APIs 可以來做這件事 (https://www.googleapis.com/blogger/v2/blogs/blog-id/posts),但因為需要額外提出申請才行,就先快速用 blogger.com/search?max-results=50 的概念進行。

有興趣可以參考:github.com/changyy/blogger-title-link-crawler

使用 Github.com 散佈 Javascript 程式碼

github.com 有提供 raw 存取方式,但其 content type 並僅 text/plain 而已,這會影響 Javascript 的使用。幸運的,github.com 有提供 text/javascript 的存取方式

例如原先 raw 網址:

<script type="text/javascript" src="https://raw.github.com/changyy/note/master/new-site-url/url.js"></script>

僅需改成:

<script type="text/javascript" src="https://rawgithub.com/changyy/note/master/new-site-url/url.js"></script>

即可處理 content type 問題 :)

2013年6月29日 星期六

[Python] 使用 BeautifulSoup 處理 HTML 程式碼 (HTML Parser) @ Mac 10.8

繼上篇撈一些 HTML 資料回來,接著想要取出 link 來分析,則使用 python BeautifulSoup 套件。

$ sudo port install py27-beautifulsoup

片段程式碼:

from BeautifulSoup import BeautifulSoup
import urllib, urllib2

url = "http://blog.changyy.org"
data = urllib2.urlopen(url)
soup = BeautifulSoup(data)

for article in soup.findAll("div", {'class':'item-title'}):
    print "Title: " + article.a.contents[0]

    print "Link: " + article.a['href']
    print ""


運行結果:

$ python2.7 /tmp/t.py
Title: [Linux] 使用 sed 更新 PATH 環境變數 @ Ubuntu 12.04
Link: http://blog.changyy.org/2013/06/linux-sed-path-ubuntu-1204.html

Title: 致我們終將失去的熱情
Link: http://blog.changyy.org/2013/06/blog-post.html

Title: [Linux] 透過 busybox nc 提供簡易 socket server/client 測試方式
Link: http://blog.changyy.org/2013/06/linux-busybox-nc-socket-serverclient.html

Title: [Linux] 查看主機板型號 @ Ubuntu 12.04
Link: http://blog.changyy.org/2013/06/linux-ubuntu-1204.html

Title: blog.changyy.org 正式啓用
Link: http://blog.changyy.org/2013/06/blogchangyyorg.html

Title: [PHP] 使用 Heroku 架設 Wordpress 免費部落格
Link: http://blog.changyy.org/2013/05/php-heroku-wordpress.html

Title: [Python] 備份 Github.com 上的資料&#65288;可指定 user&#65289;@ Mac 10.8
Link: http://blog.changyy.org/2013/06/python-githubcom-user-mac-108.html

Title: 暮色&#12289;好星晴
Link: http://blog.changyy.org/2013/06/blog-post_24.html

Title: [Raspberry Pi] 使用 Raspbmc 之 AirPlay 播放影音 @ Mac 10.8
Link: http://blog.changyy.org/2013/06/raspberry-pi-raspbmc-airplay-mac-108.html

Title: Android 開發筆記 - 使用 mDNS 偵測裝置與 TXT record 處理方式 @ Mac 10.8
Link: http://blog.changyy.org/2013/05/android-mdns-txt-record-mac-108.html

[Python] 使用 zlib 處理 gzip 資料,以 curl 與 web 資料為例 @ Mac 10.8

抽空復習一下 Python ,想到用 Python 撈資料。

這時就先用了 pycurl 去跟 Web server 要資料,接著嘗試跟 Web server 要 gz 形態的資料回來,並使用 zlib 解掉。

範例:

import pycurl
import StringIO
import zlib

def getWebData(url):
    c = pycurl.Curl()
    c.setopt( pycurl.URL , url.encode('utf-8') )
    c.setopt( pycurl.FOLLOWLOCATION , True )
    c.setopt( pycurl.HTTPHEADER , [
        'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0',
        'Accept-Language: zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3',
        'Accept-Encoding: gzip, deflate',
        'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    ])

    open('/tmp/pycurl','wb').close()
    c.setopt( pycurl.COOKIEFILE , '/tmp/pycurl' )
    c.setopt( pycurl.COOKIEJAR , '/tmp/pycurl' )

    b = StringIO.StringIO()
    h = StringIO.StringIO()

    c.setopt(pycurl.WRITEFUNCTION, b.write)
    c.setopt(pycurl.HEADERFUNCTION, h.write)

    c.perform()
    
    body = b.getvalue()
    b.close()
    header = h.getvalue()
    h.close()
    
    return {'header':header, 'body':body}


target = "http://blog.changyy.org"
#data = urllib2.urlopen(target)
data = zlib.decompress(getData(target)['body'], 16+zlib.MAX_WBITS)

print data


透過 pycurl 的 request header 指定 gzip 形態,收回來後,在用 zlib.decompress 解開來使用。