基python實現多線程網頁爬蟲

來源:互聯網
上載者:User
一般來說,使用線程有兩種模式, 一種是建立線程要執行的函數, 把這個函數傳遞進Thread對象裡,讓它來執行. 另一種是直接從Thread繼承,建立一個新的class,把線程執行的代碼放到這個新的class裡。

實現多線程網頁爬蟲,採用了多線程和鎖機制,實現了廣度優先演算法的網頁爬蟲。

先給大家簡單介紹下我的實現思路:

對於一個網路爬蟲,如果要按廣度遍曆的方式下載,它是這樣的:

1.從給定的入口網址把第一個網頁下載下來

2.從第一個網頁中提取出所有新的網頁地址,放入下載列表中

3.按下載列表中的地址,下載所有新的網頁

4.從所有新的網頁中找出沒有下載過的網頁地址,更新下載列表

5.重複3、4兩步,直到更新後的下載列表為空白表時停止

python代碼如下:

#!/usr/bin/env python#coding=utf-8import threadingimport urllibimport reimport timeg_mutex=threading.Condition()g_pages=[] #從中解析所有url連結g_queueURL=[] #等待爬取的url連結清單g_existURL=[] #已經爬取過的url連結清單g_failedURL=[] #下載失敗的url連結清單g_totalcount=0 #下載過的頁面數class Crawler:  def __init__(self,crawlername,url,threadnum):    self.crawlername=crawlername    self.url=url    self.threadnum=threadnum    self.threadpool=[]    self.logfile=file("log.txt",'w')  def craw(self):    global g_queueURL    g_queueURL.append(url)      depth=0    print self.crawlername+" 啟動..."    while(len(g_queueURL)!=0):      depth+=1      print 'Searching depth ',depth,'...\n\n'      self.logfile.write("URL:"+g_queueURL[0]+"........")      self.downloadAll()      self.updateQueueURL()      content='\n>>>Depth '+str(depth)+':\n'      self.logfile.write(content)      i=0      while i'+g_queueURL[i]+'\n'        self.logfile.write(content)        i+=1  def downloadAll(self):    global g_queueURL    global g_totalcount    i=0    while i

以上代碼就是給大家分享的基python實現多線程網頁爬蟲,希望大家喜歡。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.