2015年10月31日 星期六

Python二維陣列寫法

Python實踐二維陣列的寫法注意事項

如果直覺地使用list, 可能會寫成

twoDimArray = [[0]*3]*3

陣列的樣子會是 [[0,0,0],[0,0,0], [0,0,0]]
看起來符合二維陣列的模樣, 但其中隱含一個問題
如果更改其中一個元素

twoDimArray[0][0] = 1

結果陣列內容會變成

[[1,0,0],[1,0,0],[1,0,0]]

如果使用id來看

for row in twoDimArray:
    print(id(row))

會發現id都一樣, 每一列所指的都是同一個list!!
這種bug可能會造成之後使用這個array時出現奇怪的錯誤

所以建議寫法應該改成

twoDimArray = []
    for rowCount in xrange(3)
        twoDimArray.append([0]*3)

再一次檢查id, 可以發現到已經是不同的list object了

Tip: 或者乾脆使用numpy 套件更為妥當

11/1新增:在stackflow上看到的相關討論

Reference:
http://stackoverflow.com/questions/12791501/python-initializing-a-list-of-lists

2015年4月26日 星期日

python 網路爬蟲避免被阻擋的方法

最近手癢寫一小支網路爬蟲,但是會碰到被伺服器擋下的問題

主要原因就是對方伺服器知道當前連線的程序是機器人
處理方式就是讓爬蟲偽裝成真人


python網路爬蟲常利用urllib2模組來實現, 但是預設的user-agent會註明這是一支python程式
因此需要修改成常見到的瀏覽器

例如:
即可讓本次的Request被視為是linux系統經由Firefox瀏覽器所送出

要注意:如果連線過於頻繁仍有可能被視為惡意攻擊