Linux企業級專案實踐之網路爬蟲(8)——認識URL
URL是Uniform Resource Location的縮寫,譯為“統一資源定位符”。也可以說,URL是Internet上用來描述資訊資源的字串,主要用在各種WWW客戶程式和伺服器程式上。採用URL可以用一種統一的格式來描述各種資訊資源,包括檔案、伺服器的地址和目錄等。URL的格式由三部分組成:第一部分是協議(或稱為服務方式)。第二部分是存有該資源的主機IP地址,包括埠號,預設為80。第三部分是主機資源的具體地址,即目錄和檔名。
爬蟲系統要處理的URL
在這裡,爬蟲系統要處理的URL是指使用超文字傳輸協議HTTP的URL,其埠號預設是80。第三部分是Web伺服器上資源的具體地址,即相對路徑。一般來說,在Web頁面上提取出來的URL,如果是這個站點內部的,那麼多是相對地址,而且可能要進行URL編碼,所以要採用過濾技術,把這些不規範的URL進行解碼,規範化。
進行URL的排程:
爬蟲程式在分析頁面時,會提取出來各種URL,比如,這個站點內的,或這個站點外的,甚至失效的URL。那麼,對於這些不同的URL,同爬行演算法一致,它們的優先順序應該是各不相同的,哪一個的DNS請求已經獲得到並可以立即進行連線?哪一個是失效的、錯誤的,應該立即丟棄掉?或者哪一個是從高優先順序空間中得到的,應該無條件的,以高優先的狀態進行連線,都是需要進行合理,穩妥,高效的排程。
解決方案:
首先,應該明確,這裡所有的URL都應該是優先順序清晰的。否則,所有URL排程將因為沒有級別權重、優先順序而變的混亂不堪。其次,應該設定合適的儲存空間,不能把所有的URL都堆積到一塊,那樣既談不到優先順序清晰,更不要說快速提取。那麼,解決方案如下:
採用URL的多級儲存架構。
給每一級結構都分配不同的排程優先順序。
爬蟲系統要處理的URL
在這裡,爬蟲系統要處理的URL是指使用超文字傳輸協議HTTP的URL,其埠號預設是80。第三部分是Web伺服器上資源的具體地址,即相對路徑。一般來說,在Web頁面上提取出來的URL,如果是這個站點內部的,那麼多是相對地址,而且可能要進行URL編碼,所以要採用過濾技術,把這些不規範的URL進行解碼,規範化。
進行URL的排程:
爬蟲程式在分析頁面時,會提取出來各種URL,比如,這個站點內的,或這個站點外的,甚至失效的URL。那麼,對於這些不同的URL,同爬行演算法一致,它們的優先順序應該是各不相同的,哪一個的DNS請求已經獲得到並可以立即進行連線?哪一個是失效的、錯誤的,應該立即丟棄掉?或者哪一個是從高優先順序空間中得到的,應該無條件的,以高優先的狀態進行連線,都是需要進行合理,穩妥,高效的排程。
解決方案:
首先,應該明確,這裡所有的URL都應該是優先順序清晰的。否則,所有URL排程將因為沒有級別權重、優先順序而變的混亂不堪。其次,應該設定合適的儲存空間,不能把所有的URL都堆積到一塊,那樣既談不到優先順序清晰,更不要說快速提取。那麼,解決方案如下:
採用URL的多級儲存架構。
給每一級結構都分配不同的排程優先順序。
各個級別的結構之間進行合適的資料通訊。
void push_surlqueue(Surl *url)
{
if (url != NULL && surl_precheck(url)) {
SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I want this url: %s", url->url);
pthread_mutex_lock(&sq_lock);
surl_queue.push(url);
if (surl_queue.size() == 1)
pthread_cond_signal(&sq_cond);
pthread_mutex_unlock(&sq_lock);
}
}
Url * pop_ourlqueue()
{
Url *url = NULL;
pthread_mutex_lock(&oq_lock);
if (!ourl_queue.empty()) {
url = ourl_queue.front();
ourl_queue.pop();
pthread_mutex_unlock(&oq_lock);
return url;
} else {
int trynum = 3;
struct timespec timeout;
while (trynum-- && ourl_queue.empty()) {
get_timespec(&timeout, 500); /* 0.5s timeout*/
pthread_cond_timedwait(&oq_cond, &oq_lock, &timeout);
}
if (!ourl_queue.empty()) {
url = ourl_queue.front();
ourl_queue.pop();
}
pthread_mutex_unlock(&oq_lock);
return url;
}
}
相關文章
- Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- Linux企業級專案實踐之網路爬蟲(4)——主程式流程Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(18)——佇列處理Linux爬蟲佇列
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式Linux爬蟲套件模式
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- 網路爬蟲專案爬蟲
- 企業資料爬蟲專案爬蟲
- 網路爬蟲專案蒐集爬蟲
- Java網路爬蟲實操(8)Java爬蟲
- 企業資料爬蟲專案(二)爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 專案--python網路爬蟲Python爬蟲
- 網路爬蟲(python專案)爬蟲Python
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 網路爬蟲專案開發日誌(一):關於爬蟲專案所涉及的領域知識爬蟲