




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Python網(wǎng)絡爬蟲技術(shù)與應用目錄TOC\h\h第1章網(wǎng)絡爬蟲概述\h1.1網(wǎng)絡爬蟲簡介\h1.2網(wǎng)絡爬蟲的攻防戰(zhàn)\h1.3反網(wǎng)絡爬蟲技術(shù)及解決方案\h1.4本章習題\h第2章Python基本知識介紹\h2.1Python編程\h2.2HTML基本原理\h2.3基本庫的使用\h2.4實戰(zhàn)案例:百度新聞的抓取\h2.5本章習題\h第3章原生態(tài)網(wǎng)絡爬蟲開發(fā)\h3.1requests庫詳解\h3.2正則表達式\h3.3實戰(zhàn)案例:環(huán)球新聞的抓取\h3.4本章習題\h第4章解析HTML內(nèi)容\h4.1XPath的介紹與使用\h4.2lxml庫的安裝與使用\h4.3Chrome瀏覽器分析網(wǎng)站\h4.4BeautifulSoup的安裝與使用\h4.5實戰(zhàn)案例:BeautifulSoup的使用\h4.6頁面請求與JSON\h4.7模擬瀏覽器\h4.8實戰(zhàn)案例:小說網(wǎng)站的抓取\h4.9模擬登錄與驗證\h4.10驗證碼\h4.11實戰(zhàn)案例:模擬登錄及驗證\h4.12本章習題\h第5章Python與數(shù)據(jù)庫\h5.1MySQL數(shù)據(jù)庫的安裝與應用\h5.2MongoDB的安裝與使用\h5.3Python庫pymongo\h5.4本章習題\h第6章Python網(wǎng)絡爬蟲框架\h6.1Python網(wǎng)絡爬蟲的常見框架\h6.2PySpider網(wǎng)絡爬蟲框架簡介\h6.3Scrapy網(wǎng)絡爬蟲框架簡介\h6.4PySpider與Scrapy的區(qū)別\h6.5PySpider網(wǎng)絡爬蟲框架的安裝和使用\h6.6Scrapy網(wǎng)絡爬蟲框架的安裝和使用\h6.7Scrapy網(wǎng)絡爬蟲管理與部署\h6.8本章習題\h第7章綜合性實戰(zhàn)案例\h7.1實戰(zhàn)案例1:瀑布流抓取\h7.2實戰(zhàn)案例2:網(wǎng)絡爬蟲攻防戰(zhàn)\h7.3實戰(zhàn)案例3:分布式抓取\h7.4實戰(zhàn)案例4:微信公眾號文章點贊閱讀數(shù)抓取\h第1章網(wǎng)絡爬蟲概述1.1網(wǎng)絡爬蟲簡介1.1.1網(wǎng)絡爬蟲的概念與類別1.概念當前社會已經(jīng)邁入大數(shù)據(jù)時代,互聯(lián)網(wǎng)中的數(shù)據(jù)是海量的,如何自動高效地獲取互聯(lián)網(wǎng)中有用的信息是一個重要問題,而網(wǎng)絡爬蟲技術(shù)就是為解決這些問題而生的。當下的網(wǎng)絡就像一張大型的蜘蛛網(wǎng),分布于蜘蛛網(wǎng)各個節(jié)點的即是數(shù)據(jù),那么WebCrawler(網(wǎng)絡爬蟲)即是小蜘蛛,沿著網(wǎng)絡“捕獲”食物(即數(shù)據(jù)),而網(wǎng)絡爬蟲是指按照一定的規(guī)則,自動地抓取網(wǎng)絡信息的程序或者腳本。從專業(yè)角度來講,請求目標的行為是經(jīng)由程序模仿搜索引擎發(fā)出的,爬到本地的是目標返回的HTML代碼、JSON數(shù)據(jù)、二進制數(shù)據(jù)、圖片、視頻等,從中提取需要的數(shù)據(jù)并存儲起來使用。2.常見的網(wǎng)絡爬蟲搜索引擎如何獲得一個新網(wǎng)站的URL?主要描述如下:(1)主動向搜索引擎提交網(wǎng)站。(2)在其網(wǎng)站里設置外聯(lián)。(3)搜索引擎會和DNS服務商進行合作,能夠快速采集新的網(wǎng)站。常見的網(wǎng)絡爬蟲有以下幾種?!ねㄓ镁W(wǎng)絡爬蟲:也叫全網(wǎng)爬蟲,主要為門戶網(wǎng)站站點搜索引擎和大型Web服務提供商采集網(wǎng)絡數(shù)據(jù)。通用網(wǎng)絡爬蟲并不是一切皆可爬取,它也要遵循Robots協(xié)議。通用網(wǎng)絡爬蟲的工作流程為:抓取網(wǎng)頁→存儲數(shù)據(jù)→內(nèi)容處理→提供檢索→排名服務。通用網(wǎng)絡爬蟲的缺點有:僅提供與文本相關(guān)的內(nèi)容(如HTML、Word、PDF等),而無法提供多媒體文件(如音樂、圖片、視頻)和二進制文件,提供的結(jié)果一成不變,無法針對不同背景領(lǐng)域的人提供不同的搜索結(jié)果,不能提供人類語義上的檢索;具有局限性,所返回的網(wǎng)頁里90%的內(nèi)容無用,中文搜索引擎的自然語言檢索理解困難,信息占有量和覆蓋率存在局限,以關(guān)鍵字搜索為主是搜索引擎最主要的作用之一,對于圖片、數(shù)據(jù)庫、音頻、視頻多媒體的內(nèi)容無計可施;搜索引擎的社區(qū)化和個性化欠缺,大多數(shù)搜索引擎無法考慮人的地域、性別、年齡的差別,且抓取動態(tài)網(wǎng)頁效果不好?!ぞ劢咕W(wǎng)絡爬蟲:網(wǎng)絡爬蟲程序員寫的針對某種內(nèi)容的網(wǎng)絡爬蟲,面向主題網(wǎng)絡爬蟲、面向需求網(wǎng)絡爬蟲,會針對某種特定的內(nèi)容去抓取信息,并且保證內(nèi)容需求盡可能相關(guān)。聚焦網(wǎng)絡爬蟲是為解決通用網(wǎng)絡爬蟲的缺點而出現(xiàn)的。·積累式網(wǎng)絡爬蟲:從頭到尾,不斷抓取,過程中會進行反復操作?!ぴ隽渴骄W(wǎng)絡爬蟲:采用增量式更新和僅抓取新產(chǎn)生的或者已經(jīng)發(fā)生變化的網(wǎng)頁的網(wǎng)絡爬蟲,出現(xiàn)在已下載的網(wǎng)頁?!ど顚泳W(wǎng)絡爬蟲:Web頁面按存在方式可以分為表層網(wǎng)頁(SurfaceWeb)和深層網(wǎng)頁(DeepWeb)。表層網(wǎng)頁是指傳統(tǒng)搜索引擎可以索引的頁面,以超鏈接可以到達的靜態(tài)網(wǎng)頁為主構(gòu)成的Web頁面。深層網(wǎng)頁是指那些大部分內(nèi)容不能通過靜態(tài)鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關(guān)鍵詞才能獲得的Web頁面。3.增量式網(wǎng)絡爬蟲增量式網(wǎng)絡爬蟲(IncrementalWebCrawler)的體系結(jié)構(gòu)包括爬行模塊、排序模塊、更新模塊、本地頁面集、待爬行URL集及本地頁面URL集。增量式網(wǎng)絡爬蟲為確保本地頁面集中存儲的頁面是最新頁面并進一步提高本地頁面集中頁面的質(zhì)量,經(jīng)常使用的方法有:(1)統(tǒng)一更新法:網(wǎng)絡爬蟲以相同的頻率訪問全部網(wǎng)頁,不考慮網(wǎng)頁的改變頻率。(2)個體更新法:網(wǎng)絡爬蟲按照個體網(wǎng)頁的改變的頻率重新訪問各頁面。(3)基于分類的更新法:網(wǎng)絡爬蟲根據(jù)網(wǎng)頁改變的頻率把頁面劃分為更新較快網(wǎng)頁子集和更新較慢網(wǎng)頁子集兩類,而后以不同的頻率訪問這兩類網(wǎng)頁。為實現(xiàn)個體更新法,增量式網(wǎng)絡爬蟲需要對網(wǎng)頁的重要性排序,一般常用的策略有廣度優(yōu)先策略、PageRank優(yōu)先策略等。IBM開發(fā)的WebFountain增量式網(wǎng)絡爬蟲功能強大,它采用一個優(yōu)化模型控制爬行過程,并沒有對頁面變動過程做一概統(tǒng)計假設,而是按照先前爬行周期里的爬行成果和網(wǎng)頁的實際變化速度對頁面的更新頻率進行調(diào)整,采用的是一種自適應的方法。北京大學的天網(wǎng)增量爬行系統(tǒng)的目的是爬行國內(nèi)Web,把網(wǎng)頁劃分為變化網(wǎng)頁和新網(wǎng)頁兩類,分別采用不同爬行策略。為減緩對大量網(wǎng)頁變化歷史維護導致的性能難題,它按照網(wǎng)頁變化的時間局部性規(guī)律,在短時期內(nèi)直接爬行屢次變化的網(wǎng)頁,為盡快取得新網(wǎng)頁,它操縱索引型網(wǎng)頁追蹤新出現(xiàn)的網(wǎng)頁。4.深層網(wǎng)絡爬蟲1)基于領(lǐng)域知識的表單填寫此方式一般會維持一個本體庫,經(jīng)由語義分析來選取合適的關(guān)鍵詞填寫表單。利用一個預定義的領(lǐng)域本體知識庫來識別深層網(wǎng)頁的頁面內(nèi)容,同時利用一些來自Web站點的導航模式來辨認主動填寫表單時所需進行的路徑導航。2)基于網(wǎng)頁結(jié)構(gòu)分析的表單填寫此方式通常無領(lǐng)域知識或有唯一有限的領(lǐng)域知識,把網(wǎng)頁表單表示成DOM樹,從中提取表單各字段值。Desouky等提出一種LEHW方法。該方法把HTML網(wǎng)頁表示為DOM樹形式,把表單區(qū)分為單屬性表單和多屬性表單,分別進行處理;孫彬等提出一種基于XQuery的搜索系統(tǒng),它能夠模擬表單和特殊頁面的標記切換,把網(wǎng)頁關(guān)鍵字切換信息描述為三元組單元,依照一定規(guī)則排除無效表單,把Web文檔構(gòu)造成DOM樹,利用XQuery把文字屬性映射到表單字段。1.1.2網(wǎng)絡爬蟲的流程1.基本流程捜索引擎抓取系統(tǒng)的主要組成部分是網(wǎng)絡爬蟲,把互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地形成一個聯(lián)網(wǎng)內(nèi)容的鏡像備份是網(wǎng)絡爬蟲的主要目標。網(wǎng)絡爬蟲的基本工作流程如下:一開始選取一部分精心挑選的種子URL;把這些URL放入URL隊列中;從URL隊列中取出待抓取的URL,讀取URL之后開始解析DNS,并把URL對應的網(wǎng)頁下載下來,放進網(wǎng)頁庫中。此外,把這些URL放入已抓取URL隊列。分析已抓取URL隊列中的URL,并且把URL放入待抓取URL隊列,使其進入下一個循環(huán)。網(wǎng)絡爬蟲的基本流程如圖1-1所示。圖1-1網(wǎng)絡爬蟲的基本流程用簡短易懂的方式來講,即分為四個步驟:發(fā)送請求→獲取響應內(nèi)容→解析內(nèi)容→保存數(shù)據(jù)。請求流程如圖1-2所示。圖1-2請求流程圖2.從網(wǎng)絡爬蟲的角度對互聯(lián)網(wǎng)進行劃分從網(wǎng)絡爬蟲的角度可將互聯(lián)網(wǎng)劃分為以下五種:(1)已下載未過期網(wǎng)頁。(2)已下載已過期網(wǎng)頁:抓取到的網(wǎng)頁實際上是互聯(lián)網(wǎng)內(nèi)容的一個鏡像與備份,互聯(lián)網(wǎng)是動態(tài)變化的,一部分互聯(lián)網(wǎng)上的內(nèi)容已經(jīng)發(fā)生變化,這時這部分抓取到的網(wǎng)頁就已經(jīng)失效。(3)待下載網(wǎng)頁:是指待抓取URL隊列中的那些頁面。(4)可知網(wǎng)頁:尚未抓取下來,也沒有在待抓取URL隊列中,但是能夠經(jīng)由對已抓取頁面或者待抓取URL對應頁面進行分析獲得的URL,認為是可知網(wǎng)頁。(5)不可知網(wǎng)頁:還有一部分網(wǎng)頁,網(wǎng)絡爬蟲是無法直接抓取下載的,稱為不可知網(wǎng)頁。網(wǎng)頁類別劃分如圖1-3所示。3.網(wǎng)頁抓取的基本原理常見的叫法是網(wǎng)頁抓屏(ScreenScraping)、數(shù)據(jù)挖掘(DataMining)、網(wǎng)絡收割(WebHarvesting)或其類似的叫法。理論上,網(wǎng)頁抓取是一種經(jīng)由多種方法收集網(wǎng)絡數(shù)據(jù)的方式,不僅是經(jīng)由與API交互的方式。最常用的方法是確定爬取的URL,確定數(shù)據(jù)存儲格式,寫一個自動化程序向網(wǎng)絡服務器請求數(shù)據(jù)(通常是用HTML表單或其網(wǎng)頁文件),而后對數(shù)據(jù)進行清洗解析,汲取需要的信息并存入數(shù)據(jù)庫,基本思路如圖1-4所示?!鴪D1-3網(wǎng)頁劃分類別圖1-4基本思路圖4.目標源選擇目標源選擇應依照以下條件進行排序:數(shù)據(jù)相關(guān)性、易抓取程度、數(shù)據(jù)量、Robots協(xié)議。當然,根據(jù)自己的需求能夠自由變更。同等情況下盡量避免大型企業(yè)的官網(wǎng),因為其中大部分都設有反爬機制。5.編輯網(wǎng)絡爬蟲推薦使用的庫有requests、BeautifulSoup、Scrapy、Selenium,假如關(guān)于效率需求不是特別高,能夠考慮使用requestspost請求采集頁面,而后使用BeautifulSoup分析頁面標簽,這樣實現(xiàn)較為簡短易懂,也能解決大部分需求;假如對效率比較重視,或需要完成一個工程化的采集項目,Scrapy能夠作為首選。對分布式處理的良好支持和清晰的模塊化層次在提升效率的同時更易于進行代碼的管理。對HTTP的相關(guān)請求,使用requests比用其他函數(shù)更加明智。6.數(shù)據(jù)清洗獲得的數(shù)據(jù)和期望中的數(shù)據(jù)總有一定的差別,這一部分的任務便是排除異常數(shù)據(jù),把其余數(shù)據(jù)轉(zhuǎn)換為易于處理的形式。數(shù)據(jù)的異常主要包括數(shù)據(jù)格式異常和數(shù)據(jù)內(nèi)容異常。需要的數(shù)據(jù)可能存放在一個PDF、Word、JPG格式的文件中,把它們轉(zhuǎn)換成文本而后選取相應的信息,這是數(shù)據(jù)清洗工作的一部分。另外,由于網(wǎng)頁發(fā)布者的疏忽,網(wǎng)頁上有部分數(shù)據(jù)和其他頁面呈現(xiàn)不同,但需要把這部分數(shù)據(jù)也抓取下來,此時需要進行一定的處理,把數(shù)據(jù)格式進行統(tǒng)一。1.1.3網(wǎng)絡爬蟲的抓取1.概述網(wǎng)絡爬蟲的不同抓取策略,便是利用不同的方法確定待抓取URL隊列中URL的優(yōu)先順序。網(wǎng)絡爬蟲的抓取策略有很多種,但不管方法如何,其根本目標一致。網(wǎng)頁的重要性評判標準不同,大部分采用網(wǎng)頁的流行性進行定義。網(wǎng)頁結(jié)構(gòu)分布圖如圖1-5所示。圖1-5網(wǎng)頁結(jié)構(gòu)分布圖2.網(wǎng)絡爬蟲的抓取原理一開始選取一部分精心挑選的種子URL,把這些URL放入待抓取URL隊列,從待抓取URL隊列中拿出待抓取的URL,解析DNS并且得到主機的IP地址,并把URL相應的網(wǎng)頁下載下來,存放進已下載網(wǎng)頁庫中。此外,把這些URL放進已抓取URL隊列。分析已抓取URL隊列中的URL,分析當中的其他URL,并且把URL放入待抓取URL隊列,繼續(xù)進入下一個循環(huán)。3.網(wǎng)絡爬蟲的抓取策略1)寬度優(yōu)先遍歷(BreathFirst)策略基本思路:將新下載網(wǎng)頁包含的鏈接直接追加到待抓取URL隊列末尾。倘若網(wǎng)頁是1號網(wǎng)頁,從1號網(wǎng)頁中抽取出3個鏈接指向2號、3號和4號網(wǎng)頁,于是按照編號順序依次放入待抓取URL隊列,圖中網(wǎng)頁的編號便是在待抓取URL隊列中的順序編號,之后網(wǎng)絡爬蟲以此順序進行下載。抓取節(jié)點樹結(jié)構(gòu)如圖1-6所示。2)非完全PageRank(PartialPageRank)策略基本思路:對于已下載的網(wǎng)頁,加上待抓取URL隊列中的URL一起,形成網(wǎng)頁集合,在此集合內(nèi)進行PageRank計算,計算完成后,把待抓取URL隊列里的網(wǎng)頁依照PageRank得分由高到低排序,形成的序列便是網(wǎng)絡爬蟲接下來應該依次抓取的URL列表。設定每下載3個網(wǎng)頁進行新的PageRank計算,此時已經(jīng)有{1,2,3}3個網(wǎng)頁下載到本地。這三個網(wǎng)頁包含的鏈接指向{4,5,6},即待抓取URL隊列,如何決定下載順序?將這6個網(wǎng)頁形成新的集合,對這個集合計算PageRank的值,這樣4、5、6就獲得對應的PageRank值,由大到小排序,即可得出下載順序。假設順序為5、4、6,當下載5號頁面后抽取出鏈接,指向頁面8,此時賦予8臨時PageRank值,如果這個值大于4和6的PageRank值,則接下來優(yōu)先下載頁面8,如此不斷循環(huán),即形成非完全PageRank策略的計算思路。非完全PageRank策略結(jié)構(gòu)圖如圖1-7所示?!鴪D1-6抓取節(jié)點樹結(jié)構(gòu)圖1-7非完全PageRank策略結(jié)構(gòu)圖3)OPIC(OnlinePageImportanceComputation,在線頁面重要性計算)策略基本思路:在算法開始之前,每個互聯(lián)網(wǎng)頁面都給予相同的“現(xiàn)金”,每當下載某個頁面后,此頁面就把本身具有的“現(xiàn)金”平均分配給頁面中包含的鏈接頁面,把本身的“現(xiàn)金”清空。與PageRank的不同在于:PageRank每次需要迭代計算,而OPIC策略不需要迭代過程。所以,OPIC的計算速度遠遠快于PageRank,適合實時計算使用。4)大站優(yōu)先(LargerSitesFirst)策略基本思路:以網(wǎng)站為單位來選題網(wǎng)頁重要性,關(guān)于待抓取URL隊列中的網(wǎng)頁,按照所屬網(wǎng)站歸類,假如哪個網(wǎng)站等待下載的頁面最多,則優(yōu)先下載這些鏈接,其本質(zhì)思想傾向于優(yōu)先下載大型網(wǎng)站,因為大型網(wǎng)站常常包括更多的頁面。鑒于大型網(wǎng)站往往是著名企業(yè)的內(nèi)容,其網(wǎng)頁質(zhì)量一般較高,所以這個思路雖然簡單,但是有可靠依據(jù)。實驗表明,這個算法結(jié)果也要略優(yōu)先于寬度優(yōu)先遍歷策略。1.2網(wǎng)絡爬蟲的攻防戰(zhàn)網(wǎng)絡爬蟲是模仿人的瀏覽訪問行為,進行數(shù)據(jù)的批量抓取。當抓取數(shù)據(jù)量慢慢增大時,會對被訪問的服務器造成很大的壓力,甚至有可能會崩潰。服務器第一種識別網(wǎng)絡爬蟲的方式便是經(jīng)由檢查連接的用戶代理(User-Agent)來識別到底是瀏覽器訪問,還是代碼訪問。假如是代碼訪問,當訪問量增大時,服務器就會直接封掉來訪IP地址。在進行訪問時,在開發(fā)者環(huán)境下不僅能夠找到URL、FormData,還能夠在requests傳入headers中構(gòu)造瀏覽器的請求頭封裝,只需要構(gòu)造這個請求頭的參數(shù),創(chuàng)建請求頭部信息便可,代碼如下:importrequestsheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)Chrome/74.0.3729.157Safari/537.36',}#經(jīng)由requests()方法構(gòu)造一個請求對象url=r'//'response=requests.get(url,headers=headers)很多人會認為修改User-Agent太簡短易懂,確實很簡短易懂,但正常人一秒看一張圖,而網(wǎng)絡爬蟲一秒能看幾百張圖,那么服務器的壓力必然增大。也就是說,假如在一個IP地址下批量訪問下載圖片,這個行為不符合正常人類的行為,肯定會被限制。其原理也很簡單易懂,便是統(tǒng)計每個IP地址的訪問頻率,此頻率超過閾值,就會返回一個驗證碼,假如真的是用戶訪問,用戶就會填寫,而后繼續(xù)訪問,假如是代碼訪問,就會被限制。這個問題的解決方法有兩個,第一個便是常用的增設延時,每三秒抓取一次,代碼如下:importtimetime.sleep(3)其實,還有一個更重要的方法,那便是從本質(zhì)解決問題。不管如何訪問,服務器的目的都是查出哪些為代碼訪問,而后加以限制。解決辦法如下:為以防無法訪問,在數(shù)據(jù)采集之前經(jīng)常會使用代理,可以通過設置requests的proxies屬性的方式實現(xiàn)。首先構(gòu)建自己的代理IP地址池,把其以字典的形式賦值給proxies,而后傳輸給requests,代碼如下:proxies={"http":"0:3128","https":"0:1080",}response=requests.get(url,proxies=proxies)1.3反網(wǎng)絡爬蟲技術(shù)及解決方案1.網(wǎng)絡爬蟲的危害1)網(wǎng)絡爬蟲的影響性能騷擾:Web服務器默認接收人類訪問,受限于編輯水平和目的,網(wǎng)絡爬蟲將會為Web服務器帶來巨大的資源開銷。法律風險:服務器上的數(shù)據(jù)有產(chǎn)權(quán)歸屬,網(wǎng)絡爬蟲獲取數(shù)據(jù)后牟利將帶來法律風險。2)侵犯用戶隱私和知識產(chǎn)權(quán)互聯(lián)網(wǎng)用戶的隱私、公司的商業(yè)機密,在大數(shù)據(jù)時代極易被網(wǎng)絡爬蟲竊取,相關(guān)的網(wǎng)絡安全技術(shù)人員得采用必要的手段反爬,例如cookie反爬機制等,避免因商業(yè)機密的泄露而造成的經(jīng)濟損失??蛻舳讼蚍掌靼l(fā)送請求,請求頭里面攜帶cookie信息,服務器檢查cookie時效,如果cookie沒有過期,則返回響應的請求數(shù)據(jù)。攜帶cookie發(fā)送請求如圖1-8所示。圖1-8攜帶cookie發(fā)送請求2.反爬技術(shù)1)驗證碼(VerificationCode)驗證碼是一種直接而有效的方式,用來判斷請求方是否是人類。從一開始的簡短易懂數(shù)字驗證碼,到后來的中文驗證碼,再到現(xiàn)在的圖片驗證碼,驗證碼是應用層最普遍、最核心的網(wǎng)絡爬蟲對抗技術(shù)。關(guān)于一些簡短易懂的數(shù)字、字母驗證碼,隨著近幾年機器學習、神經(jīng)網(wǎng)絡的快速發(fā)展,已經(jīng)近乎于失效。有人訓練出基于LSTM的模型能夠達到90%的識別正確率。關(guān)于圖片驗證碼,也有專門用人工打碼平臺來處理,所以僅靠驗證碼很難有效處理網(wǎng)絡爬蟲問題,過多的驗證碼也會使正常用戶的體驗受到影響。簡單驗證碼如圖1-9所示。圖1-9簡單驗證碼2)AjaxAjax技術(shù)在2004年左右開始飛速發(fā)展,成為主流的瀏覽器端技術(shù),也使得網(wǎng)絡爬蟲從靜態(tài)網(wǎng)絡爬蟲轉(zhuǎn)化為動態(tài)網(wǎng)絡爬蟲。至此,抓取網(wǎng)站的數(shù)據(jù)不再是簡短易懂的一個HTTP請求,解析HTML頁面就能夠?qū)崿F(xiàn)的。大量的網(wǎng)站使用Ajax技術(shù)來構(gòu)建網(wǎng)站,也使得解析數(shù)據(jù)變得相對沒那么容易獲取,因為在網(wǎng)站完全不設防的情況下,網(wǎng)絡爬蟲也不單需要解析HTML頁面,同時還需要解析Ajax接口返回的數(shù)據(jù),代碼如下:functionget(){$.ajax({type:"OPTIONS",url:"/",compelete:function(d){vart=d.getResponseHeader("Date");vartimestamp=Date.parse(t);vartimes=timestamp/1000;vardateNow=formateDate(newDate(timestamp));liveNow(dateNow,times);}});};3)數(shù)據(jù)混淆網(wǎng)絡爬蟲的目標是抓取到有用的數(shù)據(jù)。對于許多應用來說,獲取錯誤的數(shù)據(jù)往往比獲取不到數(shù)據(jù)更加致命。這個思路的核心便是,當網(wǎng)絡爬蟲命中反爬規(guī)則之后,使用錯誤的數(shù)據(jù)取代正確的數(shù)據(jù)返回給網(wǎng)絡爬蟲,這種方式十分隱蔽,又能夠?qū)呈衷斐勺銐虻穆闊蚕喈斢行А?)經(jīng)由User-Agent控制訪問不管是瀏覽器還是網(wǎng)絡爬蟲程序,在向服務器發(fā)起網(wǎng)絡請求時,都會發(fā)過去一個頭文件headers,就像百度的請求頭,大多數(shù)的字段都是瀏覽器向服務器表明身份用的,對于網(wǎng)絡爬蟲程序來說,最需要注意的字段便是User-Agent。很多網(wǎng)站都會創(chuàng)建User-Agent白名單,只有屬于正常范圍的User-Agent才能夠正常訪問,代碼如下:#導入requests庫importrequests#定義獲得URL的函數(shù)defget_html(url):try:#請求獲得URL,超時時間30sr=requests.get(url,timeout=30)#狀態(tài)響應r.raise_for_status()#轉(zhuǎn)換成UTF-8的編碼格式r.encoding=r.apparent_encoding#返回響應的文本數(shù)據(jù)returnr.textexcept:#運行錯誤返回值return"SomethingWrong!"#輸出獲得URLprint(get_html(''))5)經(jīng)由IP地址限制反網(wǎng)絡爬蟲假如一個固定的IP地址在短暫的時間內(nèi)快速大量地訪問一個網(wǎng)站,那么自然會引起注意。管理員能夠經(jīng)由一些手段禁止該IP地址訪問,網(wǎng)絡爬蟲程序則無法工作。解決方法:比較成熟的方式是IP地址代理池,簡而言之,便是經(jīng)由IP地址代理,從不同的IP地址進行訪問,這樣就無法限制該IP地址的訪問。但是IP地址代理的獲得本身便是一個很麻煩的事情,雖然網(wǎng)上有免費和付費的,但是質(zhì)量參差不齊。假如是企業(yè)需要,能夠經(jīng)由自己購買集群云服務來自建代理池。這里實現(xiàn)一個簡短易懂的代理轉(zhuǎn)換,代碼如下:importrandomdefget_proxy():'''簡答模擬代理池返回一個字典類型的鍵值對,'''proxy=["1:80","35:8118","44:808","5:9999","10:808"]fakepxs={}fakepxs['http']=proxy[random.randint(0,len(proxy)-1)]returnfakepxs6)經(jīng)由Robots協(xié)議限制網(wǎng)絡爬蟲世界上將網(wǎng)絡爬蟲做得最大、最好的便是Google。搜索引擎本身便是一個超級大的網(wǎng)絡爬蟲,Google開發(fā)出來的網(wǎng)絡爬蟲24小時不中斷地在網(wǎng)上抓取著新的信息,并返回給數(shù)據(jù)庫,但是這些搜索引擎的網(wǎng)絡爬蟲都遵循著Robots協(xié)議。Robots協(xié)議是一種寄放于網(wǎng)站根目錄下的ASCII編碼的文本文件,它往往通知網(wǎng)絡搜索引擎的漫游器,該網(wǎng)站中的哪些內(nèi)容是不應被搜索引擎的漫游器獲得的,哪些是能夠被漫游器獲得的。Robots協(xié)議并不是一個標準,而只是約定俗成的,所以并不能保護網(wǎng)站的隱私。注意,Robots協(xié)議是用字符串比較來確定是否獲得URL,所以目錄結(jié)尾有與沒有斜杠“/”表示的是不同的URL。Robots協(xié)議允許使用類似'Disallow:*.gif'這樣的通配符。這實際上只是一個自由協(xié)議,遵循與否,都在于網(wǎng)絡爬蟲的編輯者。來看一下京東的Robots協(xié)議,代碼如下:User-agent:*Disallow:/?*Disallow:/pop/*.htmlDisallow:/pinpai/*.html?*User-agent:EtaoSpiderDisallow:/User-agent:HuihuiSpiderDisallow:/User-agent:GwdangSpiderDisallow:/User-agent:WochachaSpiderDisallow:/能夠看到,京東的Robots協(xié)議里確定地指出四個“User-Agent”是禁止訪問的,事實上,這四個User-Agent也是四個臭名遠揚的惡性網(wǎng)絡爬蟲。當然有種情況是例外的,例如網(wǎng)絡爬蟲獲得網(wǎng)頁的速度和人類瀏覽網(wǎng)頁是差不多的,這并不會給服務器造成太大的性能損失,在這種情況下是可以不用遵守Robots協(xié)議的。1.4本章習題一、單選題1.網(wǎng)絡爬蟲的基本流程是()。A.發(fā)送請求→獲取響應內(nèi)容→解析內(nèi)容→保存數(shù)據(jù)B.發(fā)送請求→解析內(nèi)容→獲取響應內(nèi)容→保存數(shù)據(jù)C.發(fā)送請求→獲取響應內(nèi)容→保存數(shù)據(jù)D.發(fā)送請求→解析DNS→獲取響應內(nèi)容→保存數(shù)據(jù)2.組織數(shù)據(jù)采集基本思想的第一步是()。A.組織數(shù)據(jù)庫B.網(wǎng)絡爬蟲編寫C.數(shù)據(jù)整理D.采集目標源3.以下選項中,()不是爬行策略中的特征。A.腳本語言B.巨大的數(shù)據(jù)量C.快速的更新頻率D.動態(tài)頁面的產(chǎn)生4.網(wǎng)絡爬蟲的系統(tǒng)框架中,()不是主過程選擇。A.服務器B.控制器C.解析器D.資源庫5.以下選項中,()不是Pythonrequests庫提供的方法。A.get()B.push()C.post()D.head()6.以下選項中,()不是網(wǎng)絡爬蟲帶來的負面問題。A.法律風險B.隱私泄露C.商業(yè)利益D.性能騷擾7.如果一個網(wǎng)站的根目錄下沒有robots.txt文件,則以下說法中不正確的是()。A.網(wǎng)絡爬蟲應該以不對服務器造成性能騷擾的方式抓取內(nèi)容B.網(wǎng)絡爬蟲可以不受限制地抓取該網(wǎng)站內(nèi)容并進行商業(yè)使用C.網(wǎng)絡爬蟲可以肆意抓取該網(wǎng)站內(nèi)容D.網(wǎng)絡爬蟲的不當抓取行為仍然具有法律風險二、簡答題1.什么是網(wǎng)絡爬蟲?2.簡述網(wǎng)絡爬蟲的基本流程。3.列舉三種網(wǎng)絡爬蟲策略,并簡單說明原理。4.列舉三種常見反網(wǎng)絡爬蟲技術(shù),并簡單說明。第2章Python基本知識介紹本章學習目標·掌握Python的安裝與環(huán)境配置?!ふ莆誔yCharm的使用?!ち私釮TML的內(nèi)容?!ふ莆誔ython基本庫的使用。本章先向讀者介紹Python的安裝與環(huán)境配置,再介紹HTML及其基本原理,最后介紹Python基本庫的使用。2.1Python編程2.1.1Python的安裝與環(huán)境配置Python是一門計算機編程語言。相比于C語言及Java來說,Python更容易上手,同時也十分簡單,易懂易用。很多大型網(wǎng)站,例如YouTube、Google等都在大量使用Python,各種常用的腳本任務用Python實現(xiàn)也十分容易,無須擔心學非所用。1.計算機編程語言這么多,為什么用Python來寫網(wǎng)絡爬蟲呢?(1)對比其他靜態(tài)編程語言來說,如Java、C#、C++,Python抓取網(wǎng)頁文檔接口更加簡潔;對比其他動態(tài)語言Perl、Shell,Python的urllib2包提供非常完整的訪問網(wǎng)頁文檔API。抓住網(wǎng)頁有時候需要模擬瀏覽器的行為,而Python具有很多第三方包,如requests、XPath等均提供此類支持。(2)對于抓取之后的網(wǎng)頁需要進行處理,如過濾標簽、提取文本等。Python提供簡潔的文檔處理功能,可以用很短的代碼完成大部分文檔處理。(3)具有各種網(wǎng)絡爬蟲框架,可方便高效地下載網(wǎng)頁。(4)多線程、進程模型成熟穩(wěn)定,網(wǎng)絡爬蟲是一個典型的多任務處理場景,請求頁面時會有較長的延遲,總體來說更多的是等待。多線程或進程會更優(yōu)化程序效率,提升整個系統(tǒng)的下載和分析能力。2.Python的概念百度百科解釋Python是一種計算機程序設計語言,是一種面向?qū)ο蟮膭討B(tài)類型語言,最初被設計用于編輯自動化腳本(Shell),隨著版本的不斷更新和語言新功能的添加,Python被越來越多地用于獨立的、大型項目的開發(fā)。Python是有名的“龜叔”GuidovanRossum在1989年圣誕節(jié)期間,為打發(fā)無聊的圣誕節(jié)而編輯的一個編程語言。Python能夠提供十分完善的基礎代碼庫,涵蓋網(wǎng)絡、文件、GUI、數(shù)據(jù)庫、文本等大量內(nèi)容,被形象地稱作“內(nèi)置電池”。用Python開發(fā),很多功能沒必要從零編輯,直接利用現(xiàn)有的即可。除內(nèi)置的庫外,Python還有大量的第三方庫,也就是別人開發(fā)的、供直接運用的工具。當然,假如開發(fā)的代碼經(jīng)由很好的封裝,也能夠作為第三方庫給別人使用。很多大型網(wǎng)站都是用Python開發(fā)的,例如YouTube、Instagram,還有國內(nèi)的豆瓣網(wǎng)。很多大公司,包括Google、Yahoo等,乃至NASA(美國航空航天局)都大量地應用Python?!褒斒濉辟x予Python的定位是“優(yōu)雅”“明確”“簡短易懂”,所以Python程序看上去總是簡短易懂。初學者學習Python,不但初學容易,而且來日深入下去,能夠編輯那些十分復雜的程序。總的來說,Python的哲學便是簡短、易懂、優(yōu)雅,盡可能寫出容易看明白的代碼,盡可能寫少的代碼。3.Python的應用領(lǐng)域Python擁有很多免費數(shù)據(jù)函數(shù)庫、免費Web網(wǎng)頁模板系統(tǒng)和與Web服務器進行交互的庫,能夠?qū)崿F(xiàn)Web開發(fā),搭建Web框架,目前比較有名氣的PythonWeb框架為Django。同樣是解釋型語言的JavaScript,在Web開發(fā)中的應用已經(jīng)較為廣泛,原因是其有一套完善的框架。但Python也有著特有的優(yōu)勢。例如,Python相比于JS、PHP在語言層面較為完好并且關(guān)于同一個開發(fā)需求能夠提供多種方案,庫的內(nèi)容豐富,使用方便。從事該領(lǐng)域應從數(shù)據(jù)、組件、安全等多領(lǐng)域進行學習,從底層了解其工作原理并可支配任何業(yè)內(nèi)主流的Web框架。下面來介紹一下基于Python語言的Web開發(fā)中幾種常見的Web開發(fā)框架。1)DjangoDjango是一個常見的PythonWeb應用框架。它是開源的Web開發(fā)框架,包括多種組件,能夠?qū)崿F(xiàn)關(guān)系映射、動態(tài)內(nèi)存管理、界面管理等功能。Django開發(fā)采用DRY原則,同時擁有獨立的輕量級Web服務器,能快速開發(fā)Web應用。Django開發(fā)遵循MVC模式,包括模型、視圖、控制三部分。模型層是應用程序底層,主要用于處理與數(shù)據(jù)有關(guān)的事件,如數(shù)據(jù)存取驗證等。由于Django中用戶輸入控制模塊是由框架處理的,因此也能夠稱為模板層。模板層用于展現(xiàn)數(shù)據(jù),負責模板的存取和正確調(diào)用模板等業(yè)務。程序員使用模板語言來渲染HTML頁面,給模板所需顯示的信息,使用既定的模板來渲染結(jié)果。視圖層組成應用程序的業(yè)務邏輯,負責在網(wǎng)頁或類似類型的文檔中展示數(shù)據(jù)。2)CherryPyCherryPy是基于Python的面向?qū)ο蟮腍TTP框架,適合Python開發(fā)者。CherryPy本身內(nèi)置Web服務器。CherryPy的用戶無須搭設別的Web服務器,能直接在內(nèi)置的服務器上運行應用程序。服務器一方面把底層TCP套接字傳輸?shù)男畔⑥D(zhuǎn)換成HTTP請求,并傳遞給相應的處理程序;另一方面把上層軟件傳來的信息打包成HTTP響應,向下傳遞給底層的TCP套接字。3)FlaskFlask適合開發(fā)輕量級的Web應用。它的服務器網(wǎng)關(guān)接口工具箱采用Werkzeug,模板引擎使用Jinja2。Flask使用BSD授權(quán)。Flask自身沒有如表單驗證和數(shù)據(jù)庫抽象層等一些基本功能,而是依附第三方庫來完成這些工作。Flask的結(jié)構(gòu)是可擴展的,能夠比較容易地為它添加一些需要的功能。4)PyramidPyramid是開源框架,執(zhí)行效率高,開發(fā)周期短。Pyramid包含Python、Perl、Ruby的特性,擁有不依賴于平臺的MVC架構(gòu),以及最快的啟動開發(fā)的能力。5)TurboGearTurboGear創(chuàng)建在其框架基礎上,它嘗試把其框架優(yōu)秀的部分集成到一起。它允許開發(fā)者從一個單文件服務開始開發(fā),慢慢擴大為一個全棧服務。4.數(shù)據(jù)分析與處理通常情況下,Python被用來做數(shù)據(jù)分析。用C設計一些底層的算法進行封裝,而后用Python進行調(diào)用。由于算法模塊較為固定,所以用Python直接進行調(diào)用,方便且靈活,能夠根據(jù)數(shù)據(jù)分析與統(tǒng)計的需要靈活使用。Python也是一個比較完善的數(shù)據(jù)分析生態(tài)系統(tǒng),其中,matplotlib常常會被用來繪制數(shù)據(jù)圖表,它是一個2D繪圖工具,有著杰出的跨平臺交互特性,日常做描述統(tǒng)計用到的直方圖、散點圖、條形圖等都會用到它,幾行代碼便可出圖。平??吹降腒線圖、月線圖也可用matplotlib繪制。假如在證券行業(yè)做數(shù)據(jù)分析,Python是必不可少的。隨著大數(shù)據(jù)和人工智能時代的到來,網(wǎng)絡和信息技術(shù)開始滲透到人類日常生活的方方面面,產(chǎn)生的數(shù)據(jù)量也呈現(xiàn)指數(shù)級增長的態(tài)勢,同時現(xiàn)有數(shù)據(jù)的量級已經(jīng)遠遠超過目前人力所能處理的范疇。在此背景下,數(shù)據(jù)分析成為數(shù)據(jù)科學領(lǐng)域中一個全新的研究課題。在數(shù)據(jù)分析的程序語言選擇上,由于Python語言在數(shù)據(jù)分析和處理方面的優(yōu)勢,大量的數(shù)據(jù)科學領(lǐng)域的從業(yè)者使用Python來進行數(shù)據(jù)科學相關(guān)的研究工作。數(shù)據(jù)分析是指用合適的分析方法對收集來的大量數(shù)據(jù)進行分析,提取實用信息和構(gòu)成結(jié)論,對數(shù)據(jù)加以具體鉆研和歸納總結(jié)的過程。隨著信息技術(shù)的高速發(fā)展,企業(yè)的生產(chǎn)、收集、存儲數(shù)據(jù)的能力大大提升,同時數(shù)據(jù)量也與日俱增。把這些繁雜的數(shù)據(jù)經(jīng)由數(shù)據(jù)分析方法進行提煉,以此研究出數(shù)據(jù)的發(fā)展規(guī)律和展望趨向走向,進而幫助企業(yè)管理層做出決策。數(shù)據(jù)分析是一種解決問題的過程和方法,主要的步驟有需求分析、數(shù)據(jù)獲得、數(shù)據(jù)預處理、分析建模、模型評價與優(yōu)化、部署。下面分別介紹每個步驟。1)需求分析數(shù)據(jù)分析中的需求分析是數(shù)據(jù)分析環(huán)節(jié)中的第一步,也是十分重要的一步,決定后續(xù)的分析方法和方向。主要內(nèi)容是根據(jù)業(yè)務、生產(chǎn)和財務等部門的需要,結(jié)合現(xiàn)有的數(shù)據(jù)情況,提出數(shù)據(jù)分析需求的整體分析方向、分析內(nèi)容,最終和需求方達成一致。2)數(shù)據(jù)獲得數(shù)據(jù)獲得是數(shù)據(jù)分析工作的基礎,是指按照需求分析的結(jié)果提取、收集數(shù)據(jù)。數(shù)據(jù)獲得主要有兩種方式:網(wǎng)絡爬蟲獲得和本地獲得。網(wǎng)絡爬蟲獲得是指經(jīng)由網(wǎng)絡爬蟲程序合法獲得互聯(lián)網(wǎng)中的各種文字、語音、圖片和視頻等信息;本地獲得是指經(jīng)由計算機工具獲得存儲在本地數(shù)據(jù)庫中的生產(chǎn)、營銷和財務等系統(tǒng)的歷史數(shù)據(jù)和實時數(shù)據(jù)。3)數(shù)據(jù)預處理數(shù)據(jù)預處理是指對數(shù)據(jù)進行數(shù)據(jù)合并、數(shù)據(jù)清洗、數(shù)據(jù)標準化和數(shù)據(jù)變換,并直接用于分析建模的這一過程的總稱。其中,數(shù)據(jù)合并能夠把多張互相關(guān)聯(lián)的表格合并為一張;數(shù)據(jù)清洗能夠去掉重復、缺失、異常、不一致的數(shù)據(jù);數(shù)據(jù)標準化能夠去除特征間的量綱差異;數(shù)據(jù)交換則能夠經(jīng)由離散化、啞變量處理等技術(shù)滿足后期分析與建模的數(shù)據(jù)要求。在數(shù)據(jù)分析過程中,數(shù)據(jù)預處理的各個過程互相交叉,并沒有固定的先后順序。4)分析建模分析建模是指經(jīng)由對比分析、分組分析、交叉分析、回歸分析等分析方法,以及聚類模型、分類模型、關(guān)聯(lián)規(guī)則、智能推薦等模型和算法,發(fā)現(xiàn)數(shù)據(jù)中的有價值信息,并得出結(jié)論的過程。5)模型評價與優(yōu)化模型評價是指對于已經(jīng)創(chuàng)建的一個或多個模型,根據(jù)其模型的類型,使用不同的指標評價其性能好壞的過程。模型的優(yōu)化則是指模型性能在經(jīng)由模型評價后已經(jīng)達到要求,但在實際生產(chǎn)環(huán)境應用過程中,發(fā)現(xiàn)模型的性能并不理想,繼而對模型進行重構(gòu)與優(yōu)化的過程。6)部署部署是指把數(shù)據(jù)分析結(jié)果與結(jié)論應用至實際生產(chǎn)系統(tǒng)的過程。根據(jù)需求的不同,部署階段可以是一份包含現(xiàn)狀具體整改措施的數(shù)據(jù)分析報告,也可以是把模型部署在整個生產(chǎn)系統(tǒng)的解決方案。在多數(shù)項目中,數(shù)據(jù)分析員提供的是一份數(shù)據(jù)分析報告或者一套解決方案,實際執(zhí)行與部署的是需求方。Python是一門應用十分廣泛的計算機語言,在數(shù)據(jù)科學領(lǐng)域具有無可比擬的優(yōu)勢。Python正在逐步成為數(shù)據(jù)科學領(lǐng)域的主流語言。Python數(shù)據(jù)分析具備以下幾方面優(yōu)勢:(1)語法簡短、易懂、精練。對于初學者來說,比起其他編程語言,Python更容易上手。(2)有很多功能強大的庫。結(jié)合在編程方面的強大實力,只使用Python這一種語言就能夠去構(gòu)建以數(shù)據(jù)為中心的應用程序。(3)不單適用于研究和構(gòu)建原型,同時也適用于構(gòu)建生產(chǎn)系統(tǒng)。研究人員和工程技術(shù)人員使用同一種編程工具,能給企業(yè)帶來明顯的組織效益,并降低企業(yè)的運營成本。(4)Python程序能夠以多種方式輕易地與其語言的組件“粘接”在一起。例如,Python的C語言API能夠幫助Python程序靈活地調(diào)用C程序,這意味著用戶能夠根據(jù)需要給Python程序添加功能,或者直接使用Python語言,不要調(diào)用API接口。(5)Python是一個混合體,豐富的工具集使它介于系統(tǒng)的腳本語言和系統(tǒng)語言之間。Python不但具備全部腳本語言簡短易懂和易用的特點,還擁有編譯語言所具有的高級軟件工程工具。Python具有IPython、NumPy、SciPy、Pandas、Matplotlib、Scikit-learn和Spyder等功能齊全、接口統(tǒng)一的庫,能為數(shù)據(jù)分析工作提供極大的便利。5.人工智能應用人工智能的核心算法是完全依賴于C/C++的,由于是計算密集型,因此需要十分致密的優(yōu)化,還需要GPU、專用硬件之類的接口,這些都只有C/C++能做到。所以在某種意義上,其實C/C++才是人工智能領(lǐng)域最主要的語言。Python是這些庫的APIBinding,使用Python是因為C-Python的膠水語言特性,要開發(fā)一個其語言到C/C++的跨語言接口用Python是最容易的,比其語言門檻要低不少,尤其是使用C-Python的時候。說到AI,Python已經(jīng)逐步成為一些AI算法的一部分,從最開始的簡短易懂的雙人游戲到后來復雜的數(shù)據(jù)工程任務。Python的AI庫在現(xiàn)今的軟件中充當著不可取代的角色,包括NLYK、PyBrain、OpenCV和AIMA,一些AI軟件功能,短短的一個代碼塊就足夠。再看人臉識別技術(shù)、會話接口等領(lǐng)域,Python正在一步步覆蓋更多新領(lǐng)域??梢哉f,Python未來的潛力是不可估量的。在人工智能的應用方面,例如在神經(jīng)網(wǎng)絡、深度學習方面,Python都能夠找到比較成熟的包來加以調(diào)用。并且Python是面向?qū)ο蟮膭討B(tài)語言,且適用于科學計算,這就使得Python在人工智能方面頗受喜愛。雖然人工智能程序不限于Python,但仍然為Python提供大量的API,這也正是由于Python當中包含著較多的適用于人工智能的模塊,如sklearn模塊等。調(diào)用方便、科學計算功能強大依舊是Python在AI領(lǐng)域最強大的競爭力。6.Linux系統(tǒng)下Python的安裝1)創(chuàng)建路徑首先創(chuàng)建一個Pyhton的安裝路徑,命令如下,創(chuàng)建安裝路徑結(jié)果如圖2-1所示。rm-rf/usr/local/python3sudomkdir/usr/local/python3surootchmod777/usr/local/python3圖2-1創(chuàng)建安裝路徑結(jié)果創(chuàng)建完成后進入該文件夾中,命令如下,結(jié)果如圖2-2所示。cd/usr/local/python3圖2-2進入該文件夾2)下載安裝包進入該文件夾后,下載安裝包到當前路徑文件夾中,Linux系統(tǒng)能夠使用wget命令來執(zhí)行,代碼如下,下載進度如圖2-3所示。wget--no-check-certificate/ftp/python/3.6.5/Python-3.6.5.tgz3)解壓安裝包在當前文件夾下解壓,代碼如下:tar-xzvfPython-3.6.5.tgz圖2-3下載進度4)編譯安裝進入該Python3.6.5文件中進行編譯安裝,代碼如下:#進入解壓完的文件夾cdPython-3.6.5#編譯sudo./configure--prefix=/usr/local/python3#安裝makemakeinstall#如在編譯過程報錯可使用這條命令解決sudoapt-getinstallbuild-essential5)創(chuàng)建鏈接在編譯與安裝完成后,再創(chuàng)建Python3的軟鏈接,代碼如下:sudoln-s/usr/local/python3/bin/python3/usr/bin/python3這時會報錯,顯示failedtocreatesymboliclink'/usr/bin/python3':Fileexists:無法創(chuàng)建符號鏈接'/usr/bin/python3':文件存在,這時使用rm刪掉相同名稱的鏈接便可,代碼如下,創(chuàng)建軟鏈接結(jié)果如圖2-4所示。rm-rf/usr/bin/python3圖2-4創(chuàng)建軟鏈接結(jié)果6)測試Python3是否可用在終端窗口中輸入Python3查看是否可用。進入Python3后如圖2-5所示。圖2-5進入Python37)安裝setuptools在安裝pip之前,需要先安裝setuptools,它是一組Python的distutilsde工具的增強工具,能夠讓程序員更方便地創(chuàng)建和發(fā)布Python包,特別是那些對其他包具有依賴性的情況。當需要安裝第三方Python包時,可能會用到easy_install命令。使用easy_install命令實際上是在調(diào)用setuptools來完成安裝模塊的工作。首先下載軟件包,與安裝Python類似,使用wget來進行下載,代碼如下,下載setuptools如圖2-6所示。cd/usr/local/python3wget/packages/source/s/setuptools/setuptools-19.6.tar.gz圖2-6下載setuptools8)解壓并安裝setuptools工具,代碼如下:#解壓軟件tar-zxvfsetuptools-19.6.tar.gzcdsetuptools-19.6#編譯并安裝python3setup.pybuildpython3setup.pyinstall9)開始安裝pip使用wget直接從官網(wǎng)拉取軟件包,代碼如下,下載pip包如圖2-7所示。cd/usr/local/python3wget--no-check-certificate/packages/source/p/pip/pip-10.0.1.tar.gz圖2-7下載pip包之后安裝pip包,代碼如下:#下載完后進行解壓tar-zxvfpip-10.0.1.tar.gz#解壓完成后進入文件夾中進行編譯和安裝cd/usr/local/python3/pip-10.0.1python3setup.pybuild#安裝pipsudoapt-getinstallpython3-pip10)測試pip是否安裝成功使用pip安裝一個Python包,成功則表示pip安裝成功,如報錯或者沒有顯示,則可使用更新機制,代碼如下,測試pip是否安裝成功如圖2-8所示。#驗證pip3安裝是否成功pip3installipython#查看pip3的版本pip3-V#安裝lxml包pip3installlxml#升級pipsudopip3install--upgradepip圖2-8測試pip是否安裝成功2.1.2PyCharm的安裝與使用PyCharm是一種PythonIDE,帶有一整套能夠幫助用戶在使用Python語言開發(fā)時提高效率的工具,如調(diào)試、語法高亮、Project管理、代碼跳轉(zhuǎn)、智能提示、自動完成、單元測試、版本控制。另外,該IDE能夠提供一些高級功能,以用于支持Django框架下的專業(yè)Web開發(fā)。1.下載PyCharm安裝包首先要下載PyCharm的安裝包,下載地址為/pycharm/download/#section=linux,PyCharm官網(wǎng)如圖2-9所示。圖2-9PyCharm官網(wǎng)2.把該文件移動到python文件夾中解壓并賦予權(quán)限#進入安裝目錄cd/usr/local/python3#解壓安裝文件tar-zxvfpycharm-professional-2021.3.1.tar.gz#權(quán)限設置chmod-R777/usr/local/python3/pycharm-2021.3.13.安裝前修改hosts文件#在終端設備中輸入命令vi/etc/hosts#在打開的文件中加入下面的代碼配置hosts如圖2-10所示。4.進入PyCharm下的bin目錄中,執(zhí)行sh命令開始安裝#安裝命令cd/usr/local/python3/pycharm-2021.3.1/binexportDISPLAY=localhost:0.0sh./pycharm.sh在彈出的窗口中單擊OK按鈕。之后彈出PyCharmPrivaryPolicyAgreement對話框,即隱私政策協(xié)議,直接單擊Continue按鈕同意。在彈出的發(fā)送請求中,單擊發(fā)送統(tǒng)計信息。選擇風格,單擊Next:Featuredplugins,再單擊StartusingPyCharm。5.搭建Python解釋器打開設置界面,配置PyCharm如圖2-11所示。▲圖2-10配置hosts圖2-11配置PyCharm搭建Python解釋器,選擇Python的安裝路徑后單擊OK按鈕確定,進入Python解釋器配置,如圖2-12所示,配置Python解釋器路徑如圖2-13所示。圖2-12進入Python解釋器配置6.創(chuàng)建項目與文件打開PyCharm軟件,單擊創(chuàng)建新項目,選擇存放的項目路徑及名稱后,選擇建好的Python環(huán)境,配置Python解釋器如圖2-14所示。▲圖2-13配置Python解釋器路徑圖2-14配置Python解釋器新建Python文件,右擊項目名,選擇New→Python-File,輸入代碼。第一次運行右擊編輯區(qū)域,單擊Run命令,以后可直接單擊右上角或者左下角的綠三角按鈕,在PyCharm軟件中運行Python如圖2-15所示。圖2-15在PyCharm軟件中運行Python到這里,Linux系統(tǒng)的PyCharm就已經(jīng)安裝完成,Windows系統(tǒng)下的PyCharm安裝方法與此類似,不同是路徑的選擇及host文件部分。2.2HTML基本原理2.2.1HTML簡介1.HTML解釋(1)HTML是指超文本標記語言(HyperTextMarkupLanguage)。(2)HTML不是一種編程語言,而是一種標記語言(MarkupLanguage)。(3)標記語言是一套標記標簽(MarkupTag)。(4)HTML使用標記標簽來描述網(wǎng)頁。2.HTML標簽(1)HTML標簽是由尖括號包圍的關(guān)鍵詞,如<html>。(2)HTML標簽通常是成對出現(xiàn)的,如<b>和</b>。(3)標簽對中的第一個標簽是開始標簽,第二個標簽是結(jié)束標簽。(4)開始標簽和結(jié)束標簽也被稱為開放標簽和閉合標簽。3.HTML文檔=網(wǎng)頁(1)HTML的基本原理是HTML文檔描述網(wǎng)頁。(2)HTML文檔包含HTML標簽和純文本。(3)HTML文檔也被稱為網(wǎng)頁。2.2.2HTML的基本原理1.HTMLHTML是超文本標記語言,不需要編譯,直接經(jīng)由瀏覽器執(zhí)行,例如如下代碼:<inputtype="text"name="jake"/>2.基本作用(1)能夠編輯靜態(tài)網(wǎng)頁,在網(wǎng)頁顯示圖片、文字、聲音、表格、鏈接。(2)靜態(tài)網(wǎng)頁html只能夠?qū)懗伸o態(tài)網(wǎng)頁html。(3)動態(tài)網(wǎng)頁是能夠交互的,而不是動畫。HTML發(fā)展史如圖2-16所示。圖2-16HTML發(fā)展史2.3基本庫的使用2.3.1urllib庫在Python3中,urllib和urllib2進行歸并,目前只有一個urllib模塊,urllib和urllib2中的內(nèi)容整合進urllib.request,urlparse整合進urllib.parse。(1)urlparse把urlstr解析成各個組件,代碼如下:#-*-coding:utf-8-*-importurllib.requestimporturllib.parseurlstr=""parsed=urllib.parse.urlparse(urlstr)print(parsed)解析組件執(zhí)行結(jié)果如圖2-17所示。圖2-17解析組件執(zhí)行結(jié)果(2)urljoin把URL的根域名和新URL拼合成一個完整的URL,代碼如下:importurllib.parseurl=""new_path=urllib.parse.urljoin(url,"index.html")print(new_path)(3)urlopen打開一個URL的方法,返回一個文件對象,而后能夠進行類似文件對象的操作,代碼如下:importurllib.requestreq=urllib.request.urlopen('')print(req.read())2.3.2requests庫requests庫基于urllib,且比urllib更加方便,是Python更加簡短易懂的http庫。以下是使用requests庫的一個例子:importrequestsresponse=requests.get('')print(type(response))#返回值的類型print(response.status_code)#當前網(wǎng)站返回的狀態(tài)碼print(type(response.text))#網(wǎng)頁內(nèi)容的類型print(response.text)#網(wǎng)頁的具體內(nèi)容(html代碼)print(response.cookies)#網(wǎng)頁的Cookierequests中輸出網(wǎng)頁的HTML代碼的方法是response方法,它相當于urllib庫的response.read方法,只不過不需要進行decode操作。打印Cookie的操作也比urllib簡短易懂,只需要使用Cookie方法便可,各種請求方式代碼如下:importrequestsrequests.post('/post')requests.delete('/delete')requests.put('/put')requests.head('/get')requests.options('/get')2.3.3re庫1.match()方法從字符串頭部開始匹配,代碼如下:importrecontent='The123456ismyonephonenumber.'print(len(content))#字符串長度result=re.match(r'^The',content)#使用match匹配,第一個參數(shù)為正則表達式,第二個為要匹配的字符串print(result)print(result.group())#輸出匹配內(nèi)容print(result.span())#輸出匹配內(nèi)容的位置索引match用法執(zhí)行結(jié)果如圖2-18所示。圖2-18match用法執(zhí)行結(jié)果2.公用匹配importrecontent='The123456ismyonephonenumber.'result=re.match(r'^The.*',content)print(result)print(result.group())#輸出匹配內(nèi)容print(result.span())#輸出匹配內(nèi)容的位置索引公用匹配用法如圖2-19所示。圖2-19公用匹配用法3.search()方法與match()方法不同,search()方法不需要從頭部開始匹配,代碼如下:importrecontent='OtherThe123456ismyonephonenumber.'result=re.search('The.*?(\d+).*?number.',content)print(result.group())4.findall()方法match()方法和search()方法都是返回匹配到的第一個內(nèi)容就結(jié)束匹配,findall()方法是返回全部符合匹配規(guī)則的內(nèi)容,返回的是一個列表,代碼如下:importretext='pyypppyyyypppp'pattern='py'formatchinre.findall(pattern,text):print('Found{!r}'.format(match))5.sub()方法去除或替換匹配的字符。假如寫sub('\d+','-'),則把匹配的內(nèi)容替換成'-',例子如下:importrecontent='54abc59de335f7778888g'content=re.sub('\d+','',content)print(content)2.4實戰(zhàn)案例:百度新聞的抓取1.獲得URL打開百度,單擊左上角的新聞,百度新聞如圖2-20所示。圖2-20百度新聞2.元素審查在打開的界面按下F12鍵或右擊選擇“檢查”選項,選擇所要抓取的新聞,能夠看到的URL地址為:/,百度新聞域名如圖2-21所示。圖2-21百度新聞域名3.導入模塊導入urllib和re兩個模塊,代碼如下importurllib.requestimportre4.請求http頁面,響應狀態(tài)首先確認URL地址后向網(wǎng)站發(fā)送請求,查看響應狀態(tài)碼如圖2-22所示。importrequestsurl=""data=requests.get(url)print(data)requests.get發(fā)送地址,嘗試獲得URL地址的響應狀態(tài)后輸出響應狀態(tài)碼,返回的值為200,該類型狀態(tài)碼表示動作被成功接收、理解和接受。圖2-22查看響應狀態(tài)碼5.抓取百度新聞在進行模塊與庫的添加時,要注意Python庫及模塊是否已存在,模塊分別是re、urllib.request及datetime。6.尋找數(shù)據(jù)特征打開百度新聞,網(wǎng)址URL為/,打開網(wǎng)頁,按住F12鍵顯示開發(fā)者工具,瀏覽器開發(fā)者工具如圖2-23所示。圖2-23瀏覽器開發(fā)者工具7.查看HTML信息需要抓取的是這個頁面每一條新聞的標題,右擊一條新聞的標題,選擇“查看”選項,出現(xiàn)圖2-24所示的窗口,則圖片中紅框的位置便是那一條新聞標題在HTML中的結(jié)構(gòu)、位置和表現(xiàn)。8.分析網(wǎng)頁源代碼從上一步驟中,經(jīng)由對網(wǎng)頁的源代碼來進行分析,小標題都位于<strong><a>的標簽下面,這時候就可以使用正則的惰性匹配(.*?)來進行對標題的匹配,抓取標題的正則寫法如圖2-25所示。▲圖2-24查看網(wǎng)頁新聞鏈接圖2-25抓取標題的正則寫法9.準備抓取數(shù)據(jù)在把準備工作完成后,開始抓取頁面中的數(shù)據(jù),整體代碼展示如圖2-26所示。10.抓取結(jié)果展示如圖2-27所示。▲圖2-26整體代碼展示圖2-27抓取結(jié)果展示11.設置時間點在圖2-27中能夠看到抓取的內(nèi)容,在最后一行顯示著當前系統(tǒng)的時間,在實際環(huán)境中進行抓取的內(nèi)容可能不止圖2-27中的這一小部分,而數(shù)據(jù)內(nèi)容過多會導致在處理數(shù)據(jù)時遇到一些問題,所以需要(或可以)在代碼中添加一個時間戳。代碼如下:#使用到先前所添加的一個模塊importdatetime在代碼的最后一行添加如下代碼,這樣在每次抓取完后,當前的系統(tǒng)時間會自動標記在后方。print(datetine.datetime.now())2.5本章習題一、單選題1.Python是一門()語言。A.解釋B.編譯2.以下選項中,Python占位符和替換內(nèi)容不對應的是()。A.%d整數(shù)B.%f浮點數(shù)C.%s字符串D.%x復數(shù)3.常規(guī)的Python格式化輸出不包括()。A.[]%B..format()C.%s4.Pythonlist本質(zhì)上是一種()數(shù)據(jù)結(jié)構(gòu)。A.列表B.線性表C.棧D.隊列5.list和tuple數(shù)據(jù)結(jié)構(gòu)最大的區(qū)別在于()。A.list可以索引元素,tuple不可以B.tuple可以索引元素,list不可以C.list數(shù)據(jù)是不可變的,tuple是可變的D.list數(shù)據(jù)是可變的,tuple是不可變的6.以下選項中,()不屬于Python數(shù)據(jù)采集相關(guān)的庫。A.urllibB.requestsC.lxmlD.openpyxl7.以下選項中,Python機器學習領(lǐng)域的第三方庫是()。A.scipyB.PyTorchC.PyQt5D.requests8.以下選項中,不是Python關(guān)鍵字的是()。A.doB.returnC.exceptD.while二、判斷題1.在函數(shù)內(nèi)部沒有任何聲明的情況下直接為某個變量賦值,這個變量一定是函數(shù)內(nèi)部的局部變量。()2.定義類時如果實現(xiàn)了_contains_()方法,該類對象即可支持成員測試運算in。()3.定義類時如果實現(xiàn)了_len_()方法,該類對象即可支持內(nèi)置函數(shù)len()。()4.定義類時如果實現(xiàn)了_eq_()方法,該類對象即可支持運算符==。()5.Python常用的數(shù)據(jù)處理庫包括numpy、pandas和PIL。()6.定義類時如果實現(xiàn)了_pow_()方法,該類對象即可支持運算符**。()第3章原生態(tài)網(wǎng)絡爬蟲開發(fā)本章學習目標·掌握Python的requests的使用。·了解正則表達式。·學會正確使用正則表達式。·掌握Python對Excel文件的讀寫。本章先向讀者介紹requests庫的語法與使用,再介紹正則表達式,最后介紹使用Python進行Excel文件的讀寫。3.1requests庫詳解3.1.1requests語法1.安裝requests包pipinstallrequests2.GET請求基本GET請求,代碼如下:importrequestsr=requests.get('/get')print(r.text)帶參數(shù)GET請求,代碼如下:importrequestsr=requests.get('/get?name=williams_z&age=21')param={'name':'williams_z','age':21}#注意要用字典形式r=requests.get('/get',params=param)#加參數(shù)用params函數(shù)print(r.text)假如想請求JSON文件,可利用JSON()方法解析,以文字為基礎且易于讓人閱讀,同時也方便機器進行解析和生成,代碼如下:importrequestsimportjsonr=requests.get('/get')print(r.json())獲得二進制數(shù)據(jù),主要用以解析圖片和視頻等,代碼如下:importrequestsr=requests.get('/get')print(r.content)保存二進制數(shù)據(jù),代碼如下:importrequestsr=requests.get('/favicon.ico')withopen('favicon.ico','wb')asf:f.write(r.content)f.close()#wb:以二進制格式打開一個文件只用于寫入#w:即為write#f:即file(文件)添加headers,代碼如下:importrequestsheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/93.0.4577.82Safari/537.36Edg/93.0.961.52'}r=requests.get('/explore',headers=headers)print(r.text)3.高級操作文件上傳,代碼如下:importrequestsfile={'file':open('favicon.ico','rb')}r=requests.post('/post',files=files)print(r.text)獲得Cookie,代碼如下:importrequestsr=requests.get('')print(r.cookies)forkey,valueinr.cookies.items():print(key+'='+value)證書驗證,代碼如下:importrequestsfromrequests.packagesimporturllib3urllib3.disable_warnings()#這兩句用以消除證書未驗證系統(tǒng)彈出的警告r=requests.get('',verify=False)print(r.status_code)代理設置,代碼如下:importrequestsproxies={'http':':9743','http':':9744',}r=requests.get('',proxies=proxies)print(r.status_code)socks代理,需要先安裝requests[socks]模塊,代碼如下:pipinstallrequests[socks]proxies={'http':'socks5://:9742'}認證設置,代碼如下:importrequestsr=requests.get('4:9001',auth=('user','123'))print(r.status_code)3.1.2requests庫的使用1.cookies的用處關(guān)于需要登錄的網(wǎng)站該如何抓取呢?例如知乎網(wǎng)站,需要登錄才能進入知乎網(wǎng),有時候又會發(fā)現(xiàn),由于之前登錄過,再次登錄的時候便不需要輸入密碼,這就涉及了cookies,在網(wǎng)站開發(fā)時或多或少一定會用到,以知乎網(wǎng)為例,當提問、評論、點贊的時候,后臺程序要獲得的用戶信息,下次登錄時不需要用戶名和密碼即可自動登錄等都和cookies有關(guān)系。2.什么是cookiescookie可以翻譯為“曲奇、小餅干”,cookie在網(wǎng)絡系統(tǒng)中幾乎無處不在,當瀏覽以前訪問過的網(wǎng)站時,網(wǎng)頁中可能會出現(xiàn)“你好XXX”,這會讓人感覺很親切,就如同吃了一個小甜品一樣。這其實是經(jīng)由訪問主機中的一個文件來實現(xiàn)的,這個文件便是cookie。在因特網(wǎng)中,cookie實際上是指少量信息,是由Web服務器創(chuàng)建的,把信息存儲在用戶計算機上的文件。一般網(wǎng)絡用戶習慣用其復數(shù)形式cookies,指某些網(wǎng)站為甄別用戶身份、進行會話跟蹤而存儲在用戶本地終端上的數(shù)據(jù),而這些數(shù)據(jù)通常會經(jīng)由加密處理。3.網(wǎng)絡爬蟲如何利用cookies能夠經(jīng)由Chrome開發(fā)者工具直接獲得登錄時的cookies信息,在網(wǎng)絡爬蟲中的請求頭中攜帶cookies信息,從而直接抓取需要登錄的網(wǎng)站,cookie的值如圖3-1所示。圖3-1cookie的值經(jīng)由以上代碼運行后,能夠成功抓取網(wǎng)頁信息,代碼如下:importrequestsheaders={'cookie':'PHPSESSID=68q6d1mi0sr4ecbcpv7ptu9gh0','user-agent':'Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36(KHTML,likeGecko)UbuntuChromium/66.0.3359.139Chrome/66.0.3359.139Safari/537.36'}r=requests.get('',headers=headers)print(r.text)4.會話對象有時候不僅僅抓取網(wǎng)站的一個頁面,而是抓取多個頁面,這就需要發(fā)送多個POST和GET請求,由于http是無狀態(tài)協(xié)議,前后幾次的請求是互不相關(guān)的。舉個例子:前一個requests請求攜帶cookies信息,成功登錄網(wǎng)站,下一個requests請求要抓取另一個新的頁面,還是要攜帶cookies信息的,requests為提供Sessiond對象來維持一個會話。requests請求例子代碼如下:importrequestsrequests.get('/cookies/set/number/123456')r=requests.get('/cookies')print(r.text)requests請求例子如圖所示。圖3-2requests請求例子請求測試網(wǎng)站時設置cookies值再次請求,從而獲得cookies值時返回空值,說明服務器沒反應,兩次請求是一個對象發(fā)起的,事實上兩個請求都是計算機上的同一個程序發(fā)起的,再次驗證http是無狀態(tài)協(xié)議。代碼如下:importrequestss=requests.Session()s.get('/cookies/set/number/123456')r=s.get('/cookies')print(r.text)session請求如圖3-3所示。5.身份認證身份認證也稱為“身份驗證”或“身份鑒別”,是指在計算機及計算機網(wǎng)絡系統(tǒng)中確認操作者身份的過程,進而確定該用戶是不是具備對某種資源的訪問和使用權(quán)限,進而使計算機和網(wǎng)絡系統(tǒng)的訪問策略變得可靠、有效,制止攻擊者充作合法用戶取得資源的訪問權(quán)限,保證系統(tǒng)和數(shù)據(jù)的安全,以及授權(quán)訪問者的合法利益。圖3-3session請求有些網(wǎng)站資源需要輸入身份驗證信息才能訪問,許多要求身份認證的Web服務都接受HTTP-Basic-Auth,這是最簡短易懂的一種身份認證,并且requests對這種認證方式的支持是直接開箱便可用,能夠經(jīng)由下面這種簡短易懂的方式實現(xiàn),代碼如下:importrequestsr=requests.get('/user',auth=('myacconut','mypassword'))print(r.status_code)r=requests.get('/user',auth=('123','321'))print(r.status_code)這里經(jīng)由github的用戶身份驗證API,進行測試賬號、密碼,驗證成功返回狀態(tài)碼200,證明沒有問題。假如隨意輸入一個不存在的賬號和密碼,返回的狀態(tài)碼為401錯誤,其實是身份驗證失敗。6.SSL證
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保安證考試個人特質(zhì)題及答案
- 2024-2025學年福建省廈門市重點中學高三下期第一次月考試題含解析
- 重慶市第四十二中學2024-2025學年高三下學期期中測試英語試題含解析
- 復習資料保安證試題及答案
- 克拉瑪依職業(yè)技術(shù)學院《酒店禮儀實訓》2023-2024學年第二學期期末試卷
- 突發(fā)事件處理流程試題及答案
- 2025年保安證考試內(nèi)容概述試題及答案
- 攀枝花學院《紡織服裝進出口貿(mào)易》2023-2024學年第二學期期末試卷
- 衡水學院《有限元法及應用》2023-2024學年第二學期期末試卷
- 知識鞏固的保安證試題及答案
- 系統(tǒng)思維解決問題(-95張)課件
- 監(jiān)控室值班記錄表免費
- CJ-T236-2022 城市軌道交通站臺屏蔽門-高清最新版
- 《疼痛的藥物治療》PPT課件(PPT 67頁)
- DB22∕T 2948-2018 天然、半天然草地牛羊混合放牧技術(shù)規(guī)程
- 煉油與化工企業(yè)電氣管理制度
- 土方開挖作業(yè)規(guī)范
- (高清版)外墻外保溫工程技術(shù)標準JGJ144-2019
- 機電控制與可編程序控制器課程設計報告
- 森林防火主題教育班會PPT
- 國家開放大學《管理英語4》章節(jié)測試參考答案
評論
0/150
提交評論