欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基python實(shí)現(xiàn)多線程網(wǎng)頁爬蟲

 更新時(shí)間:2015年09月06日 09:56:37   作者:糖拌咸魚  
python是支持多線程的, 主要是通過thread和threading這兩個(gè)模塊來實(shí)現(xiàn)的,本文主要給大家分享python實(shí)現(xiàn)多線程網(wǎng)頁爬蟲,需要的朋友可以參考下

一般來說,使用線程有兩種模式, 一種是創(chuàng)建線程要執(zhí)行的函數(shù), 把這個(gè)函數(shù)傳遞進(jìn)Thread對象里,讓它來執(zhí)行. 另一種是直接從Thread繼承,創(chuàng)建一個(gè)新的class,把線程執(zhí)行的代碼放到這個(gè)新的class里。

實(shí)現(xiàn)多線程網(wǎng)頁爬蟲,采用了多線程和鎖機(jī)制,實(shí)現(xiàn)了廣度優(yōu)先算法的網(wǎng)頁爬蟲。

先給大家簡單介紹下我的實(shí)現(xiàn)思路:

對于一個(gè)網(wǎng)絡(luò)爬蟲,如果要按廣度遍歷的方式下載,它是這樣的:

        1.從給定的入口網(wǎng)址把第一個(gè)網(wǎng)頁下載下來

        2.從第一個(gè)網(wǎng)頁中提取出所有新的網(wǎng)頁地址,放入下載列表中

        3.按下載列表中的地址,下載所有新的網(wǎng)頁

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

        5.重復(fù)3、4兩步,直到更新后的下載列表為空表時(shí)停止

python代碼如下:

#!/usr/bin/env python
#coding=utf-8
import threading
import urllib
import re
import time
g_mutex=threading.Condition()
g_pages=[] #從中解析所有url鏈接
g_queueURL=[] #等待爬取的url鏈接列表
g_existURL=[] #已經(jīng)爬取過的url鏈接列表
g_failedURL=[] #下載失敗的url鏈接列表
g_totalcount=0 #下載過的頁面數(shù)
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+" 啟動(dòng)..."
    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<len(g_queueURL):
        content=str(g_totalcount+i)+'->'+g_queueURL[i]+'\n'
        self.logfile.write(content)
        i+=1
  def downloadAll(self):
    global g_queueURL
    global g_totalcount
    i=0
    while i<len(g_queueURL):
      j=0
      while j<self.threadnum and i+j < len(g_queueURL):
        g_totalcount+=1
        threadresult=self.download(g_queueURL[i+j],str(g_totalcount)+'.html',j)
        if threadresult!=None:
          print 'Thread started:',i+j,'--File number =',g_totalcount
        j+=1
      i+=j
      for thread in self.threadpool:
        thread.join(30)
      threadpool=[]
    g_queueURL=[]
  def download(self,url,filename,tid):
    crawthread=CrawlerThread(url,filename,tid)
    self.threadpool.append(crawthread)
    crawthread.start()
  def updateQueueURL(self):
    global g_queueURL
    global g_existURL
    newUrlList=[]
    for content in g_pages:
      newUrlList+=self.getUrl(content)
    g_queueURL=list(set(newUrlList)-set(g_existURL))  
  def getUrl(self,content):
    reg=r'"(http://.+?)"'
    regob=re.compile(reg,re.DOTALL)
    urllist=regob.findall(content)
    return urllist
class CrawlerThread(threading.Thread):
  def __init__(self,url,filename,tid):
    threading.Thread.__init__(self)
    self.url=url
    self.filename=filename
    self.tid=tid
  def run(self):
    global g_mutex
    global g_failedURL
    global g_queueURL
    try:
      page=urllib.urlopen(self.url)
      html=page.read()
      fout=file(self.filename,'w')
      fout.write(html)
      fout.close()
    except Exception,e:
      g_mutex.acquire()
      g_existURL.append(self.url)
      g_failedURL.append(self.url)
      g_mutex.release()
      print 'Failed downloading and saving',self.url
      print e
      return None
    g_mutex.acquire()
    g_pages.append(html)
    g_existURL.append(self.url)
    g_mutex.release()
if __name__=="__main__":
  url=raw_input("請輸入url入口:\n")
  threadnum=int(raw_input("設(shè)置線程數(shù):"))
  crawlername="小小爬蟲"
  crawler=Crawler(crawlername,url,threadnum)
  crawler.craw()

以上代碼就是給大家分享的基python實(shí)現(xiàn)多線程網(wǎng)頁爬蟲,希望大家喜歡。

相關(guān)文章

  • Python實(shí)現(xiàn)的石頭剪子布代碼分享

    Python實(shí)現(xiàn)的石頭剪子布代碼分享

    這篇文章主要介紹了Python實(shí)現(xiàn)的石頭剪子布代碼分享,本文和另一篇JavaScript實(shí)現(xiàn)的石頭剪刀布游戲源碼是姐妹篇,需要的朋友可以參考下
    2014-08-08
  • python基于tkinter實(shí)現(xiàn)gif錄屏功能

    python基于tkinter實(shí)現(xiàn)gif錄屏功能

    一直在思索實(shí)現(xiàn)一個(gè)透明的窗體,然后可以基于這個(gè)窗體可以開發(fā)出各種好玩的應(yīng)用,這一期,我們將實(shí)現(xiàn)有趣的GIF錄屏功能
    2021-05-05
  • python兩種注釋用法的示例

    python兩種注釋用法的示例

    這篇文章主要介紹了python兩種注釋用法的示例,幫助大家開始學(xué)習(xí)和使用python 注釋,感興趣的朋友可以了解下
    2020-10-10
  • Python函數(shù)對象與閉包介紹

    Python函數(shù)對象與閉包介紹

    這篇文章主要介紹了Python函數(shù)對象與閉包,函數(shù)對象指的是函數(shù)可以被當(dāng)做’數(shù)據(jù)’來處理,具體可以分為四個(gè)方面的使用,下文我們就來看看具體的這四種實(shí)用方法吧,需要的朋友可以參考一下
    2022-04-04
  • python安裝后無法打開IDLE?Subprocess?Connection?Error的解決方法

    python安裝后無法打開IDLE?Subprocess?Connection?Error的解決方法

    有朋友在安裝了Python之后發(fā)現(xiàn)不能正常使用,就說明安裝過程出了問題,下面這篇文章主要給大家介紹了關(guān)于python安裝后無法打開IDLE?Subprocess?Connection?Error的解決方法,需要的朋友可以參考下
    2023-01-01
  • 查看keras的默認(rèn)backend實(shí)現(xiàn)方式

    查看keras的默認(rèn)backend實(shí)現(xiàn)方式

    這篇文章主要介紹了查看keras的默認(rèn)backend實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python中遍歷文件的3個(gè)方法

    python中遍歷文件的3個(gè)方法

    這篇文章主要介紹了python中遍歷文件的3個(gè)方法,本文分別使用os.path.walk()、os.walk()、os.listdir()來實(shí)現(xiàn),需要的朋友可以參考下
    2014-09-09
  • Python 互換字典的鍵值對實(shí)例

    Python 互換字典的鍵值對實(shí)例

    今天小編就為大家分享一篇Python 互換字典的鍵值對實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 對python中的 os.mkdir和os.mkdirs詳解

    對python中的 os.mkdir和os.mkdirs詳解

    今天小編就為大家分享一篇對python中的 os.mkdir和os.mkdirs詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python列表(list)所有元素的同一操作解析

    Python列表(list)所有元素的同一操作解析

    這篇文章主要介紹了Python列表(list)所有元素的同一操作解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評論