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

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

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

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

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

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

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

  4. 新的url生成模塊。生成新的url,放入隊(duì)列。

那么,最簡(jiǎn)單的爬蟲就可以這么寫:

import Queue

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

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

網(wǎng)友評(píng)論