路漫漫其修遠兮,吾將上下而求索

0%

對python3 而言,亂碼不叫亂碼,叫做編碼錯誤
沒錯,python3 內所有的文字都是 unicode 類型的str,對於原本是utf-8 編碼的文字,再另外編成big5 後當然會出現亂碼

一般而言透過requests 訪問網頁的程式碼如下:

1
2
3
4
5
6
# -*- encoding: utf8-*-
import lxml, requests

result = requests.get('http://disp.cc/');
print("encoding: %s" % result.encoding)
print("content: \n%s" % result.text)
Read more »

沒用過指標,別說你會 C / C++

看到最近朋友在找延替時被指標考題炸的淒淒慘慘,為了避免我之後面試時也被雷到,先把蒐集到常見的指標問題整理在下方。

Introduce

何謂指標:

指標是一種資料類型,用來表示物件或者變數的記憶體位置

聽起來很難懂,直接用程式來輔助思考就比較清楚了:

1
2
3
4
5
6
7
8
9
10
11
12
13
int a, b;
int *pa, *pb;
printf("address of a: %p\n", &a);
pa = &a;
printf("address of pa: %p\n", pa);
pb = pa;
printf("address of pb: %p\n", pb);

############ output ############

address of a: 0x7ffd130569ec
address of pa: 0x7ffd130569ec
address of pb: 0x7ffd130569ec
Read more »

Thread 爬蟲優化

前陣子介紹了如何把 Thread 應用在爬蟲上,今天要來介紹如何因應硬體資源來調整 Thread 的執行數量。

在上一篇教學中,筆者把每頁的查詢都新增一個 Thread 去處理,假設有100頁的話便需要100條 Thread ,若電腦硬體不夠強根本無法這樣處理,所以需要控管單一時間內允許執行的 Thread 數量。

想法如下:

  1. 事先宣告好所有的爬蟲任務放進陣列內
  2. 設定 Thread 可運行的數量
  3. Thread 檢查是否有爬蟲任務,若有則執行任務;若無則結束離開
Read more »

在Codeigniter 上開發了也快一年,前陣子被推坑來laravel,一試完果真回不去了,簡便的指令模式能快速地建立Controller、Model、View 及各種樣板,當下果斷放棄Codeigniter。

在這框架奔放的年代,Laravel 絕對是PHP後端框架最重要的角色沒有之一。

Read more »

Thread 爬蟲應用
前面章節介紹的做法都是一步一步慢慢抓,以Level 2 為例

我們的做法是抓好第n 頁後再往第n+1 頁抓,但這樣的速度真的太慢了,一個時間點內只有送出一個http request 查詢,有沒有辦法是同個時間內送出多個http request?

當然是可以的,這就是我們這一章節要介紹的 Thread

Read more »

Level4: 檔機器人類型

這一關的網頁看起來類似 Level 2: 分頁處理

但是當你把Level 2 的程式重新執行時會發現每次都是跑第一頁,就算把每次送出request 時的PHPSESSID 固定住的話還是一樣,這時候我們便需要考慮網頁的另一個特性: header。

Read more »

Level3: 處理Session

雖然這次的目標也是有分頁,但是當切換頁面時並不像Level 2一樣是:&page=nnn 的形式

反而是透過 &page={prev,next} 這兩種值來決定要上一頁或者下一頁

題目已經很好心的告訴你我們要透過Session 來處理這題,在開始前先來聊聊Session 是什麼吧。

Session 是一種儲存在伺服端的資料, 用於儲存用戶資訊
以買飲料來舉例:

  1. A 在飲料店點了一杯飲料
  2. 店員發給了A 一張號碼牌(cookie) 並且記住A 點了什麼飲料 (session)
  3. A 拿號碼牌(cookie) 給店員,並且詢問飲料狀況
  4. 店員透過號碼牌查詢 POS 機(session) 後,確定飲料已經好了,再遞飲料給A

由上方的例子可以看出,Session 及 Cookie 是相對應的存在。

Read more »

最近被公司要求去抓 GPS晶片提供的Callback 位置,所幸官網上有提供SDK 跟文件可以研讀,目前是在 CentOS 6.6上 Compile的,詳細的kernel realease 為:2.6.32-504.1.3.el6.centos.plus.x86_64

但在 compile 時會出現以下訊息

1
2
3
4
5
[root@Demo PDS_Services]# make
bin/ exists - good.
/usr/bin/ld: cannot find -lrt
collect2: ld returned 1 exit status
make: *** [bin/pdsserviceshostx86_64] Error 1
Read more »

Level2: 處理分頁

這次的目標網頁多了分頁的功能,因此我們的requests 就必須依據分頁的數量去存取,步驟如下:

  1. 設定n = 1
  2. 檢查第n頁有無資料,若有則下載網頁並轉換成DOM 格式,若無則輸出結果
  3. 解析、處理網頁內容
  4. 設定n = n+1,並回到第2步驟
Read more »

Level1: 基本處理

這題的目標是下載網站內容處理成json格式,並沒有任何的防禦機制,因此相對來講非常簡單,我們的步驟如下:

  1. 下載網頁並轉換成DOM 格式
  2. 解析、處理網頁內容
  3. 儲存成json 格式
Read more »