Python多線程爬蟲簡單示例

python1221.png

python是支持多線程的原押,主要是通過thread和threading這兩個模塊來實現(xiàn)的周崭。thread模塊是比較底層的模塊察绷,threading模塊是對thread做了一些包裝的炮叶,可以更加方便的使用。
雖然python的多線程受GIL限制贷揽,并不是真正的多線程棠笑,但是對于I/O密集型計算還是能明顯提高效率,比如說爬蟲禽绪。
下面用一個實例來驗證多線程的效率蓖救。代碼只涉及頁面獲取,并沒有解析出來印屁。

# -*-coding:utf-8 -*-
import urllib2, time
import threading
 
 
class MyThread(threading.Thread):
  def __init__(self, func, args):
    threading.Thread.__init__(self)
    self.args = args
    self.func = func
 
  def run(self):
    apply(self.func, self.args)
 
 
def open_url(url):
  request = urllib2.Request(url)
  html = urllib2.urlopen(request).read()
  print len(html)
  return html
 
if __name__ == '__main__':
  # 構(gòu)造url列表
  urlList = []
  for p in range(1, 10):
    urlList.append('http://s.wanfangdata.com.cn/Paper.aspx?q=%E5%8C%BB%E5%AD%A6&p=' + str(p))
   
  # 一般方式
  n_start = time.time()
  for each in urlList:
    open_url(each)
  n_end = time.time()
  print 'the normal way take %s s' % (n_end-n_start)
   
  # 多線程
  t_start = time.time()
  threadList = [MyThread(open_url, (url,)) for url in urlList]
  for t in threadList:
    t.setDaemon(True)
    t.start()
  for i in threadList:
    i.join()
  t_end = time.time()
  print 'the thread way take %s s' % (t_end-t_start)

分別用兩種方式獲取10個訪問速度比較慢的網(wǎng)頁循捺,一般方式耗時50s,多線程耗時10s雄人。
多線程代碼解讀:

# 創(chuàng)建線程類从橘,繼承Thread類
class MyThread(threading.Thread):
  def __init__(self, func, args):
    threading.Thread.__init__(self) # 調(diào)用父類的構(gòu)造函數(shù)
    self.args = args
    self.func = func
 
  def run(self): # 線程活動方法
    apply(self.func, self.args)


threadList = [MyThread(open_url, (url,)) for url in urlList]
 # 調(diào)用線程類創(chuàng)建新線程,返回線程列表
  for t in threadList:
    t.setDaemon(True) # 設(shè)置守護線程础钠,父線程會等待子線程執(zhí)行完后再退出
    t.start() # 線程開啟
  for i in threadList:
    i.join() # 等待線程終止恰力,等子線程執(zhí)行完后再執(zhí)行父線程

歡迎評論說出您的看法,互相學(xué)習(xí)共同進步

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末旗吁,一起剝皮案震驚了整個濱河市踩萎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌很钓,老刑警劉巖香府,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異码倦,居然都是意外死亡企孩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門叹洲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柠硕,“玉大人工禾,你說我怎么就攤上這事运提』热幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵民泵,是天一觀的道長癣丧。 經(jīng)常有香客問我,道長栈妆,這世上最難降的妖魔是什么胁编? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鳞尔,結(jié)果婚禮上嬉橙,老公的妹妹穿的比我還像新娘。我一直安慰自己寥假,他們只是感情好市框,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著糕韧,像睡著了一般枫振。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萤彩,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天粪滤,我揣著相機與錄音,去河邊找鬼雀扶。 笑死杖小,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愚墓。 我是一名探鬼主播窍侧,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼等恐,長吁一口氣:“原來是場噩夢啊……” “哼邻悬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起艰猬,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤议经,失蹤者是張志新(化名)和其女友劉穎斧账,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煞肾,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡咧织,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了籍救。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片习绢。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出闪萄,到底是詐尸還是另有隱情梧却,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布败去,位于F島的核電站放航,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏圆裕。R本人自食惡果不足惜广鳍,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吓妆。 院中可真熱鬧赊时,春花似錦、人聲如沸行拢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剂陡。三九已至狈涮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸭栖,已是汗流浹背歌馍。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晕鹊,地道東北人松却。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像溅话,于是被迫代替她去往敵國和親晓锻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一文讀懂Python多線程 1飞几、線程和進程 計算機的核心是CPU砚哆,它承擔(dān)了所有的計算任務(wù)。它就像一座工廠屑墨,時刻在運...
    星丶雲(yún)閱讀 1,455評論 0 4
  • 線程 操作系統(tǒng)線程理論 線程概念的引入背景 進程 之前我們已經(jīng)了解了操作系統(tǒng)中進程的概念卵史,程序并不能單獨運行战转,只有...
    go以恒閱讀 1,645評論 0 6
  • 環(huán)境 xubuntu anaconda pycharm python https://www.cnblogs.co...
    Ericoool閱讀 1,905評論 0 0
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,764評論 0 8
  • 0三槐秧、線程和進程的關(guān)系1、一個進程可以有多個線程,但至少有一個線程刁标;而一個線程只能在一個進程的地址空間內(nèi)活動颠通。2、...
    十二右閱讀 2,821評論 0 0