1. 網(wǎng)頁爬蟲的過程

所謂網(wǎng)頁爬蟲,就是模擬瀏覽器的行為訪問網(wǎng)站,從而獲得網(wǎng)頁信息的程序。正因為是程序,所以獲得網(wǎng)頁的速度可以輕易超過單身多年的手速:)。通常適用于需要大量網(wǎng)頁信息的場合。

爬取網(wǎng)頁的流程為:訪問初始url -> 獲得返回的網(wǎng)頁,從這個網(wǎng)頁中得到新的url并放入待爬隊列 -> 訪問新的url -> ...依次循環(huán)。整體上來看就是一個廣度優(yōu)先的過程,當(dāng)然,新的url也不一定非要從返回的網(wǎng)頁中獲得。

一個簡單的網(wǎng)頁爬蟲應(yīng)該包括以下部分:

  1. 一個url隊列。我們的爬蟲從這個隊列中讀取url,并將新的url放入這個隊列。這里最重要的是判重。簡單的哈希就能達到判重的目的,但是為了節(jié)約空間(url的數(shù)量往往很多),一般使用bloomfilter的思想。bloomfilter與普通的哈希算法最大的不同就是bloomfilter只需要一個bit來表示某個元素是否存在,所以能節(jié)約空間。bloomfilter有一個小缺點,即準(zhǔn)確率并不是百分百:判斷一個元素是不是已經(jīng)存在時,已有的有很小的可能會判斷為不存在,但是沒有的元素一定會判斷為不存在。

  2. 網(wǎng)頁爬取模塊。需要能模擬瀏覽器發(fā)送請求。

  3. 網(wǎng)頁分析模塊。爬下來的是網(wǎng)頁源碼,可以用正則或者其他方法提取我們需要的信息。

  4. 新的url生成模塊。生成新的url,放入隊列。

那么,最簡單的爬蟲就可以這么寫:

import Queue

start_url = "http://www.cnblogs.com/rubinorth"url_queue = Queue.Queue()  # url隊列url_queue.put(start_url) 

bloomfilter.put(start_url)#### 一直循環(huán)到隊列為空 ####while(True):    if url_queue.size() > 0:
        current_url = url_queue.get()  # 隊首的url
        page = crawl(current_url)  # crawl為網(wǎng)頁爬取模塊,page是爬到的網(wǎng)頁源代碼
        next_urls = deal_page(page)  # deal_page為網(wǎng)頁分析模塊,next_urls是新的一些url
        
        for next_url in next_urls: 
            if not bloomfilter.has(next_url):  # 判重     
    &
        
		

網(wǎng)友評論