版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Python網絡爬蟲快速入門第1章爬蟲基礎和開發(fā)環(huán)境的配置第2章網頁前端基礎第3章網絡庫urllib第4章網絡庫requests第5章正則表達式第6章XPath和lxml解析庫第7章解析庫BeautifulSoup4第8章多線程爬蟲第9章文件存儲第10章數據庫存儲第1章
爬蟲基礎和開發(fā)環(huán)境配置目錄頁01爬蟲產生的背景和概念02爬蟲的用途和分類03爬蟲實現原理04爬蟲爬取網頁信息的主要流程05防爬蟲應對策略06爬蟲數據采集與挖掘的合規(guī)性07開發(fā)環(huán)境的配置思考?搜索引擎是如何查找網站的?
搜索引擎使用了網絡爬蟲不停地從互聯(lián)網抓取網站數據,并將網站鏡像保存在本地,這才能為大眾提供信息檢索的功能。結論爬蟲產生背景目前的互聯(lián)網已經邁入大數據時代,通過對海量的數據進行分析,能夠產生極大的商業(yè)價值。爬蟲產生背景數據采集數據分析應用反饋爬蟲產生背景思考如果我們需要大量數據,有哪些獲取數據的方式呢?爬蟲產生背景政府/機構公開的數據納斯達克爬蟲產生背景企業(yè)產生的數據爬蟲產生背景數據平臺購買的數據數據堂貴陽大數據交易所爬蟲產生背景爬取的網絡數據爬蟲產生背景無論是搜索引擎,還是個人或單位獲取目標數據,都需要從公開網站上爬取大量數據,在此需求下,爬蟲技術應運而生,并迅速發(fā)展成為一門成熟的技術。結論思考:什么是網絡爬蟲?
什么是爬蟲如果說網絡像一張網,那么爬蟲就是網上的一只小蟲子,在網上爬行的過程中遇到了數據,就把它抓取下來。什么是爬蟲網絡爬蟲,又稱為網頁蜘蛛、網絡機器人,是一種按照一定的規(guī)則,自動請求萬維網網站并提取網絡數據的程序或腳本。結論什么是爬蟲這里的數據是指互聯(lián)網上公開的并且可以訪問到的網頁信息,而不是網站的后臺信息(沒有權限訪問),更不是用戶注冊的信息(非公開的)。爬蟲的用途思考爬蟲具體能做些什么呢?爬蟲的用途用途通用爬蟲和聚焦爬蟲按照使用場景進行分類:通用爬蟲聚焦爬蟲又稱主題網絡爬蟲,是指選擇性地爬行那些與預先定義好的主題相關的頁面的網絡爬蟲。又稱全網爬蟲,將互聯(lián)網上的網頁下載到本地,形成一個互聯(lián)網內容的鏡像備份。累積式和增量式爬蟲按照爬取形式進行分類:累積式爬蟲增量式爬蟲在具有一定量規(guī)模的網絡頁面集合的基礎上,采用更新數據的方式選取已有集合中的過時網頁進行抓取,以保證所抓取到的數據與真實網絡數據足夠接近。累積式爬蟲是指從某一個時間點開始,通過遍歷的方式抓取系統(tǒng)所能允許存儲和處理的所有網頁。表層爬蟲和深層爬蟲按照爬取數據的存在方式進行分類:表層爬蟲深層爬蟲爬取深層網頁的爬蟲就叫做深層爬蟲。深層網頁是那些大部分內容不能通過靜態(tài)鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關鍵詞才能獲得的Web頁面。爬取表層網頁的爬蟲叫做表層爬蟲。表層網頁是指傳統(tǒng)搜索引擎可以索引的頁面,以超鏈接可以到達的靜態(tài)網頁為主構成的Web頁面。通用爬蟲工作原理通用爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足系統(tǒng)的一定停止條件。聚焦爬蟲工作原理聚焦爬蟲需要根據一定的網頁分析算法過濾與主題無關的鏈接,保留有用的鏈接,并將其放入等待抓取的URL隊列。然后,它將根據一定的搜索策略從隊列中選擇下一步要抓取的網頁URL,并重復上述過程,直到達到系統(tǒng)的某一條件時停止。爬蟲抓取網頁的詳細流程爬蟲抓取網頁詳細流程反爬蟲技術很多網絡爬蟲對網頁的爬取能力很差,現在的網站會采取一些反爬蟲措施來阻止爬蟲的不當爬取行為。防爬蟲的應對策略對于采取了防爬蟲措施的網站,爬蟲程序需要采取相應的應對策略,才能成功地爬取到網站上的數據。防爬蟲的應對策略偽裝User-agentUser-agent表示用戶代理,是HTTP協(xié)議中的一個字段,其作用是描述發(fā)出HTTP請求的終端信息。每個正規(guī)的爬蟲都有固定的User-agent,只要將這個字段設為知名的用戶代理,就能夠成功偽裝。防爬蟲的應對策略使用代理IP代理IP就是介于用戶和網站之間的第三者,即用戶先將請求發(fā)送給代理IP,之后代理IP再發(fā)送到服務器。服務器會將代理IP視為爬蟲的IP,同時用多個代理IP,可以降低單個IP地址的訪問量,極有可能逃過一劫。防爬蟲的應對策略降低訪問頻率如果沒有找到既免費又穩(wěn)定的代理IP,則可以降低訪問網站的頻率,防止對方從訪問量上認出爬蟲的身份,不過爬取效率會差很多。為了彌補這個缺點,我們可以基于這個思想適時調整具體的操作。例如,每抓取一個頁面就休息若干秒,或者限制每天抓取的頁面數量。爬蟲數據采集與挖掘的合規(guī)性大數據技術與應用的合規(guī)性網絡爬蟲能夠以什么方式爬取什么樣的數據什么樣的數據能夠本地存儲什么樣的數據能夠共享或出售給他人開發(fā)爬蟲前建議閱讀相關規(guī)范和法律條款,設計爬蟲方案時要對合規(guī)性及采集性能進行適當的平衡。第2章
網頁前端基礎目錄頁01URL(統(tǒng)一資源定位符)02超文本03HTTP與HTTPS04HTTP網絡請求原理05Robots協(xié)議06網頁基礎07Cookie與Session瀏覽網頁過程思考?在瀏覽器的地址欄輸入網址“”,按下回車后瀏覽器中顯示了百度的首頁。那么,這段網絡訪問過程中到底發(fā)生了什么?瀏覽網頁過程瀏覽網頁過程的示意圖如下所示。Html
+
js
+
css
+
jpg瀏覽器渲染出來的頁面和爬蟲請求的頁面并不一樣當所有的文件都下載成功后,瀏覽器會根據HTML語法結構,將網頁完整的顯示出來。分析瀏覽器顯示完整網頁的過程統(tǒng)一資源定位符URLURL是互聯(lián)網上標準資源的地址,它包含了文件的位置以及瀏覽器處理方式等信息。統(tǒng)一資源定位符URLURL地址由協(xié)議頭、服務器地址、文件路徑三部分組成。計算機域名系統(tǒng)DNSDNS
是計算機域名系統(tǒng)(DomainNameSystem或DomainNameService)的縮寫,由解析器和域名服務器組成。HTTP網絡請求原理HTTP是一套計算機通過網絡進行通信的規(guī)則,它由兩部分組成:客戶端請求消息和服務器端響應消息??蛻舳薍TTP請求格式客戶端發(fā)送一個HTTP請求到服務器的請求消息,由請求行、請求頭部、空行、以及請求數據這四個部分組成。GET/HTTP/1.1Host:Connection:keep-aliveUpgrade-Insecure-Requests:1User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/54.0.2840.99Safari/537.36Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Referer:/Accept-Encoding:gzip,deflate,sdch,brAccept-Language:zh-CN,zh;q=0.8,en;q=0.6Cookie:BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1;BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B;PSTM=1470329258;MCITY=-343%3A340%3A;H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554;BD_UPN=12314753;sug=3;sugstore=0;ORIGIN=0;bdime=0;H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g;BDSVRTM=0客戶端請求消息示例客戶端HTTP請求格式不同的HTTP版本下使用的請求方法也不同。HTTP版本描述HTTP0.9只有基本的文本GET功能HTTP1.0定義了三種請求方法:GET,POST和HEAD方法HTTP1.1在1.0基礎上進行更新,新增了五種請求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。HTTP2.0所有首部鍵必須全部小寫,而且請求行要獨立為:method、:scheme、:host、:path這些鍵值對??蛻舳薍TTP請求格式最常用的請求方法是GET和POST,兩者的區(qū)別在于:GET請求--參數都顯示在URL上,服務器根據該請求所包含URL中的參數來產生響應內容。
由于請求參數都暴露在外,所以安全性不高。POST請求--參數在請求體當中,消息長度沒有限制而且采取隱式發(fā)送,通常用來向HTTP服務器提交量比較大的數據。
POST請求的參數不在URL中,而在請求體中,所以安全性也高,使用場合也比GET多??蛻舳薍TTP請求格式Host(主機和端口號)指定被請求資源的Internet主機和端口號,對應網址URL中的Web名稱和端口號,通常屬于URL的Host部分。Connection(連接類型)表示客戶端與服務器的連接類型??蛻舳薍TTP請求格式Upgrade-Insecure-Requests(升級為HTTPS請求)表示升級不安全的請求,意思是會在加載HTTP資源時自動替換成HTTPS請求,讓瀏覽器不再顯示HTTPS頁面中的HTTP請求警報。User-Agent(瀏覽器名稱)標識客戶端身份的名稱,通常頁面會根據不同的User-Agent信息自動做出適配,甚至返回不同的響應內容??蛻舳薍TTP請求格式Accept(傳輸文件類型)指瀏覽器或其他客戶端可以接受的MIME(MultipurposeInternetMailExtensions,多用途互聯(lián)網郵件擴展)文件類型,服務器可以根據它判斷并返回適當的文件格式。Referer(頁面跳轉來源)表明產生請求的網頁來自于哪個URL,用戶是從該Referer頁面訪問到當前請求的頁面??蛻舳薍TTP請求格式Accept-Encoding(文件編解碼格式)指出瀏覽器可以接受的編碼方式。編碼方式不同于文件格式,它的作用是壓縮文件并加速文件傳遞速度。Accept-Language(語言種類)指出瀏覽器可以接受的語言種類,如en或en-us指英語,zh或者zh-cn指中文,當服務器能夠提供一種以上的語言版本時要用到??蛻舳薍TTP請求格式Accept-Charset(字符編碼)指出瀏覽器可以接受的字符編碼。Cookie(Cookie)瀏覽器用這個屬性向服務器發(fā)送Cookie。Cookie是在瀏覽器中寄存的小型數據體,它可以記載和服務器相關的用戶信息,也可以用來實現模擬登陸。客戶端HTTP請求格式Content-Type(POST數據類型)指定POST請求里用來表示的內容類型??蛻舳薍TTP請求格式服務端HTTP響應格式HTTP響應由四個部分組成,分別是:狀態(tài)行、響應報頭、空行、以及響應正文。HTTP/1.1200OKServer:TengineConnection:keep-aliveDate:Wed,30Nov201607:58:21GMTCache-Control:no-cacheContent-Type:text/html;charset=UTF-8Keep-Alive:timeout=20Vary:Accept-EncodingPragma:no-cacheX-NWS-LOG-UUID:bd27210a-24e5-4740-8f6c-25dbafa9c395Content-Length:180945<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"....服務端響應消息示例服務端HTTP響應格式響應狀態(tài)代碼由三位數字組成,其中第1位數字定義了響應的類別,有五種可能取值。服務端HTTP響應格式響應碼描述100~199表示服務器成功接收部分請求,要求客戶端繼續(xù)提交其余請求才能完成整個處理過程200~299表示服務器成功接收請求并已完成整個處理過程。常用狀態(tài)碼為200300~399為完成請求,客戶需進一步細化請求400~499客戶端的請求有錯誤,常用狀態(tài)碼包括404和403500~599服務器端出現錯誤,常用狀態(tài)碼為500常用的響應報頭和取值這個報頭值告訴客戶端,服務端不希望客戶端緩存資源,在下次請求資源時,必須要重新請求服務器,不能從緩存副本中獲取資源。Cache-Control:must-revalidate,no-cache,private服務端HTTP響應格式常用的響應報頭和取值該報頭回應客戶端的Connection:keep-alive,告訴客戶端服務器的TCP連接也是一個長連接,客戶端可以繼續(xù)使用這個TCP連接發(fā)送HTTP請求。Connection:keep-alive服務端HTTP響應格式常用的響應報頭和取值該報頭的取值告訴客戶端,服務端發(fā)送的資源是采用gzip編碼的,客戶端看到這個信息后,應該采用gzip對資源進行解碼。Content-Encoding:gzip服務端HTTP響應格式常用的響應報頭和取值這個報頭值告訴客戶端,資源文件的類型,還有字符編碼??蛻舳诵枰褂肬TF-8格式對資源進行解碼,然后對資源進行HTML解析。通常我們會看到有些網站出現亂碼,往往就是服務器端沒有返回正確的編碼。Content-Type:text/html;charset=UTF-8服務端HTTP響應格式常用的響應報頭和取值該報頭表示服務端發(fā)送資源時的服務器時間,GMT是格林尼治所在地的標準時間。HTTP協(xié)議中發(fā)送的時間都是GMT的,這主要是解決在互聯(lián)網上,不同時區(qū)在相互請求資源時的時間混亂問題。Date:Sun,21Sep201606:18:21GMT服務端HTTP響應格式常用的響應報頭和取值這個響應報頭也是跟緩存有關的,告訴客戶端在這個時間前,可以直接訪問緩存副本。Expires:Sun,1Jan200001:00:00GMT服務端HTTP響應格式常用的響應報頭和取值這個報頭的含義與Cache-Control等同。Pragma:no-cache這個報頭表示服務器對應的版本,僅用于告訴客戶端服務器的信息。Server:Tengine/1.4.6服務端HTTP響應格式常用的響應報頭和取值該響應報頭告訴客戶端,服務器發(fā)送資源的方式是分塊發(fā)送的。Transfer-Encoding:chunked服務端HTTP響應格式常用的響應報頭和取值該報頭告訴緩存服務器,緩存壓縮文件和非壓縮文件兩個版本。如今這個報頭的用處并不大,因為現在的瀏覽器都是支持壓縮的。Vary:Accept-Encoding服務端HTTP響應格式HTML標簽Html標簽很多,從閉合的角度可以分為閉合標簽與空標簽。Html標簽還可以按照在文檔中的位置特性進行分類,主要分為塊級標簽、行內(內嵌)標簽和行內-塊級(內嵌-塊級)標簽塊級標簽是獨占一行的標簽,并且標簽間元素能隨時設置寬度、高度、頂部和底部邊距等。行內標簽的元素和其他元素在同一行上,而元素的寬度、高度、頂部和底部邊距不可設置。多個行內-塊級標簽的元素可以顯示在同一行,并且可以設置元素的寬度、高度、頂部和底部邊距可以隨時設置。HTML整體結構HTML文檔都具有一個基本的整體結構,包括頭部(Head)和主體(Body)兩大部分,其中頭部描述瀏覽器所需的信息,主體包含網頁所要展示的具體內容。
CSS層疊樣式表單,CascadingStyleSheet定義如何顯示html元素。即使是相同的html文檔,應用的CSS不同,從瀏覽器看到的頁面外觀也會不同。內聯(lián)樣式內部樣式表
在頭部通過
標簽定義內部樣式表外部引用
當樣式需要被很多頁面引用時,可以使用獨立的外部CSS文件,這樣可以簡單頁面模式的設計。與爬蟲程序設計相關常用標簽(1)<meta>最重要的是字符編碼,它使用<meta>的charset屬性聲明Web文檔的字符編碼。(2)<p><p>標簽定義段落??梢詫⒁@示的文章內容放在<p>與</p>標簽之間。該標簽會自動在段落前后添加一些空白,可以使用CSS來進行調整。通常在Web頁面中正文部分的各個段落都是通過該標簽來表示。(3)<div><div>用來定義文檔中的分區(qū)或節(jié),把文檔分割成為獨立的部分,經常用于網頁布局。該標簽通常會使用id或class屬性設計額外的樣式,其中,class用于元素組,而id用于標識單獨的唯一的元素。(4)<table><table>定義頁面的表格,在很多頁面中數據以表格形式展現,因此也是爬蟲程序需要處理的重要標簽之一。html頁面中的簡單表格由table元素以及一個或多個tr、th、td元素組成。其中,tr元素定義表格行,td元素定義表格單元,th元素定義表格標題列;同時,th默認加粗并居中顯示。<table>的常用屬性為表格邊框屬性border,當使用border="1"設置邊框時,會在所有表格單元以及表格上嵌套邊框。(5)<a><a>標簽定義超鏈接,用于從一張頁面鏈接到另一張頁面,其最重要的屬性是href,它指示鏈接的目標。爬蟲在采集到一個Web頁面之后,就需要在頁面中尋找該標簽,并提取出超鏈接作為新的爬行任務。(6)<form><form>可以把用戶輸入的數據傳送到服務器端,這樣服務器端程序就可以處理表單傳過來的數據。(7)<base>為了簡化包含相對路徑的超鏈接的轉換過程,HTML語言提供了<base>標簽,用來指定頁面中所有超鏈接的基準路徑。例如,如果在p.html中有如下的<base>標簽,<base>表示從http://www.a.b.c/aaa/images/p2.gif獲得圖片文件。(8)<script><script>用于在html頁面內插入腳本。其type屬性為必選的屬性,用來指示腳本的MIME類型。第3章
網絡庫urllib目錄頁01發(fā)送請求與獲得響應02異常處理03解析鏈接04解析robots.txt文件什么是urllib庫urllib庫是Python內置的HTTP請求庫,它可以看做是處理URL的組件集合。模塊名稱描述urllib.request請求模塊urllib.error異常處理模塊urllib.parseurl解析模塊urllib.robotparserrobots.txt解析模塊urlopen方法urlopen方法可以接收多個參數,定義格式如下:urllib.request.urlopen(url,
data=None,
[timeout,
]*,
cafile=None,
capath=None,
cadefault=False,
context=None)參數如下:url--表示目標資源在網站中的位置。data--用來指明向服務器發(fā)送請求的額外信息。timeout--該參數用于設置超時時間,單位是秒。
context--實現SSL加密傳輸,該參數很少使用。使用HTTPResponse對象使用urlopen方法發(fā)送HTTP請求后,服務器返回的響應內容封裝在一個HTTPResponse類型的對象中。importurllib.requestresponse=urllib.request.urlopen('')print(type(response))例如:<class'http.client.HTTPResponse'>HTTPResponse類屬于http.client模塊,該類提供了獲取URL、狀態(tài)碼、響應內容等一系列方法。geturl()--用于獲取響應內容的URL,該方法可以驗證發(fā)送的HTTP請求是否被重新調配。info()--返回頁面的元信息。getcode()--返回HTTP請求的響應狀態(tài)碼。使用HTTPResponse對象示例importurllib.requestresponse=urllib.request.urlopen('')#獲取響應信息對應的URLprint(response.geturl())#獲取響應碼print(response.getcode())#獲取頁面的元信息print(())/200Server:nginxContent-Type:text/html;charset=utf-8X-Frame-Options:SAMEORIGINX-Clacks-Overhead:GNUTerryPratchettContent-Length:48729Accept-Ranges:bytesDate:Wed,23Aug201703:29:51GMTVia:1.1varnishAge:2915Connection:closeX-Served-By:cache-nrt6129-NRTX-Cache:HITX-Cache-Hits:29X-Timer:S1503458991.290683,VS0,VE0Vary:CookieStrict-Transport-Security:max-age=63072000;includeSubDomains示例結果使用HTTPResponse對象分析urlopen方法urlopen方法可以接收多個參數,定義格式如下:urllib.request.urlopen(url,
data=None,
[timeout,
]*,
cafile=None,
capath=None,
cadefault=False,
context=None)參數如下:url--表示目標資源在網站中的位置。data--用來指明向服務器發(fā)送請求的額外信息。
timeout--該參數用于設置超時時間,單位是秒。
context--實現SSL加密傳輸,該參數很少使用。超時設置假設我們要爬取1000個網站,如果其中有100個網站需要等待30s才能返回數據,則要返回所有的數據,至少需要等待3000秒。網頁網頁網頁網頁...30s...下個網頁當向服務器發(fā)送HTTP請求時,通常很快會得到響應,但由于某些原因,服務器端可能遲遲沒有響應,這些HTTP鏈接就會一直等待,直到超過預設的等待時間,這個等待時間就是請求超時。請求超時超時設置我們可以為HTTP請求設置超時時間,一旦超過這個時間,服務器還沒有返回響應內容,那么就會拋出一個超時異常,這個異常需要使用try語句來捕獲。try:url='57:8080'#timeout設置超時的時間
file=urllib.request.urlopen(url,timeout=1)
result=file.read() print(result)exceptExceptionaserror: print(error)<urlopenerrortimedout>分析urlopen方法urlopen方法可以接收多個參數,定義格式如下:urllib.request.urlopen(url,
data=None,
[timeout,
]*,
cafile=None,
capath=None,
cadefault=False,
context=None)參數如下:url--表示目標資源在網站中的位置。
data--用來指明向服務器發(fā)送請求的額外信息。timeout--該參數用于設置超時時間,單位是秒。
context--實現SSL加密傳輸,該參數很少使用。URL編碼轉換當傳遞的URL中包含中文或者其它特殊字符(如空格等)時,需要使用urllib.parse庫中的urlencode方法將URL進行編碼data={
‘a’:‘計算機’,
‘b’:‘程序員’}a=%E8%AE%A1%E7%AE%97%E6%9C%BA&b=%E7%A8%8B%E5%BA%8F%E5%91%98轉碼它可以將“key:value”這樣的鍵值對轉換成“key=value”這樣的字符串。URL編碼轉換解碼使用的是url.parse庫的unquote方法。urljoin用法完成鏈接的合并,第二個參數如果不是完整的url,那么會自動加在第一個參數后,并自動添加“/”;如果第二個參數是完整URL,那么返回第二個URL構造Request對象如果希望對請求執(zhí)行復雜操作,則需要創(chuàng)建一個Request對象來作為urlopen方法的參數。#將url作為Request方法的參數,構造并返回一個Request對象request=urllib.request.Request('')#將Request對象作為urlopen方法的參數,發(fā)送給服務器并接收響應response=urllib.request.urlopen(request)在使用urllib庫發(fā)送URL的時候,我們推薦大家使用構造Request對象的方式。構造Request對象在構建請求時,除了必須設置的url參數外,還可以加入很多內容,例如下面的參數:參數如下:data
--默認為空,該參數表示提交表單數據,同時HTTP請求方法將從默認的GET方式改為POST方式。
headers--默認為空,該參數是一個字典類型,包含了需要發(fā)送的HTTP報頭的鍵值對。添加特定Headers—請求偽裝如果不是從瀏覽器發(fā)出的請求,我們是不能獲得響應內容的。針對這種情況,我們需要將爬蟲程序發(fā)出的請求偽裝成一個從瀏覽器發(fā)出的請求。偽裝或......添加特定Headers—請求偽裝偽裝瀏覽器需要自定義請求報頭,也就是在發(fā)送Request請求時,加入特定的Headers。user_agent={"User-Agent":"Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)"}request=urllib.request.Request(url,headers=user_agent)request.add_header("Connection","keep-alive")處理GET請求GET請求一般用于向服務器獲取數據,比如說,我們用百度搜索北京大學。處理GET請求此時,如果查看HTTP請求,發(fā)現有個GET請求的格式如下:/s?wd=%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6在這個請求中,“?”后面的字符串就包含了我們要查詢的關鍵字“北京大學”。urlparse()urlunparse()urlsplit()urlunsplit()parse_qs()parse_qsl()quote()unquote()urllib.parse模塊(處理url的標準接口)urllib.request模塊-高級應用BaseHandler類,所有Handler的父類:HTTPDefaultErrorHandlerHTTPRedirectHandlerProxyHandlerHTTPPasswordMgrHTTPCookieProcessorOpenerDirector類利用Handler來構建Opener處理COOKIES聲明一個CookieJar對象,利用HTTPCookieProcessor來構建一個Handler,利用build_opener()方法構建出Opener,執(zhí)行open()函數即可處理COOKIESCOOKIES以文本形式保存,需要把CookieJar換成MozillaCookieJar,MozillaCookieJar是CookieJar子類,可以用來處理Cookies和文件相關事件。另外,LWPCookieJar同樣可以讀取和保存,但格式不同,會保存成(LWP)格式的Cookies文件。處理COOKIES調用load()方法讀取本地的Cookies文件,獲取到了Cookies的內容。然后讀取Cookies之后使用了同樣的方法構建Handler和Opener即可。RobotFileParser類在構造方法中傳入robots.txt鏈接set_url()用來設置robots.txt文件鏈接read()讀取文件并進行分析parse()解析robots.txt文件can_fetch()傳入2個參數,返回是否可抓取這個URLURLError異常和捕獲URLError產生的原因主要有:沒有連接網絡服務器連接失敗找不到指定服務器URLError異常和捕獲HTTPError是URLError的子類,它的對象擁有一個整型的code屬性,表示服務器返回的錯誤代碼。request=urllib.request.Request('http://www.baidu.com/net')try:urllib.request.urlopen(request)excepturllib.error.HTTPErrorase:print(e.code)404上述輸出了404的錯誤碼,其含義是沒有找到這個頁面。第4章
抓取網頁數據requests目錄頁01基本用法02高級應用什么是requests庫requests是基于Python開發(fā)的HTTP庫,與urllib標準庫相比,它不僅使用方便,而且能節(jié)約大量的工作。模塊名稱描述requests.Request表示請求對象,用于準備一個請求發(fā)送到服務器。requests.Response表示響應對象,其中包含服務器對HTTP請求的響應。requests.Session表示請求會話,提供Cookie持久性、連接池和配置。什么是requests庫其中,Request類的對象表示一個請求,它的生命周期針對一個客戶端請求,一旦請求發(fā)送完畢,該請求包含的內容就會被釋放掉。而Session類的對象可以跨越多個頁面,它的生命周期同樣針對的是一個客戶端。requests庫初體驗無須再轉換為URL路徑編碼格式,拼接完整的URL路徑。無須再頻繁地為中文轉換編碼格式。從發(fā)送請求的函數名稱,可以很直觀地判斷發(fā)送到服務器的方式。接下來,我們再從細節(jié)上體會一下requests庫的便捷之處,具體如下:發(fā)送請求requests庫中提供了很多發(fā)送HTTP請求的函數。函數功能說明requests.request()構造一個請求,支撐以下各方法的基礎方法requests.get()獲取HTML網頁的主要方法,對應于HTTP的GET請求方式requests.head()獲取HTML網頁頭信息的方法,對應于HTTP的HEAD請求方式requests.post()向HTML網頁提交POST請求的方法,對應于HTTP的POST請求方式requests.put()向HTML網頁提交PUT請求的方法,對應于HTTP的PUT請求方式requests.patch()向HTML網頁提交局部修改請求,對應于HTTP的PATCH請求方式requests.delete()向HTML網頁提交刪除請求,對應于HTTP的DELETE請求方式發(fā)送請求這些函數都會做兩件事情,一件是構建一個Request類的對象,該對象將被發(fā)送到某個服務器上請求或者查詢一些資源;另一件是一旦得到服務器返回的響應,就會產生一個Response對象,該對象包含了服務器返回的所有信息,也包括原來創(chuàng)建的Request對象。返回響應Response類用于動態(tài)地響應客戶端的請求,控制發(fā)送給用戶的信息,并且將動態(tài)地生成響應,包括狀態(tài)碼、網頁的內容等。屬性說明status_codeHTTP請求的返回狀態(tài),200表示連接成功,404表示失敗textHTTP響應內容的字符串形式,即URL對應的頁面內容encoding從HTTP請求頭中猜測的響應內容編碼方式apparent_encoding從內容中分析出的響應編碼的方式(備選編碼方式)contentHTTP響應內容的二進制形式高級應用處理COOKIE使用同一個會話(session)第5章
正則表達式目錄頁01了解正則表達式02re庫概述03使用正則表達式抓取數據正則表達式正則表達式就是規(guī)定了一組文本模式匹配規(guī)則的符號語言,一條正則表達式也稱為一個模式,使用這些模式可以匹配指定文本中與表達式模式相同的字符串。元字符元字符指在正則表達式中具有特殊含義的專用字符,可以用來規(guī)定其前導字符在目標對象中出現的模式。元字符點字符“.”可匹配包括字母、數字、下劃線、空白符(除換行符\n)等任意的單個字符。點字符“.”元字符脫字符“^”和美元符“$”分別用于匹配行頭和行尾。脫字符“^”和美元符“$”元字符“|”可將多個不同的子表達式進行邏輯連接,可簡單地將“|”理解為邏輯運算符中的“或”運算符,匹配結果為與任意一個子表達式模式相同的字符串。連接符“|”元字符正則表達式中使用一對中括號“[]”標記字符組,字符組的功能是匹配其中的任意一個字符。字符組“[]”元字符連字符“-”一般在字符組中使用,表示一個范圍。連字符“-”元字符元字符“?”表示匹配其前導元素0次或1次。匹配符“?”元字符正則表達式中使用“*”、“+”和“{}”符號來限定其前導元素的重復模式。重復模式元字符正則表達式中使用“()”可以對一組字符串中的某些字符進行分組。子組預定義字符集正則表達式中預定義了一些字符集,使用字符集能以簡潔的方式表示一些由元字符和普通字符表示的匹配規(guī)則。貪婪匹配正則表達式中有兩種匹配方式:貪婪匹配和非貪婪匹配。貪婪匹配在條件滿足的情況下,盡量多地進行匹配。非貪婪匹配在條件滿足的情況下,盡量少地進行匹配。貪婪匹配貪婪匹配方式也稱為匹配優(yōu)先,即在可匹配可不匹配時,優(yōu)先嘗試匹配;非貪婪匹配方式也稱忽略優(yōu)先,即在可匹配可不匹配時,優(yōu)先嘗試忽略。重復匹配中使用的元字符(“?”、“*”、“+”、“{}”)默認為匹配優(yōu)先,但當其與“?”搭配,即以“??”、“*?”、“+?”、“{}?”這些形式出現時,則為忽略優(yōu)先。re模塊Python中的re模塊是正則表達式模塊,該模塊提供了文本匹配查找、文本替換、文本分割等功能。re模塊正則對象的方法大多在re模塊中也有對應的函數實現,因此用戶可通過“正則對象.方法”的方式或“re.函數”的方式使用。預編譯如果需要重復使用一個正則表達式,那么可以使用compile()函數對其進行預編譯,以避免每次編譯正則表達式的開銷。compile(pattern,flags=0)pattern
--表示一個正則表達式。flags--用于指定正則匹配的模式。預編譯參數flags的常用取值如下表所示。使用match()函數進行匹配match()函數檢測目標文本的開始位置是否符合指定模式,若匹配成功返回一個匹配對象,否則返回None。match(pattern,string,flags=0)pattern
--表示要傳入的正則表達式。string--表示待匹配的目標文本。flags--表示使用的匹配模式。使用match()函數進行匹配使用match()函數對指定的字符串進行匹配搜索,示例如下:importredate_two="28March2019"print(re.match(r"\d",date_two))match()函數匹配成功會返回一個Match對象,該對象包括匹配信息span和match,其中span表示匹配對象在目標文本中出現的位置,match表示匹配對象本身的內容。<_sre.SRE_Matchobject;span=(0,1),match='2'>使用search()函數進行匹配大部分情況下,我們需要匹配的是出現在文本任意位置的字符串,這項功能由re模塊中的search()函數實現。若調用search()函數匹配成功會返回一個匹配對象,否則返回None。search(pattern,string,flags=0)匹配對象使用match()函數和search()函數進行正則匹配時,返回的是如下形式的字符串:以上字符串表明返回結果是一個Match對象,其中包含兩項內容span和match,span表示本次獲取的匹配對象在原目標文本中所處的位置,目標文本的下標從0開始;match表示匹配對象的內容。<_sre.SRE_Matchobject;span=(2,4),match='ow' 匹配對象span屬性是一個元組,元組中有兩個元素,第一個元素表示匹配對象在目標文本中的開始位置,第二個元素表示匹配對象在目標文本中的結束位置。<_sre.SRE_Matchobject;span=(2,4),match='ow' 開始位置結束位置匹配對象re模塊中提供了一些與Match對象相關的方法,用于獲取匹配結果中的各項數據。匹配對象當正則表達式中包含子組時,Python解釋器會將每個子組的匹配結果臨時存儲到緩沖區(qū)中。若用戶想獲取子組的匹配結果,可使用Match對象的group()方法。words=re.search("(h)(e)",'helloheooo')print(words.group(1))h匹配對象Match對象還有一個groups()方法,使用該方法可以獲取一個包含所有子組匹配結果的元組。words=re.search("(h)(e)",'helloheooo')print(words.groups())('h','e')匹配對象若正則表達式中不包含子組,則groups()方法返回一個空元組。findall()函數findall()函數可以獲取目標文本中所有與正則表達式匹配的內容,并將所有匹配的內容以列表的形式返回。findall(pattern,string,flags=0)finditer()函數finditer()函數同樣可以獲取目標文本中所有與正則表達式匹配的內容,但該函數會將匹配到的子串以迭代器的形式返回。finditer(pattern,string,flags=0)檢索替換re模塊中提供的sub()、subn()函數用于替換目標文本中的匹配項。sub(pattern,repl,string,count=0,flags=0)subn(pattern,repl,string,count=0,flags=0)count--表示替換的次數,默認值0表示替換所有的匹配項。flags--表示使用的匹配模式。檢索替換sub()與sunb()函數的參數及功能相同,不同的是調用成功后,sub()函數會返回替換后的字符串,subn()函數會返回包含替換結果和次數的元組。words='DistantPlacesandPoems'result_one=re.sub(r'\s','-',words)print(result_one)result_two=re.subn(r'\s','-',words)print(result_two)Distant-places-and-Poems('Distant-places-and-Poems',3)文本分割re模塊中提供的split()函數可使用與正則表達式模式相同的字符串分割指定文本。split(pattern,string,maxsplit=0,flags=0)maxsplit--用于指定分隔的次數,默認值為0,表示匹配指定模式并全部進行分割。flags--表示使用的匹配模式。第6章Xpath和lxml解析庫目錄頁01lxml基礎02Xpath語法03lxml庫的基本使用數據解析技術Python支持一些解析網頁的技術,分別為正則表達式、XPath、BeautifulSoup。針對文本的解析,有正則表達式;針對HTML/XML的解析,有XPath、BeautifulSoup、正則表達式;數據解析技術正則表達式是基于文本的特征來匹配或查找指定的數據,它可以處理任何格式的字符串文檔。數據解析技術XPath和BeautifulSoup基于HTML/XML文檔的層次結構來確定到達指定節(jié)點的路徑,所以它們更適合處理層級比較明顯的數據。<!--Copyright--><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don'tforgetthemeeting!</body></note>什么是XPath我們借用網上一個很形象的比喻,用于區(qū)分正則表達式和XPath。把提取數據比作找建筑。如果使用正則表達式進行查找,則它會告訴你這個建筑本身有哪些特征,以及它的左邊是什么,右邊是什么。這樣的描述限定查找的范圍較大,不易于找到。而XPath會直接告訴你這個建筑位于“中國-陜西-西安-蓮湖區(qū)-建設西路-隆隆隆辦公樓一層”,相比較而言,這種描述更加具體,易于找到。什么是XPathXPath即為XML路徑語言,用于確定XML樹結構中某一部分的位置。XPath技術基于XML的樹結構,能夠在樹結構中遍歷節(jié)點(元素、屬性等)。關于XML技術,可參照/xml/進行完整學習什么是XPathXPath使用路徑表達式選取XML文檔中的節(jié)點或者節(jié)點集,這些路徑表達式代表著從一個節(jié)點到另一個或者一組節(jié)點的順序,并以“/”字符進行分隔。什么是XPathXPath不僅能夠查詢XML文檔,而且能夠查詢HTML文檔。不過,它需要先借用lxml庫技術將HTML文檔轉換為XML文檔樹對象,之后可以使用XPath語法查找此結構中的節(jié)點或元素。什么是lxml庫lxml是以Python語言編寫的庫,主要用于解析和提取HTML或者XML格式的數據,可以利用XPath語法快速地定位特定的元素或節(jié)點。lxml庫中大部分的功能都位于lxml.etree模塊中,導入lxml.etree模塊的常見方式如下:fromlxmlimportetree什么是lxml庫lxml庫的一些相關類如下:類說明Element可以理解為XML的節(jié)點ElementTree可以理解為一個完整的XML文檔樹ElementPath可以理解為XPath,用于搜索和定位節(jié)點什么是lxml庫Element類是XML處理的核心類,它可以理解為XML的節(jié)點,大部分XML節(jié)點的操作都是圍繞著該類進行的。什么是lxml庫關于Element類的相關操作,主要可分為三個部分,分別是節(jié)點操作、節(jié)點屬性的操作、節(jié)點內文本的操作。若要獲取節(jié)點的名稱,則可以通過tag屬性獲取,示例如下:print(root.tag)root什么是lxml庫為了能夠將XML文件解析為樹結構,etree模塊中提供了如下函數:fromstring()函數:從字符串中解析XML文檔或片段,返回根節(jié)點(或解析器目標返回的結果)。HTML()函數:從字符串常量中解析HTML文檔或片段,返回根節(jié)點(或解析器目標返回的結果)。什么是lxml庫除了上述函數之外,還可以調用parse()函數從XML文件中直接解析。html=etree.parse('./hello.html')result=etree.tostring(html,pretty_print=True)print(result)在調用函數時,如果沒有提供解析器,那么就使用默認的解析器,函數會返回一個ElementTree
類型的對象。lxml庫的基本使用(1)可以直接使用“//”從任意位置選取節(jié)點li,路徑表達式如下://lilxml庫的基本使用(2)在上個表達式的末尾,使用“/”向下選取節(jié)點,并使用“@”選取class屬性節(jié)點,表達式如下://li/@classlxml庫的基本使用(3)從任意位置開始選取倒數第二個<li>標簽,再向下選取標簽<a>。如果要獲取該標簽中的文本,可以使用如下表達式://li[last()-1]/a//li[last()-1]/a]/text()或XPath語法XPath使用路徑表達式在文檔中進行導航,它從某個節(jié)點開始,之后順著文檔樹結構的節(jié)點進一步查找。XPath的語法可按照如下情況進行劃分:選取節(jié)點謂語選取未知節(jié)點選取若干路徑XPath語法選取節(jié)點:節(jié)點是沿著路徑選取的,既可以從根節(jié)點開始,也可以從任意位置開始。表達式說明nodename最快/快//慢.選取當前節(jié)點..選取當前節(jié)點的父節(jié)點@選取屬性XPath語法這些條件都寫在方括號中,表示對節(jié)點進行進一步篩選,用于查找某個特定節(jié)點或者包含某個指定值的節(jié)點。元素[表達式]謂語:指路徑表達式的附加條件。XPath語法選取未知節(jié)點:XPath可以使用通配符來選取未知的節(jié)點。例如,使用“*”匹配任何元素節(jié)點。通配符說明*匹配任何元素節(jié)點。@*匹配任何屬性節(jié)點。node()匹配任何類型的節(jié)點。XPath語法選取若干路徑:在路徑表達式中可以使用“|”運算符,以選取若干個路徑。上述表達式用于選取book元素中包含的所有title和price子元素//book/title|//book/price第7章
解析庫BeautifulSoup4目錄頁01BeautifulSoup4概述02BeautifulSoup對象03方法和CSS選擇器什么是BeautifulSoup官網推薦現在的項目使用BeautifulSoup(BeautifulSoup4版本,簡稱為bs4)開發(fā)。bs4是一個HTML/XML的解析器,主要的功能是解析和提取HTML/XML數據。結
論
什么是BeautifulSoupbs4不僅支持CSS選擇器,而且支持Python標準庫中的HTML解析器,以及l(fā)xml的XML解析器。通過使用這些轉化器,實現了慣用的文檔導航和查找方式,節(jié)省了大量的工作時間,提高了開發(fā)項目的效率。構建BeautifulSoup對象通過一個字符串或者類文件對象可以創(chuàng)建BeautifulSoup類的對象。例如,根據字符串html_doc創(chuàng)建一個BeautifulSoup對象:frombs4importBeautifulSoupsoup=BeautifulSoup(html_doc,'lxml')在創(chuàng)建BeautifulSoup實例時共傳入了兩個參數。其中,第一個參數表示包含被解析HTML文檔的字符串,第二個參數表示使用lxml解析器進行解析。構建BeautifulSoup對象目前,bs4支持的解析器包括Python標準庫、lxml和html5lib,它們的優(yōu)勢和劣勢的比較如下。解析器使用方法優(yōu)勢劣勢Python標準庫BeautifulSoup(markup,"html.parser")1)Python的內置標準庫2)執(zhí)行速度適中3)文檔容錯能力強Python2.7.3或3.2.2之前的版本中文檔容錯能力差lxmlHTML解析器BeautifulSoup(markup,"lxml")1)速度快2)文檔容錯能力強需要安裝C語言庫lxmlXML解析器BeautifulSoup(markup,
["lxml-xml"])1)速度快2)唯一支持XML的解析器需要安裝C語言庫html5libBeautifulSoup(markup,"html5lib")1)最好的容錯性2)以瀏覽器的方式解析文檔3)生成HTML5格式的文檔1)速度慢2)不依賴外部擴展構建BeautifulSoup對象在創(chuàng)建BeautifulSoup對象時,如果沒有明確地指定解析器,那么BeautifulSoup對象會根據當前系統(tǒng)安裝的庫自動選擇解析器,解析器的選擇順序為:lxmlhtml5libPython標準庫什么是BeautifulSoupbs4庫將復雜的HTML文檔轉換成樹結構(HTMLDOM),這個結構中的每個節(jié)點都是一個Python對象,這些對象可以歸納為如下四種:類說明bs4.element.Tag表示HTML中的標簽,最基本的信息組織單元。bs4.element.NavigableString表示HTML中標簽的文本(非屬性字符串)bs4.BeautifulSoup表示HTMLDOM中的全部內容,支持遍歷文檔樹和搜索文檔樹的大部分方法。bs4.element.Comment表示標簽內字符串的注釋部分,是一種特殊的NavigableString對象。什么是BeautifulSoup第1步根據HTML或者XML文件創(chuàng)建BeautifulSoup對象。第2步根據DOM樹進行各種節(jié)點的搜索,只要獲得了一個節(jié)點,就可以訪問節(jié)點的名稱、屬性和文本。第3步在搜索節(jié)點的時候,我們也可以按照節(jié)點的名稱、節(jié)點的屬性或者節(jié)點的文字進行搜索。使用bs4的一般流程如下:什么是BeautifulSoup使用bs4的一般流程通過操作方法進行解讀搜索為了能獲得這些有用的網頁信息,可以通過一些查找方法獲取文本或者標簽屬性。因此,
bs4庫內置了一些查找方法,其中常用的兩個方法功能如下:find()方法:用于查找符合查詢條件的第一個標簽節(jié)點。find_all()方法:查找所有符合查詢條件的標簽節(jié)點,并返回一個列表。上述兩個方法用到的參數是一樣的,以find_all()方法為例,find_all()方法的定義如下:通過操作方法進行解讀搜索find_all(name=None,attrs={},text=None)name參數:查找所有名字為name的標簽,不過字符串會被自動忽略掉。傳入字符串傳入正則傳入列表soup.find_all('b')fortaginsoup.find_all(pile("^b")):print()soup.find_all(["a","b"])通過操作方法進行解讀搜索attrs參數:若指定名字的參數不是搜索方法中內置的參數名,則會把該參數當作指定名稱的標簽中的屬性來搜索。傳入屬性標簽傳入多個屬性傳入class標簽soup.find_all(id='link2')importresoup.find_all(href=pile("elsie"),id='link1')soup.find_all("a",class_="sister")通過操作方法進行解讀搜索text參數:跟name參數的可選值一樣,text參數也可以接受字符串、正則表達式和列表等。soup.find_all(text="Elsie")#結果為[u'Elsie']soup.find_all(text=["Tillie","Elsie","Lacie"])#結果為[u'Elsie',u'Lacie',u'Tillie']通過操作方法進行解讀搜索limit參數:限制返回結果的數量,其效果跟SQL語句中的limit關鍵字所產生的效果類似。soup.find_all("a",limit=2)一旦搜索到結果的數量達到了limit的限制時,就會停止搜索。通過操作方法進行解讀搜索recursive參數:如果只想搜索當前節(jié)點的直接子節(jié)點,那么就可以使用參數recursive=False。soup.html.find_all("title")#[<title>TheDormouse'sstory</title>]soup.html.find_all("title",recursive=False)#[]通過操作方法進行解讀搜索通過CSS選擇器進行搜索CSS即層疊樣式表,是一種用來表現HTML或XML等文件樣式的計算機語言。要想使用CSS對HTML頁面中的元素實現一對一、一對多或多對一的控制,就需要用到CSS選擇器。通過CSS選擇器進行搜索每一條CSS樣式定義均由兩部分組成,形式如下:[code]選擇器{樣式}[/code]其中,在{}之前的部分就是“選擇器”。選擇器指明了{}中樣式的作用對象,也就是“樣式”作用于網頁中的哪些元素。通過CSS選擇器進行搜索BeautifulSoup類中提供了一個select()方法,該方法會將CSS選擇器搜索到的結果放到列表中。通過標簽查找通過類名查找通過id名查找通過組合查找通過屬性查找第8章
多線程爬蟲目錄頁01進程和線程02Python與線程03高級線程模塊04多進程什么是進程程序是一個沒有生命的實體,它包含許多由程序設計語言編寫的、但未被執(zhí)行的指令,這些指令經過編譯和執(zhí)行才能完成指定動作。什么是進程程序被執(zhí)行后成為了一個活動的實體,這個實體就是進程。操作系統(tǒng)調度并執(zhí)行程序,這個“執(zhí)行中的程序”稱為進程。進程是操作系統(tǒng)進行資源分配和調度的基本單位。什么是進程每個進程都在內存中占據一定空間,進程占據的內存空間一般由控制塊、程序段和數據段三個部分組成。控制塊系統(tǒng)為管理進程專門設置的數據結構,常駐于內存中,用于記錄進程的外部特征與進程的運動變化過程。程序段用于存放程序執(zhí)行代碼的一塊內存區(qū)域。數據段存儲變量和進程執(zhí)行期間產生中間或最終數據的一塊內存區(qū)域。什么是進程隨著外界條件的變化,進程的狀態(tài)會發(fā)生變化。在五態(tài)模型中,進程有新建態(tài)、就緒態(tài)、運行態(tài)、阻塞態(tài)和終止態(tài)這五個狀態(tài)。新建態(tài)就緒態(tài)運行態(tài)阻塞態(tài)終止態(tài)什么是進程除了以上五種狀態(tài)之外,進程還有一個掛起態(tài)。掛起態(tài)是一種主動行為,它是在計算機內存資源不足、處理器空閑、用戶主動掛起、系統(tǒng)檢查資源使用情況等條件下將進程暫時調離出內存形成的,在條件允許時可再次被調回內存。與掛起態(tài)相比,阻塞態(tài)是一種被動行為,它是在等待事件或者獲取不到資源而引發(fā)的等待表現。什么是進程下面通過一張圖來描述進程狀態(tài)間的轉換關系。什么是進程進程具有以下一些特點:動態(tài)性并發(fā)性異步性獨立性什么是線程思考:什么是線程?什么是線程線程是系統(tǒng)進行運算調度的最小單位,也被稱為輕量級進程,它包含在進程之中,是進程的實際運作單位。進程中可以包含多個線程,每個線程是進程中單一順序的控制流,可以并行執(zhí)行不同的任務。什么是線程線程一般可分為以下幾種類型:主線程程序啟動時,操作系統(tǒng)在創(chuàng)建進程,的同時會立即運行一個線程,該線程通常被稱為主線程。子線程程序中創(chuàng)建的其它線程。守護線程守護線程是在后臺為其它線程提供服務的線程,它獨立于程序,不會因程序的終止而結束。前臺線程相對于守護線程的其它線程稱為前臺線程。什么是線程線程與進程相似,也具有五個狀態(tài),分別是新建態(tài)、就緒態(tài)、運行態(tài)、阻塞態(tài)和消亡態(tài)。什么是線程線程因某些條件發(fā)生時會由運行態(tài)轉換為阻塞態(tài),這些條件可能為以下任意一種:線程主動調用sleep()函數進入休眠狀態(tài);線程試圖獲取同步鎖,但是該鎖正被其它線程持有;線程等待一些I/O操作完成;線程等待某個條件觸發(fā)。使用多線程執(zhí)行程序Python提供了很多內建模塊用于支持多線程,使用_thread模塊中的start_new_thread函數會直接開啟一個線程。線程和鎖通過鎖可以讓程序了解是否還有線程函數沒執(zhí)行完,而可以做到當所有的線程函數執(zhí)行完后,程序會立即退出,而無須任何等待。高級線程模塊多線程模塊threading支持守護線程,其工作方式是:如果沒有客戶端請求,守護線程就是空閑的;如果把一個線程設置為守護線程,就表示此刻這個線程是不重要的,其他進程退出時不需要等待這個守護線程執(zhí)行完成。多進程
盡管多線程可以實現并發(fā)執(zhí)行,不過多個線程之間時共享當前進程的內存的,也就是說,線程可以申請到的資源有限。要想充分利用多核CPU資源,進一步發(fā)揮并發(fā)的作用,可以考慮使用多進程。第9章
文件存儲目錄頁01操作文件02讀寫XML文件03讀寫JSON文件04讀寫CSV文件爬蟲在爬取WEB數據后,需要對這些抓取到的數據進行分析,分析完后需要將分析的成果保存起來。打開文件計算機中的文件能夠持久保存程序運行時產生的數據。打開文件open()函數用于打開文件,該函數調用成功會返回一個文件對象。open(file,mode='r',encoding=None)file:表示待打開文件的文件名。encoding:表示文件的編碼格式。mode:表示文件的打開模式。打開文件常用的文件打開模式有r、w、a、b、+,這些模式的含義分別如下:文件打開模式含義r以只讀的方式打開文件,默認值。w以只寫的方式打開文件。a以追加的方式打開文件。b以二進制方式打開文件。+以更新的方式打開文件。打開文件文件打開模式可搭配使用,如下表所示為常用的搭配。關閉文件close()方法用于關閉文件,該方法沒有參數,直接調用即可。文件對象.close()關閉文件程序執(zhí)行完畢后,系統(tǒng)會自動關閉由該程序打開的文件,但計算機中可打開的文件數量是有限的,每打開一個文件,可打開文件數量就減一;打開的文件占用系統(tǒng)資源,若打開的文件過多,會降低系統(tǒng)性能。因此,編寫程序時應使用close()方法主動關閉不再使用的文件。文件的讀取文件對象.read([size])參數size表示設置的讀取數據的字節(jié)數,若該參數缺省,則一次讀取指定文件中的所有數據。read()方法可以從指定文件中讀取指定數據,其語法格式如下:文件的讀取文件對象.readline()每執(zhí)行一次readline()方法便會讀取文件中的一行數據。readline()方法可以從指定文件中讀取一行數據,其語法格式如下:文件的讀取文件對象.readlines()readlines()方法在讀取數據后會返回一個列表,該列表中的每個元素對應著文件中的每一行數據。readlines()方法可以一次讀取文件中的所有數據,其語法格式如下:文件的讀取read()(參數缺省時)和readlines()方法都可一次讀取文件中的全部數據,但這兩種操作都不夠安全。因為計算機的內存是有限的,若文件較大,read()和readlines()的一次讀取便會耗盡系統(tǒng)內存。為了保證讀取安全,通常多次調用read()方法,每次讀取size字節(jié)的數據。數據寫入通過write()方法向文件中寫入數據,其語法格式如下。文件對象.write(str)參數str表示要寫入的字符串。若字符串寫入成功,write()方法返回本次寫入文件的長度。數據寫入writelines()方法用于向文件中寫入字符串序列,其語法格式如下:文件對象.writelines([str])文件的拷貝文件拷貝即創(chuàng)建文件的副本,此項操作的本質仍是文件的打開、關閉與讀寫,基本邏輯如下:第1步打開文件第2步讀取文件內容創(chuàng)建新文件,將數據寫入到新文件中。第3步關閉文件,保存數據。第4步文件的重命名Python提供了用于更改文件名的函數——rename(),該函數存在于os模塊中,其語法格式如下:rename(原文件名,新文件名)文件的重命名待重命名的文件必須已存在,否則解釋器會報錯。創(chuàng)建目錄os模塊中的mkdir()函數用于創(chuàng)建目錄,其語法格式如下:os.mkdir(path,mode)
p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年專升本藝術概論模擬試題藝術史論核心知識點解析練習附答案
- 清盤拍賣活動策劃方案(3篇)
- 班級朗誦策劃活動方案(3篇)
- 國慶紅色活動方案策劃(3篇)
- 洛麗塔茶會活動策劃方案(3篇)
- 路面塌方施工方案(3篇)
- 煙臺擋板施工方案(3篇)
- 晚安話題活動策劃方案(3篇)
- 中國建筑裝飾玻璃市場調查及藝術加工技術與安全規(guī)范演進
- 中國建筑電梯安全監(jiān)管體系完善建議研究報告
- 云南省玉溪市2025-2026學年八年級上學期1月期末物理試題(原卷版+解析版)
- 2026年哈爾濱通河縣第一批公益性崗位招聘62人考試參考試題及答案解析
- 六年級寒假家長會課件
- 就業(yè)協(xié)議書解約函模板
- 物流鐵路專用線工程節(jié)能評估報告
- 2026天津市南開區(qū)衛(wèi)生健康系統(tǒng)招聘事業(yè)單位60人(含高層次人才)備考核心試題附答案解析
- 重瞼手術知情同意書
- 研發(fā)部門員工加班管理細則
- DL-T976-2017帶電作業(yè)工具、裝置和設備預防性試驗規(guī)程
- GB/T 21781-2008化學品的熔點及熔融范圍試驗方法毛細管法
- 工業(yè)廢水吸附
評論
0/150
提交評論