1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      Python爬蟲過程是怎樣的

      本文小編為大家詳細(xì)介紹“Python爬蟲過程是怎樣的”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Python爬蟲過程是怎樣的”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

      成都網(wǎng)站建設(shè)、網(wǎng)站制作服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶提供服務(wù)是我們的理念。創(chuàng)新互聯(lián)公司把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來開發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!

      網(wǎng)絡(luò)爬蟲從一個(gè)或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL,在抓取網(wǎng)頁的過程中,不斷從當(dāng)前頁面上抽取新的URL放入隊(duì)列,直到滿足系統(tǒng)的一定停止條件。簡(jiǎn)單的可以將網(wǎng)絡(luò)爬蟲理解為一個(gè)帶有終止條件的while循環(huán),在條件不觸發(fā)的情況下,爬蟲就不斷的從每個(gè)以及獲取的url發(fā)送請(qǐng)求獲取頁面數(shù)據(jù),然后解析當(dāng)前頁面的url,不斷迭代下去。在crawl工程當(dāng)中,完成這一過程的是crawler類,他并未采用廣度優(yōu)先或是深度優(yōu)先的爬蟲,在當(dāng)前請(qǐng)求失敗的時(shí)候就通過python掛起當(dāng)前任務(wù),然后在之后再進(jìn)行調(diào)度,這可以勉強(qiáng)理解為基于網(wǎng)絡(luò)連通性的A*搜索,其運(yùn)行方式如下所示:

      Python爬蟲過程是怎樣的

      對(duì)一個(gè)初始化后的crawler對(duì)象,其中存在一個(gè)url,一個(gè)todo集合,存儲(chǔ)尚未繼續(xù)呢爬蟲操作的url;一個(gè)busy集合,保存等待其他爬蟲數(shù)據(jù)的url集合;一個(gè)done集合,保存完成頁面爬取的url集合。爬蟲的核心就是這個(gè)死循環(huán),首先爬蟲從todo集合當(dāng)中獲取一個(gè)url,然后初始化fetch對(duì)象用于獲取頁面上的url,***進(jìn)行任務(wù)調(diào)度執(zhí)行一個(gè)url請(qǐng)求任務(wù)。這段流程的代碼如下所示。

      @asyncio.coroutine def crawl(self):         """Run the crawler until all finished."""         with (yield from self.termination):             while self.todo or self.busy:                 if self.todo:                     url, max_redirect = self.todo.popitem()                     fetcher = Fetcher(url,                                       crawler=self,                                       max_redirect=max_redirect,                                       max_tries=self.max_tries,                                       )                     self.busy[url] = fetcher                     fetcher.task = asyncio.Task(self.fetch(fetcher))                 else:                     yield from self.termination.wait()         self.t1 = time.time()

      一個(gè)爬蟲很明顯不會(huì)僅僅由一個(gè)死循環(huán)構(gòu)成,在crawl外層需要其他模塊支持其操作,包括網(wǎng)絡(luò)連接,url獲取,任務(wù)調(diào)度等任務(wù),整個(gè)crawl工程的調(diào)度框架如下所示:

      Python爬蟲過程是怎樣的

      在crawl創(chuàng)建初始化時(shí)候首先創(chuàng)建一個(gè)ConnectionPool:

      self.pool = ConnectionPool(max_pool, max_tasks)

      其中保留屬性connections和queue,分別保存連接的集合和隊(duì)列,用于后續(xù)調(diào)度;而connection中存儲(chǔ)host和端口號(hào)并支持ssl,通過asyncio.open_connection()獲取連接。

      self.connections = {} # {(host, port, ssl): [Connection, ...], ...} self.queue = [] # [Connection, ...]

      任務(wù)執(zhí)行時(shí)crawl方法首先通過loop.run_until_complete(crawler.crawl())加載到event loop當(dāng)中,然后用上述語句構(gòu)建的鏈接池ConnectionPool中保存connection對(duì)象,獲取連接對(duì)象然后通過fetcher對(duì)象的fetch方法進(jìn)行數(shù)據(jù)爬取。對(duì)于一個(gè)url請(qǐng)求任務(wù),使用fetcher進(jìn)行處理,調(diào)度則是用asyncio.Task方法進(jìn)行的調(diào)度。其中fetch方法獲取被掛起的generator,交給asyncio.Task執(zhí)行。

      通過yield from和asynico.coroutine語句,將這個(gè)方法變?yōu)閳?zhí)行過程中的generator,在執(zhí)行fetcher.fetch()方法時(shí)候如果被掛起,則通過調(diào)度程序進(jìn)行處理。

      fetcher.fetch()方法是網(wǎng)絡(luò)爬蟲的核心方法,負(fù)責(zé)從網(wǎng)絡(luò)上獲取頁面數(shù)據(jù)并將其中的url加載到todo集合當(dāng)中,該方法嘗試獲取頁面數(shù)據(jù)當(dāng)嘗試次數(shù)達(dá)到上限時(shí)停止操作,獲取成功的html數(shù)據(jù)和外部鏈接以及重定向鏈接都將被存儲(chǔ)。在url鏈接次數(shù)到達(dá)上限的情況下,將停止這個(gè)url的鏈接操作,輸出出錯(cuò)日志。之后針對(duì)頁面的不同狀態(tài),采取不同的處理方式。

      下面的代碼是crawling.py文件從333行開始(crawling.py)到對(duì)應(yīng)方法結(jié)束的區(qū)域,通過對(duì)頁面status的判斷選擇不同的處理方式。其中通過正則表達(dá)式,獲取頁面上的url信息,這里選擇為href開頭的字符串,核心url提取的代碼在下面:

      # Replace href with (?:href|src) to follow image links. self.urls = set(re.findall(r'(?i)href=["\']?([^\s"\'<>]+)',body)) if self.urls:     logger.warn('got %r distinct urls from %r',len(self.urls), self.url)     self.new_urls = set()     for url in self.urls:         url = unescape(url)         url = urllib.parse.urljoin(self.url, url)         url, frag = urllib.parse.urldefrag(url)         if self.crawler.add_url(url):             self.new_urls.add(url)

      通過代碼,很明顯就可以看出正則匹配結(jié)果存儲(chǔ)在urls集合當(dāng)中并通過for循環(huán)依次進(jìn)行處理,加入到當(dāng)前fetcher的crawler對(duì)象的todo集合當(dāng)中。

      在之前分析的基礎(chǔ)上對(duì)主文件crawl.py進(jìn)行進(jìn)一步分析,可以得到整體爬蟲的架構(gòu):

      Python爬蟲過程是怎樣的

      在主文件當(dāng)中首先通過argparse.ArgumentParser進(jìn)行解析,設(shè)置控制臺(tái)的數(shù)據(jù)讀取和控制,其中選擇了IOCP作為windows環(huán)境下的event loop對(duì)象。主方法,首先通過parse_args返回存儲(chǔ)命令行數(shù)據(jù)的字典,如果沒有root屬性,則給出提示。然后配置日志級(jí)別,指示日志的輸出級(jí)別,低于***級(jí)別的不輸出。

      通過入口函數(shù)main方法進(jìn)入程序的時(shí)候,首先根據(jù)來自命令行參數(shù)對(duì)Crawler進(jìn)行初始化,同時(shí)獲取使用asyncio的loop event對(duì)象,執(zhí)行run_until_complete方法,會(huì)一直執(zhí)行到這個(gè)程序結(jié)束運(yùn)行。

      除此之外reporting.py用于打印當(dāng)前任務(wù)執(zhí)行情況。其中fetcher_report(fetcher, stats, file=None)打印這個(gè)url的工作狀態(tài),url就是fetcher的url屬性;report(crawler, file=None)打印整個(gè)工程所有完成的url工作狀態(tài)。

      讀到這里,這篇“Python爬蟲過程是怎樣的”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


      分享文章:Python爬蟲過程是怎樣的
      本文網(wǎng)址:http://www.ef60e0e.cn/article/pgpjhs.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        永顺县| 法库县| 东宁县| 红桥区| 化隆| 南投县| 即墨市| 孝义市| 克拉玛依市| 涡阳县| 香河县| 苗栗市| 佛学| 福州市| 定结县| 哈巴河县| 张家口市| 东丰县| 新干县| 蓬莱市| 龙井市| 霍林郭勒市| 内黄县| 彩票| 宁津县| 海门市| 和顺县| 府谷县| 吉林省| 永州市| 金溪县| 申扎县| 陈巴尔虎旗| 洪洞县| 洪湖市| 右玉县| 海宁市| 全南县| 嘉义市| 电白县| 河间市|