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