最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python支持多線程的爬蟲實例

 更新時間:2019年12月21日 10:23:50   作者:zhangtian6691844  
今天小編就為大家分享一篇python支持多線程的爬蟲實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

python是支持多線程的, 主要是通過thread和threading這兩個模塊來實現(xiàn)的,本文主要給大家分享python實現(xiàn)多線程網(wǎng)頁爬蟲

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

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

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

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

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

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

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

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

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

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+" 啟動..."
  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支持多線程的爬蟲實例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python超簡單容易上手的畫圖工具庫推薦

    Python超簡單容易上手的畫圖工具庫推薦

    今天小編給大家分享一款很棒的python畫圖工具庫,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-05-05
  • Django通過自定義認證后端實現(xiàn)多種登錄方式驗證

    Django通過自定義認證后端實現(xiàn)多種登錄方式驗證

    Django提供了用戶認證系統(tǒng),那么如何在項目中進行應(yīng)用呢?在本文中小編將給大家介紹如何使用用戶認證系統(tǒng),實現(xiàn)我們業(yè)務(wù)場景中常見的多種登錄方式驗證。感興趣的小伙伴可以了解一下
    2021-12-12
  • python實現(xiàn)記事本功能

    python實現(xiàn)記事本功能

    這篇文章主要為大家詳細介紹了python實現(xiàn)記事本功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • python實現(xiàn)圖片,視頻人臉識別(opencv版)

    python實現(xiàn)圖片,視頻人臉識別(opencv版)

    這篇文章主要介紹了python實現(xiàn)圖像,視頻人臉識別(opencv版)的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • Python中多線程的創(chuàng)建及基本調(diào)用方法

    Python中多線程的創(chuàng)建及基本調(diào)用方法

    由于注明的GIL的存在,Python盡管能創(chuàng)建多個線程,但是多線程卻不能同時工作...well,這里我們來看一下Python中多線程的創(chuàng)建及基本調(diào)用方法
    2016-07-07
  • python爬蟲之urllib庫常用方法用法總結(jié)大全

    python爬蟲之urllib庫常用方法用法總結(jié)大全

    urllib是python自帶的請求庫,各種功能相比較之下也是比較完備的,下面這篇文章主要給大家介紹了關(guān)于python爬蟲之urllib庫常用方法用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-11-11
  • python3.7 使用pymssql往sqlserver插入數(shù)據(jù)的方法

    python3.7 使用pymssql往sqlserver插入數(shù)據(jù)的方法

    這篇文章主要介紹了python3.7 使用pymssql往sqlserver插入數(shù)據(jù)的方法,代碼很簡單,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • Opencv求取連通區(qū)域重心實例

    Opencv求取連通區(qū)域重心實例

    這篇文章主要介紹了Opencv求取連通區(qū)域重心實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python安裝Gradio和常見安裝問題解決辦法

    Python安裝Gradio和常見安裝問題解決辦法

    Gradio是一款便捷的Python庫,專門用于創(chuàng)建機器學(xué)習(xí)模型的Web應(yīng)用,安裝通常簡單,但偶爾會遇到依賴問題或環(huán)境配置錯誤,這篇文章主要介紹了Python安裝Gradio和常見安裝問題解決辦法,需要的朋友可以參考下
    2024-10-10
  • Django實現(xiàn)WebSSH操作物理機或虛擬機的方法

    Django實現(xiàn)WebSSH操作物理機或虛擬機的方法

    這篇文章主要介紹了Django實現(xiàn)WebSSH操作物理機或虛擬機的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11

最新評論

色达县| 萨嘎县| 华坪县| 柘荣县| 织金县| 全椒县| 英山县| 德州市| 珲春市| 益阳市| 团风县| 宁蒗| 中山市| 盐城市| 贵南县| 泰顺县| 洪江市| 陆丰市| 浠水县| 公安县| 尼木县| 西乡县| 昔阳县| 启东市| 如东县| 灵丘县| 左云县| 思茅市| 河曲县| 潮州市| 德清县| 襄樊市| 长宁区| 荣成市| 雅安市| 庄河市| 安乡县| 江永县| 平塘县| 郯城县| 库车县|