《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》全套教學(xué)課件_第1頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》全套教學(xué)課件_第2頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》全套教學(xué)課件_第3頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》全套教學(xué)課件_第4頁
《Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程》全套教學(xué)課件_第5頁
已閱讀5頁,還剩869頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程PythonWangluoPachongJishuAnliJiaocheng全套可編輯PPT課件COMMITTEDCOMMITTEDCOMMITTECOMMITTECONTENTS目錄COMMITTED第1章網(wǎng)絡(luò)爬蟲入門

第2章爬蟲基礎(chǔ)第3章網(wǎng)頁解析基礎(chǔ)第4章爬取動態(tài)加載數(shù)據(jù)第5章反爬蟲策略第6章模擬登錄和處理驗(yàn)證碼

第7章爬取App和PC客戶端第8章爬蟲框架Scrapy第9章分布式爬蟲第10章項(xiàng)目實(shí)戰(zhàn).Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲第1章

網(wǎng)絡(luò)爬蟲入門本章導(dǎo)讀在當(dāng)今這個數(shù)據(jù)大爆炸的信息時代,用戶與網(wǎng)絡(luò)的溝通本質(zhì)上是數(shù)據(jù)的交換,這導(dǎo)致了互聯(lián)網(wǎng)信息數(shù)據(jù)量的爆發(fā)式增長。海量的互聯(lián)網(wǎng)數(shù)據(jù)蘊(yùn)含著巨大的價值,用戶如何自動高效地從互聯(lián)網(wǎng)中獲取感興趣的信息并有效地應(yīng)用是一個亟待解決的問題。在這樣的環(huán)境和需求的影響下,網(wǎng)絡(luò)爬蟲應(yīng)運(yùn)而生,它為互聯(lián)網(wǎng)數(shù)據(jù)的采集提供了新的方法。本章從網(wǎng)絡(luò)爬蟲概述入手,介紹網(wǎng)絡(luò)爬蟲的相關(guān)基礎(chǔ)知識,包括網(wǎng)絡(luò)爬蟲的原理、分類和應(yīng)用,網(wǎng)絡(luò)爬蟲工作流程,網(wǎng)絡(luò)爬蟲協(xié)議,以及搭建Python開發(fā)環(huán)境等內(nèi)容。學(xué)習(xí)目標(biāo)理解網(wǎng)絡(luò)爬蟲的原理、分類和應(yīng)用。掌握網(wǎng)絡(luò)爬蟲的工作流程。了解網(wǎng)絡(luò)爬蟲協(xié)議。能在Windows系統(tǒng)中搭建Python開發(fā)環(huán)境。1.1網(wǎng)絡(luò)爬蟲概述1.2網(wǎng)絡(luò)爬蟲工作流程1.3網(wǎng)絡(luò)爬蟲協(xié)議第1章網(wǎng)絡(luò)爬蟲入門1.4搭建Python開發(fā)環(huán)境.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲1.1網(wǎng)絡(luò)爬蟲概述SectionTitle1.1網(wǎng)絡(luò)爬蟲概述1.1.1網(wǎng)絡(luò)爬蟲原理網(wǎng)絡(luò)爬蟲又稱為“網(wǎng)絡(luò)蜘蛛”,是一個用來實(shí)現(xiàn)自動采集網(wǎng)絡(luò)數(shù)據(jù)的程序。如果將互聯(lián)網(wǎng)比作一張蜘蛛網(wǎng),互聯(lián)網(wǎng)上的一個個網(wǎng)頁比作蜘蛛網(wǎng)上的一個個節(jié)點(diǎn),那么網(wǎng)頁與網(wǎng)頁之間的鏈接關(guān)系可以比作節(jié)點(diǎn)間的連線,而網(wǎng)絡(luò)爬蟲就可以比作在網(wǎng)上爬來爬去的蜘蛛。蜘蛛爬到一個節(jié)點(diǎn)相當(dāng)于訪問了該網(wǎng)頁,提取了信息,然后順著節(jié)點(diǎn)間的連線繼續(xù)爬行到下一個節(jié)點(diǎn),這樣周而復(fù)始,蜘蛛就可以爬遍整個網(wǎng)絡(luò)的所有節(jié)點(diǎn),抓取數(shù)據(jù)。1.1網(wǎng)絡(luò)爬蟲概述總的來說,網(wǎng)絡(luò)爬蟲的基本原理可用圖1-1描述。圖1-1網(wǎng)絡(luò)爬蟲基本原理1.1網(wǎng)絡(luò)爬蟲概述(1)預(yù)先設(shè)定一個或若干個初始網(wǎng)頁的URL,將初始URL加入待爬取URL列表中。(2)從待爬取列表中逐個讀取URL,并將URL加入已爬取URL列表中,然后下載網(wǎng)頁。(3)解析已下載的網(wǎng)頁,提取所需的數(shù)據(jù)和新的URL,并存儲提取的數(shù)據(jù)。(4)將新的URL與已爬取的URL列表進(jìn)行比對,檢查該網(wǎng)頁是否已爬取,如果網(wǎng)頁沒有被爬取,則將新的URL放入待爬取URL列表的末尾,等待讀取。(5)如此往復(fù),直到待爬取URL列表為空或者滿足設(shè)定的終止條件,最終達(dá)到遍歷網(wǎng)頁的目的。1.1網(wǎng)絡(luò)爬蟲概述統(tǒng)一資源定位符(UniformResourceLocator,URL)是對可以從互聯(lián)網(wǎng)上得到的資源位置和訪問方法的一種簡潔表示,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的地址。1.1網(wǎng)絡(luò)爬蟲概述1.1.2網(wǎng)絡(luò)爬蟲分類網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和工作原理的不同,大致可以分為四類:系統(tǒng)結(jié)構(gòu)和工作原理的不同通用網(wǎng)絡(luò)爬蟲聚焦網(wǎng)絡(luò)爬蟲增量式網(wǎng)絡(luò)爬蟲深層網(wǎng)絡(luò)爬蟲1.1網(wǎng)絡(luò)爬蟲概述(1)通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲,是根據(jù)網(wǎng)絡(luò)爬蟲的基本原理實(shí)現(xiàn)的,它所爬取的目標(biāo)會從初始設(shè)定的URL擴(kuò)充到全網(wǎng)。通用網(wǎng)絡(luò)爬蟲主要應(yīng)用于門戶網(wǎng)站、搜索引擎和大型網(wǎng)絡(luò)服務(wù)提供商的數(shù)據(jù)采集。1.1網(wǎng)絡(luò)爬蟲概述(2)聚焦網(wǎng)絡(luò)爬蟲爬取的目標(biāo)是與預(yù)先定義好的主題相關(guān)的網(wǎng)頁。與通用網(wǎng)絡(luò)爬蟲相比,聚焦網(wǎng)絡(luò)爬蟲只選擇爬取與主題相關(guān)的網(wǎng)頁,極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,它主要應(yīng)用于對特定領(lǐng)域信息有需求的場景。聚焦網(wǎng)絡(luò)爬蟲在通用網(wǎng)絡(luò)爬蟲的基礎(chǔ)上,需要對提取的新URL進(jìn)行過濾處理,過濾掉與目標(biāo)主題無關(guān)的網(wǎng)頁,且根據(jù)一定的相關(guān)性搜索策略,確定待爬取URL列表的讀取順序。1.1網(wǎng)絡(luò)爬蟲概述(3)增量式網(wǎng)絡(luò)爬蟲爬取的目標(biāo)是有更新的已下載網(wǎng)頁和新產(chǎn)生的網(wǎng)頁。爬蟲程序監(jiān)測網(wǎng)站數(shù)據(jù)更新的情況,然后在需要的時候只爬取發(fā)生更新或新產(chǎn)生的網(wǎng)頁。這樣,可有效減少數(shù)據(jù)下載量,及時更新已爬取的網(wǎng)頁,但是增加了爬行算法的復(fù)雜度和實(shí)現(xiàn)難度。增量式網(wǎng)絡(luò)爬蟲主要應(yīng)用于網(wǎng)頁內(nèi)容會時常更新的網(wǎng)站,或者不斷有新網(wǎng)頁出現(xiàn)的網(wǎng)站。1.1網(wǎng)絡(luò)爬蟲概述(4)深層網(wǎng)絡(luò)爬蟲爬取的目標(biāo)是不能通過靜態(tài)鏈接獲取的,隱藏在搜索表單后的,只有用戶提交一些關(guān)鍵詞才能獲得的網(wǎng)頁,如用戶注冊后才可顯示內(nèi)容的網(wǎng)頁。1.1網(wǎng)絡(luò)爬蟲概述1.1.3網(wǎng)絡(luò)爬蟲應(yīng)用每個獨(dú)立的搜索引擎都有自己的爬蟲程序,爬蟲程序每天連續(xù)地爬取相關(guān)網(wǎng)站,提取信息保存到索引數(shù)據(jù)庫中,如Google爬蟲Googlebot、百度爬蟲Baiduspider、必應(yīng)爬蟲Bingbot

等。此外,有些搜索引擎對應(yīng)不同的業(yè)務(wù)還有不同的爬蟲,如百度圖片爬蟲Baiduspider-image、百度新聞爬蟲Baiduspider-news等。搜索引擎在用戶輸入搜索信息后并不是直接搜索整個互聯(lián)網(wǎng),而是對預(yù)先建立好的索引數(shù)據(jù)庫進(jìn)行檢索。1.1網(wǎng)絡(luò)爬蟲概述企業(yè)用戶在采集和分析數(shù)據(jù)時也時常會借助網(wǎng)絡(luò)爬蟲。例如,爬取產(chǎn)品的用戶信息進(jìn)行分析,以確定目標(biāo)客戶群體;爬取同類產(chǎn)品的銷售信息進(jìn)行分析,以制定營銷策略等。當(dāng)然,普通用戶也可以根據(jù)自己關(guān)注的主題采集所需要的數(shù)據(jù),把瀏覽網(wǎng)站或App時所見到的數(shù)據(jù)都通過爬蟲程序保存下來,實(shí)現(xiàn)可見即可得。例如,爬取網(wǎng)站上的圖片、學(xué)術(shù)網(wǎng)站的論文、團(tuán)購網(wǎng)站的價格及點(diǎn)評、各種電商平臺的商品信息、招聘網(wǎng)站的招聘信息等數(shù)據(jù)。1.1網(wǎng)絡(luò)爬蟲概述(4)深層網(wǎng)絡(luò)爬蟲爬取的目標(biāo)是不能通過靜態(tài)鏈接獲取的,隱藏在搜索表單后的,只有用戶提交一些關(guān)鍵詞才能獲得的網(wǎng)頁,如用戶注冊后才可顯示內(nèi)容的網(wǎng)頁。1.2網(wǎng)絡(luò)爬蟲工作流程.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle1.2網(wǎng)絡(luò)爬蟲工作流程網(wǎng)絡(luò)爬蟲是一個自動化的程序,它的工作流程非常簡單。爬蟲程序首先發(fā)送請求,獲取網(wǎng)頁響應(yīng)的內(nèi)容,然后解析網(wǎng)頁內(nèi)容,最后將提取的數(shù)據(jù)存儲到文件或數(shù)據(jù)庫中??偨Y(jié)起來,其工作流程可以分為爬取網(wǎng)頁、解析網(wǎng)頁和存儲數(shù)據(jù)三個步驟,如圖1-2所示。圖1-2網(wǎng)絡(luò)爬蟲工作流程1.2網(wǎng)絡(luò)爬蟲工作流程1.2.1爬取網(wǎng)頁爬蟲程序首先要做的工作是爬取網(wǎng)頁,即獲取網(wǎng)頁的源代碼。源代碼里包含了網(wǎng)頁的有用信息,所以只要把源代碼爬取下來,就可以從中提取想要的信息。爬蟲程序向網(wǎng)站的服務(wù)器發(fā)送一個HTTP請求,服務(wù)器返回給爬蟲程序包含所需數(shù)據(jù)的HTTP響應(yīng)(即網(wǎng)頁源代碼)。Python提供了許多與網(wǎng)絡(luò)爬蟲相關(guān)的庫,其中,在爬取網(wǎng)頁方面有urllib、requests、selenium庫等。1.2網(wǎng)絡(luò)爬蟲工作流程1.2.2解析網(wǎng)頁爬取網(wǎng)頁后,接下來就是解析網(wǎng)頁了。解析網(wǎng)頁是用戶根據(jù)網(wǎng)頁結(jié)構(gòu),分析網(wǎng)頁源代碼,從中提取想要的數(shù)據(jù)。它可以使雜亂的數(shù)據(jù)變得條理清晰,以便用戶后續(xù)處理和分析。解析網(wǎng)頁萬能的方法是正則表達(dá)式,但是構(gòu)造正則表達(dá)式比較復(fù)雜且容易出錯,所以Python根據(jù)網(wǎng)頁節(jié)點(diǎn)屬性、CSS選擇器及XPath語法提供了網(wǎng)頁的解析庫,如beautifulsoup4、lxml庫等。使用這些庫,用戶可以高效快速地解析網(wǎng)頁。1.2網(wǎng)絡(luò)爬蟲工作流程1.2.3存儲數(shù)據(jù)解析網(wǎng)頁提取數(shù)據(jù)后,一般要將提取到的數(shù)據(jù)保存起來以便后續(xù)使用。保存數(shù)據(jù)的方式有很多種,可以將其簡單保存到JSON或CSV文件中,也可以保存到數(shù)據(jù)庫中,如MySQL和MongoDB等。1.3網(wǎng)絡(luò)爬蟲協(xié)議.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle1.3網(wǎng)絡(luò)爬蟲協(xié)議1.3.1網(wǎng)絡(luò)爬蟲合法性雖然互聯(lián)網(wǎng)世界已經(jīng)通過自己的規(guī)則建立了一定的道德規(guī)范(Robots協(xié)議),但法律部分還在建立和完善中。從目前的情況來看,如果抓取的數(shù)據(jù)用于個人使用或科學(xué)研究,那么基本上是不違法的;但如果數(shù)據(jù)用于其他用途,尤其是轉(zhuǎn)載或商業(yè)用途,那么根據(jù)爬取網(wǎng)站數(shù)據(jù)的不同情況有不同的后果,嚴(yán)重的將會引起民事糾紛甚至觸犯法律。因此,用戶在爬取數(shù)據(jù)時應(yīng)避免以下幾個方面的問題。1.3網(wǎng)絡(luò)爬蟲協(xié)議應(yīng)避免以下幾個方面的問題(1)侵犯著作權(quán)。(2)侵犯商業(yè)秘密。(3)侵犯個人隱私。(4)構(gòu)成不正當(dāng)競爭。(5)侵入計算機(jī)系統(tǒng),構(gòu)成刑事犯罪。1.3網(wǎng)絡(luò)爬蟲協(xié)議百度與大眾點(diǎn)評不正當(dāng)競爭糾紛案是百度公司因使用技術(shù)手段抓取并使用大眾點(diǎn)評內(nèi)容而被認(rèn)定為構(gòu)成不正當(dāng)競爭的案例。本案在2016年被列為“影響中國互聯(lián)網(wǎng)法制進(jìn)程十大案例”之一。大眾點(diǎn)評是上海漢濤信息咨詢有限公司(下稱“漢濤公司”)向網(wǎng)絡(luò)用戶提供商戶基本信息及點(diǎn)評信息的生活服務(wù)App。北京百度網(wǎng)訊科技有限公司(下稱“百度公司”)使用技術(shù)手段在大眾點(diǎn)評等App上抓取了商戶的基本信息及點(diǎn)評信息,用戶使用其運(yùn)營的百度地圖App查詢位置時,無須跳轉(zhuǎn)至大眾點(diǎn)評界面,就可直接在百度地圖界面獲取商戶的基本信息和點(diǎn)評信息。漢濤公司以百度公司等相關(guān)主體構(gòu)成不正當(dāng)競爭向法院起訴。在本案審理過程中,法院將《反不正當(dāng)競爭法》第二條作為主要裁判依據(jù),并最終認(rèn)定百度公司構(gòu)成不正當(dāng)競爭。1.3網(wǎng)絡(luò)爬蟲協(xié)議1.3.2Robots協(xié)議Robots協(xié)議(又稱“爬蟲協(xié)議”)的全稱是“網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)”(Robotsexclusionprotocol)。網(wǎng)站管理者可以通過它來表達(dá)是否希望爬蟲程序自動獲取網(wǎng)站信息的意愿。管理者可以在網(wǎng)站根目錄下放置一個robots.txt文件,并在文件中列出哪些鏈接不允許爬蟲程序獲取。當(dāng)爬蟲程序訪問一個網(wǎng)站時,它會首先檢查該網(wǎng)站根目錄下是否存在robots.txt文件,如果存在,爬蟲程序就會按照該文件中的內(nèi)容來確定訪問范圍;如果不存在,爬蟲程序就能夠訪問網(wǎng)站上所有沒被保護(hù)的網(wǎng)頁。1.3網(wǎng)絡(luò)爬蟲協(xié)議robots.txt文件遵循一定的格式,下面以知乎的robots.txt文件為例進(jìn)行介紹。訪問/robots.txt,可以查看完整代碼(這里僅截取部分代碼進(jìn)行分析),如圖1-3所示。圖1-3知乎的robots.txt文件部分代碼1.3網(wǎng)絡(luò)爬蟲協(xié)議“User-agent:Googlebot-Image”表示這部分代碼針對谷歌圖片爬蟲,禁止或允許谷歌圖片爬蟲爬取某些文件;如果代碼為“User-agent:*”,則表示針對所有搜索引擎的爬蟲程序?!癉isallow:/appview/”表示禁止爬取網(wǎng)站根目錄的appview文件夾下的文件。1.3網(wǎng)絡(luò)爬蟲協(xié)議“Disallow:/*?guide*”表示禁止爬取網(wǎng)站中所有包含guide的網(wǎng)址?!癆llow:/search-special”表示允許爬取網(wǎng)站根目錄下所有以search-special開頭的文件夾和文件。1.3網(wǎng)絡(luò)爬蟲協(xié)議當(dāng)然,如果要禁止爬蟲程序爬取網(wǎng)站中的所有內(nèi)容,可以用更簡單的方法。例如,淘寶網(wǎng)不允許百度的爬蟲程序訪問其網(wǎng)站下所有的目錄,其robots.txt文件內(nèi)容如圖1-4所示。圖1-4淘寶網(wǎng)的robots.txt文件1.3網(wǎng)絡(luò)爬蟲協(xié)議在百度里搜索淘寶就會顯示“由于該網(wǎng)站的robots.txt文件存在限制指令(限制搜索引擎抓?。?,系統(tǒng)無法提供該頁面的內(nèi)容描述”,如圖1-5所示。圖1-5百度搜索淘寶官網(wǎng)的顯示情況1.4搭建Python開發(fā)環(huán)境.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle1.4搭建Python開發(fā)環(huán)境學(xué)習(xí)Python網(wǎng)絡(luò)爬蟲首先需要搭建Python開發(fā)環(huán)境,一般情況下,用戶可以直接下載并安裝Python,也可以通過Anaconda安裝Python。本節(jié)介紹安裝Anaconda和PyCharm編輯器,來搭建Python開發(fā)環(huán)境的方法,從而開始網(wǎng)絡(luò)爬蟲的開發(fā)之旅。

1.4搭建Python開發(fā)環(huán)境Anaconda是一個開源的Python發(fā)行版本,它包含了Conda、Python等超過180個科學(xué)包及其依賴項(xiàng)。PyCharm是一款非常優(yōu)秀的Python編輯器,帶有一整套可以幫助用戶在使用Python語言開發(fā)時提高效率的工具,如調(diào)試、語法高亮、Project管理、代碼跳轉(zhuǎn)、智能提示、自動完成、單元測試、版本控制等。1.4搭建Python開發(fā)環(huán)境1.4.1安裝Anaconda1.下載步驟一:訪問/,在打開的Anaconda主頁中選擇“Products”→“IndividualEdition”選項(xiàng),如圖1-6所示。圖1-6Anaconda主頁

訪問/,1.4搭建Python開發(fā)環(huán)境步驟二:打開下載頁面,向下拖動滾動條,直到出現(xiàn)Anaconda安裝版本信息,選擇“Windows”→“Python3.7”→“64-BitGraphicalInstaller”選項(xiàng),下載安裝軟件,如圖1-7所示。圖1-7下載Anaconda1.4搭建Python開發(fā)環(huán)境2.安裝步驟一:雙擊下載好的Anaconda3-2020.02-Windows-x86_64.exe文件,在打開的對話框中單擊“Next”按鈕,如圖1-8所示。圖1-8歡迎安裝

1.4搭建Python開發(fā)環(huán)境步驟二:顯示“LicenseAgreement”界面,單擊“IAgree”按鈕,如圖1-9所示。圖1-9同意安裝許可1.4搭建Python開發(fā)環(huán)境步驟三:顯示“SelectInstallationType”界面,在“Installfor”列表中勾選“JustMe”單選鈕,單擊“Next”按鈕,如圖1-10所示。如果系統(tǒng)創(chuàng)建了多個用戶而且都使用Anaconda,則勾選“AllUsers”單選鈕。圖1-10選擇用戶1.4搭建Python開發(fā)環(huán)境步驟四:顯示“ChooseInstallLocation”界面,直接使用默認(rèn)路徑,單擊“Next”按鈕,如圖1-11所示。

圖1-11設(shè)置安裝路徑1.4搭建Python開發(fā)環(huán)境步驟五:顯示“AdvancedInstallationOptions”界面。在“AdvancedOptions”列表中勾選“AddAnaconda3tomyPATHenvironmentvariable”和“RegisterAnaconda3asmydefaultPython3.7”復(fù)選框,單擊“Install”按鈕,如圖1-12所示。圖1-12設(shè)置系統(tǒng)環(huán)境1.4搭建Python開發(fā)環(huán)境步驟六:安裝完成后單擊“Next”按鈕,最后單擊“Finish”按鈕,完成Anaconda3的安裝。勾選“AddAnaconda3tomyPATHenvironmentvariable”表示把Anaconda3加入環(huán)境變量;勾選“RegisterAnaconda3asmydefaultPython3.7”表示將Anaconda3注冊為默認(rèn)安裝的Python3.7。1.4搭建Python開發(fā)環(huán)境3.驗(yàn)證步驟一:單擊“開始”按鈕,選擇“Anaconda3”→“AnacondaPrompt”選項(xiàng),如圖1-13所示。圖1-13啟動AnacondaPrompt

1.4搭建Python開發(fā)環(huán)境步驟二:單擊“開始”按鈕,選擇“Anaconda3”→“AnacondaPrompt”選項(xiàng),如圖1-13所示。

圖1-14Anaconda庫名和版本號列表

1.4搭建Python開發(fā)環(huán)境1.4.2安裝PyCharm1.下載訪問/pycharm/download/#section=windows,在打開的下載頁面中單擊“Community”下的“Download”按鈕,下載社區(qū)版,如圖1-15所示。圖1-15下載PyCharm1.4搭建Python開發(fā)環(huán)境2.安裝步驟一:解壓下載好的安裝包,雙擊pycharm-community-2020.1.1.exe文件,運(yùn)行安裝程序。步驟二:根據(jù)安裝提示進(jìn)行安裝即可。1.4搭建Python開發(fā)環(huán)境在“InstallationOptions”對話框中勾選所有復(fù)選框,如圖1-16所示。圖1-16設(shè)置安裝選項(xiàng)1.4搭建Python開發(fā)環(huán)境3.使用步驟一:啟動PyCharm,打開“ImportPyCharmSettings”對話框,勾選“Donotimportsettings”單選鈕,單擊“OK”按鈕,如圖1-17所示。圖1-17PyCharm導(dǎo)入設(shè)置1.4搭建Python開發(fā)環(huán)境步驟二:

打開“CustomizePyCharm”對話框,勾選“Light”單選鈕,單擊“SkipRemainingandSetDefaults”按鈕,如圖1-18所示。圖1-18設(shè)置用戶界面主題1.4搭建Python開發(fā)環(huán)境步驟1和步驟2中的對話框只在PyCharm首次使用時會顯示,進(jìn)行配置后,再次使用時就不需要再進(jìn)行配置了。1.4搭建Python開發(fā)環(huán)境步驟三:打開“WelcometoPyCharm”對話框,選擇“CreateNewProject”選項(xiàng),如圖1-19所示。圖1-19創(chuàng)建新項(xiàng)目1.4搭建Python開發(fā)環(huán)境步驟四:打開“NewProject”對話框,在“Location”編輯框中設(shè)置項(xiàng)目保存的路徑,并將項(xiàng)目命名為“Test”;在“Newenvironmentusing”下拉列表中選擇默認(rèn)的“Virtualenv”選項(xiàng);在“Baseinterpreter”中選擇Anaconda安裝目錄下的python.exe,單擊“Create”按鈕,如圖1-20所示。圖1-20配置新項(xiàng)目環(huán)境1.4搭建Python開發(fā)環(huán)境Virtualenv是一個虛擬環(huán)境管理器,它可以創(chuàng)建多個虛擬環(huán)境,為不同項(xiàng)目提供獨(dú)立的Python運(yùn)行環(huán)境,以解決不同項(xiàng)目間多版本的沖突問題。在不繼承全局安裝包的情況下,在Virtualenv環(huán)境中安裝所需要的包時,會自動安裝到該虛擬環(huán)境下,不會對其他項(xiàng)目環(huán)境有任何影響。1.4搭建Python開發(fā)環(huán)境步驟五:

打開“PyCharm”窗口。右擊項(xiàng)目名“Test”,在彈出的快捷菜單中選擇“New”→“PythonFile”選項(xiàng),新建一個Python文件,如圖1-21所示。圖1-21新建Python文件1.4搭建Python開發(fā)環(huán)境步驟六:打開“NewPythonfile”對話框,將文件命名為“HelloWorld”,雙擊“Pythonfile”選項(xiàng),如圖1-22所示。圖1-22命名文件1.4搭建Python開發(fā)環(huán)境Python程序的源文件擴(kuò)展名為“.py”。如果要在PyCharm的項(xiàng)目中導(dǎo)入已經(jīng)編寫好的源文件,可以將源文件放到項(xiàng)目文件夾根目錄下,這樣源文件可顯示在項(xiàng)目中。1.4搭建Python開發(fā)環(huán)境步驟七:進(jìn)入“HelloWorld.py”代碼編輯界面,在程序編輯區(qū)輸入代碼,如圖1-23所示。圖1-23編寫程序1.4搭建Python開發(fā)環(huán)境步驟八:在菜單欄中選擇“Run”→“Run”選項(xiàng),打開“Run”對話框,然后選擇“HelloWorld”選項(xiàng),運(yùn)行程序,在窗口下方即可顯示運(yùn)行結(jié)果,如圖1-24所示。圖1-24運(yùn)行“HelloWorld”示例實(shí)戰(zhàn)演練——使用PyCharm配置Conda環(huán)境.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle實(shí)戰(zhàn)演練——使用PyCharm配置Conda環(huán)境使用PyCharm配置Conda環(huán)境1.實(shí)戰(zhàn)分析Anaconda集成了Conda、Python及很多安裝好的工具包,其中Conda是一個開源的包和環(huán)境管理器,它允許用戶可以同時安裝若干不同版本的Python及其依賴包,并能夠在不同的環(huán)境之間切換。同時,使用Conda安裝新的工具包時,可以實(shí)現(xiàn)自動下載并安裝,使用非常方便。2.實(shí)戰(zhàn)目標(biāo)安裝了Anaconda后,使用PyCharm配置運(yùn)行環(huán)境時,可以選擇Conda環(huán)境,從而實(shí)現(xiàn)創(chuàng)建不同Python版本的開發(fā)環(huán)境。3.實(shí)戰(zhàn)步驟具體步驟詳見教材或掃碼觀看。.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲感謝觀看Thanksforwatching.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲Python網(wǎng)絡(luò)爬蟲技術(shù)案例教程PythonWangluoPachongJishuAnliJiaochengCOMMITTEDCOMMITTEDCOMMITTECOMMITTECONTENTS目錄COMMITTED第1章網(wǎng)絡(luò)爬蟲入門

第2章爬蟲基礎(chǔ)第3章網(wǎng)頁解析基礎(chǔ)第4章爬取動態(tài)加載數(shù)據(jù)第5章反爬蟲策略第6章模擬登錄和處理驗(yàn)證碼

第7章爬取App和PC客戶端第8章爬蟲框架Scrapy第9章分布式爬蟲第10章項(xiàng)目實(shí)戰(zhàn).Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲第2章

爬蟲基礎(chǔ)本章導(dǎo)讀網(wǎng)絡(luò)爬蟲工作流程中的第一步就是爬取網(wǎng)頁,只有爬取網(wǎng)頁獲得了網(wǎng)頁的源代碼,才能提取其中的有效信息。而爬取網(wǎng)頁首先就需要向Web服務(wù)器發(fā)送構(gòu)造的HTTP請求,從而獲得包含所需數(shù)據(jù)的HTTP響應(yīng)。本章從HTTP基本原理入手,介紹網(wǎng)絡(luò)爬蟲爬取網(wǎng)頁的基礎(chǔ)知識,包括HTTP請求和HTTP響應(yīng)、urllib庫、requests庫和字符編碼等內(nèi)容。學(xué)習(xí)目標(biāo)理解HTTP的基本原理。了解urllib庫的使用方法。掌握requests庫的使用方法。了解Python中的字符編碼。能使用urllib庫和requests庫構(gòu)造HTTP請求實(shí)現(xiàn)網(wǎng)頁的爬取。2.1HTTP基本原理2.2urllib庫2.3requests庫第2章爬蟲基礎(chǔ)2.4字符編碼.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle2.1HTTP基本原理2.1HTTP基本原理2.1HTTP基本原理在瀏覽器中輸入一個URL,按回車鍵后便會在瀏覽器中顯示網(wǎng)頁內(nèi)容。實(shí)際上,這個過程是瀏覽器向Web服務(wù)器發(fā)送了一個HTTP請求;Web服務(wù)器接收到這個請求后進(jìn)行解析和處理,然后返回給瀏覽器對應(yīng)的HTTP響應(yīng);瀏覽器再對HTTP響應(yīng)進(jìn)行解析,從而將網(wǎng)頁呈現(xiàn)了出來。下面以使用GoogleChrome瀏覽器打開百度的搜索頁面為例來展示HTTP請求和響應(yīng)的過程。HTTP基本原理2.1HTTP基本原理打開GoogleChrome瀏覽器,右擊頁面空白處,在彈出的快捷菜單中選擇“檢查”選項(xiàng),打開瀏覽器的開發(fā)者工具窗口,然后選擇“Network”選項(xiàng)。訪問/,即可在開發(fā)者工具窗口中顯示請求記錄(見圖2-1),其中每一條記錄都代表一次發(fā)送請求和接收響應(yīng)的過程。2.1HTTP基本原理圖2-1GoogleChrome瀏覽器顯示HTTP請求記錄2.1HTTP基本原理圖2-2HTTP請求和響應(yīng)的詳細(xì)信息在記錄列表中,選擇“”選項(xiàng),然后在其右側(cè)打開的界面中選擇“Headers”選項(xiàng),即可顯示HTTP請求和響應(yīng)的詳細(xì)信息,如圖2-2所示。2.1HTTP基本原理2.1.1HTTP請求請求的網(wǎng)址(RequestURL)請求方法(RequestMethod)請求頭(RequestHeaders)請求體(RequestBody)2.1HTTP基本原理表2-2Content-Type和POST提交數(shù)據(jù)方式的關(guān)系1.請求的網(wǎng)址請求的網(wǎng)址即URL,它可以唯一確定請求的資源。圖2-2中的“RequestURL”部分即為請求的網(wǎng)址(/)。Content-Type提交數(shù)據(jù)的方式application/x-www-form-urlencoded表單數(shù)據(jù)multipart/form-data表單文件application/json序列化JSON數(shù)據(jù)text/xmlXML數(shù)據(jù)2.1HTTP基本原理常見的請求方法有兩種:GET方法和POST方法。(1)GET方法,請求指定的網(wǎng)頁信息,并返回網(wǎng)頁內(nèi)容,提交的數(shù)據(jù)最多只有1024字節(jié)。(2)POST方法,向指定資源提交數(shù)據(jù)并進(jìn)行請求處理(如提交表單或上傳文件)。數(shù)據(jù)都包含在請求體中,提交的數(shù)據(jù)沒有字節(jié)限制。2.請求方法2.1HTTP基本原理圖2-2中的“RequestMethod”部分即為請求方法(GET方法)??梢钥闯?,平時打開網(wǎng)站一般使用的是GET方法,也就是請求頁面;如果是向網(wǎng)站提交數(shù)據(jù)(如登錄網(wǎng)站),就用到了POST方法。還有一些其他的請求方法,如HEAD、PUT、DELETE、CONNECT、OPTIONS和TRACE等,在實(shí)際編寫爬蟲程序時很少用到,此處不再介紹。2.1HTTP基本原理請求頭是請求的重要組成部分,在編寫爬蟲程序時,大部分情況下都需要設(shè)定請求頭。不同請求的請求頭包含的內(nèi)容不同,應(yīng)用時應(yīng)根據(jù)實(shí)際需求設(shè)定。圖2-2中的“RequestHeaders”部分即為請求頭。常見的請求頭及其說明如表2-1所示。3.請求頭表5-2-4pstree命令中常用選項(xiàng)的含義請求頭說明Accept指定客戶端可識別的內(nèi)容類型Accpet-Encoding指定客戶端可識別的內(nèi)容編碼Accept-Language指定客戶端可識別的語言類型Cookie網(wǎng)站為了辨別用戶身份進(jìn)行會話跟蹤而存儲在用戶本地的數(shù)據(jù),主要功能是維持當(dāng)前訪問會話Host指定請求的服務(wù)器的域名和端口號User-Agent使服務(wù)器識別客戶端使用的操作系統(tǒng)及版本、瀏覽器及版本等信息,實(shí)現(xiàn)爬蟲時加上此信息,可以偽裝為瀏覽器Content-Type請求的媒體類型信息Content-Length請求的內(nèi)容長度Referer包含一個URL,用戶以該URL代表的頁面出發(fā)訪問當(dāng)前請求頁面2.1HTTP基本原理表2-1常見的請求頭及其說明2.1HTTP基本原理其中,“Content-Type”確定了POST請求提交數(shù)據(jù)的方式,如表2-2所示。Content-Type提交數(shù)據(jù)的方式application/x-www-form-urlencoded表單數(shù)據(jù)multipart/form-data表單文件application/json序列化JSON數(shù)據(jù)text/xmlXML數(shù)據(jù)表2-2Content-Type和POST提交數(shù)據(jù)方式的關(guān)系2.1HTTP基本原理請求體中的內(nèi)容一般是POST請求中的表單數(shù)據(jù),而GET請求的請求體為空。例如,使用賬戶登錄百度網(wǎng)站可看到POST請求中的請求體(“FormData”部分),如圖2-3所示。4.請求體圖2-3POST請求中的請求體2.1HTTP基本原理2.1.2HTTP響應(yīng)HTTP響應(yīng)可以分為三部分內(nèi)容:響應(yīng)狀態(tài)碼(ResponseStatusCode)響應(yīng)頭(ResponseHeaders)響應(yīng)體(ResponseBody)2.1HTTP基本原理狀態(tài)碼英文名稱說明100Continue服務(wù)器已收到請求的一部分,正在等待其余部分,應(yīng)繼續(xù)提出請求200OK服務(wù)器已成功處理了請求302MoveTemporarily服務(wù)器要求客戶端重新發(fā)送一個請求304NotModified此請求返回的網(wǎng)頁未修改,繼續(xù)使用上次的資源404NotFound服務(wù)器找不到請求的網(wǎng)頁500InternalServerError服務(wù)器遇到錯誤,無法完成請求表2-3常見的響應(yīng)狀態(tài)碼1.響應(yīng)狀態(tài)碼響應(yīng)狀態(tài)碼表示服務(wù)器的響應(yīng)狀態(tài),常見的響應(yīng)狀態(tài)碼如表2-3所示。2.1HTTP基本原理圖2-2HTTP請求和響應(yīng)的詳細(xì)信息圖2-2中的“StatusCode”部分即為響應(yīng)狀態(tài)碼(200OK)。在爬取網(wǎng)頁時,爬蟲程序可以根據(jù)狀態(tài)碼判斷服務(wù)器的響應(yīng)狀態(tài),如果狀態(tài)碼為200,則表明返回數(shù)據(jù)成功,可以進(jìn)行下一步的處理。2.1HTTP基本原理響應(yīng)頭說明Content-EncodingWeb服務(wù)器支持的編碼類型Content-Language響應(yīng)體的語言Content-Length響應(yīng)體的長度Content-Type返回內(nèi)容的媒體類型Date原始服務(wù)器消息發(fā)出的時間表2-4常見的響應(yīng)頭及其說明2.響應(yīng)頭響應(yīng)頭包含了服務(wù)器對請求的應(yīng)答信息,圖2-2中的“ResponseHeaders”部分即為響應(yīng)頭。常見的響應(yīng)頭及其說明如表2-4所示。響應(yīng)頭說明Expires響應(yīng)過期的日期和時間Last-Modified請求資源的最后修改時間Set-Cookie設(shè)置HTTPCookieLocation重定向接收到請求的URL位置2.1HTTP基本原理圖2-4響應(yīng)體3.響應(yīng)體響應(yīng)體包含響應(yīng)的正文數(shù)據(jù)。例如,請求網(wǎng)頁時,響應(yīng)體是網(wǎng)頁的網(wǎng)頁源代碼;請求圖片時,響應(yīng)體是圖片的二進(jìn)制數(shù)據(jù)。在圖2-2中選擇“Response”選項(xiàng),可顯示響應(yīng)體,如圖2-4所示。.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle2.2urllib庫2.2urllib庫2.2.1案例引入——爬取有道在線翻譯網(wǎng)站的數(shù)據(jù)【例2-1】爬取有道在線翻譯網(wǎng)站的內(nèi)容(網(wǎng)址/),輸出爬取到的信息?!締栴}分析】

首先構(gòu)造HTTP請求,然后將HTTP響應(yīng)的各部分進(jìn)行輸出。2.2urllib庫【參考代碼】

importurllib.request #導(dǎo)入request模塊url='/' #定義url字符串#構(gòu)造HTTP請求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen(url)print('響應(yīng)類型:',type(response)) #輸出響應(yīng)類型print('響應(yīng)狀態(tài)碼:',response.getcode()) #輸出響應(yīng)狀態(tài)碼#輸出編碼方式print('編碼方式:',response.getheader('Content-Type'))print('請求的URL:',response.geturl()) #輸出請求的URLresp=response.read().decode('utf-8') #讀取網(wǎng)頁內(nèi)容并解碼print('網(wǎng)頁內(nèi)容:\n',resp #輸出網(wǎng)頁內(nèi)容2.2urllib庫直接用urllib.request模塊的urlopen()函數(shù)獲取網(wǎng)頁,返回的網(wǎng)頁內(nèi)容數(shù)據(jù)格式為bytes類型,需要利用decode()函數(shù)解碼,轉(zhuǎn)換成str類型。2.2urllib庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-5所示。圖2-5例2-1程序的運(yùn)行結(jié)果2.2urllib庫2.2.2urllib庫簡介urllib庫是Python內(nèi)置的標(biāo)準(zhǔn)庫,不需要額外安裝即可使用,它包含如下四個模塊。(1)request:模擬發(fā)送HTTP請求。(2)error:處理HTTP請求錯誤時的異常。(3)parse:解析、拆分和合并URL。(4)robotparser:解析網(wǎng)站的robots.txt文件。2.2urllib庫2.2.3發(fā)送請求request模塊提供了基本的構(gòu)造HTTP請求的方法,同時它還可以處理授權(quán)驗(yàn)證(authentication)、重定向(redirection)、Cookie會話及其他內(nèi)容。本小節(jié)主要介紹通過urlopen()函數(shù)和Request()函數(shù)構(gòu)造HTTP請求的方法。2.2urllib庫2.2.3發(fā)送請求1.urlopen()函數(shù)urlopen()函數(shù)可以構(gòu)造基本的HTTP請求,其函數(shù)原型如下:urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)2.2urllib庫(1)url:請求的URL。可以是一個表示URL的字符串,也可以是一個Request類型的對象。這是必傳參數(shù),其他都是可選參數(shù)。(2)data:請求體信息(如在線翻譯,在線答題等提交的內(nèi)容)。data默認(rèn)值是None,表示以GET方式發(fā)送請求;當(dāng)用戶給出data參數(shù)時,表示以POST方式發(fā)送請求。(3)timeout:設(shè)置網(wǎng)站的訪問超時時間,單位為秒。如果請求超出了設(shè)置的時間而沒有得到響應(yīng),就會拋出異常。如果不指定該參數(shù),就會使用全局默認(rèn)時間。(4)cafile、capath、cadefault:用于實(shí)現(xiàn)可信任CA證書的HTTP請求,基本很少使用。(5)context:實(shí)現(xiàn)SSL加密傳輸,基本很少使用。2.2urllib庫Request類型的對象是調(diào)用urllib.request.Request()函數(shù)返回的對象,見本小節(jié)的Request()函數(shù)部分。urlopen()函數(shù)的data參數(shù)必須是bytes(字節(jié)流)類型,如果是字典類型,可以先用urllib.parse模塊的urlencode()函數(shù)編碼,見2.2.5小節(jié)。2.2urllib庫調(diào)用函數(shù)后,返回一個HTTPResponse類型的對象,該對象提供的方法和屬性如表2-5所示。方法和屬性說明getcode()/status獲取響應(yīng)狀態(tài)碼get_url()獲取請求的URLgetheaders()獲取響應(yīng)頭信息,返回二元組列表getheader(name)獲取特定響應(yīng)頭信息info()獲取響應(yīng)頭信息,返回字符串read()/readline()讀取響應(yīng)體表2-5HTTPResponse類型對象提供的方法和屬性2.2urllib庫urlopen()函數(shù)既可以實(shí)現(xiàn)GET請求(見例2-1),又可以通過設(shè)置data參數(shù)實(shí)現(xiàn)POST請求?!纠?-2】爬取有道在線翻譯網(wǎng)站,實(shí)現(xiàn)翻譯的過程,輸出爬取到的信息?!締栴}分析】首先,在GoogleChrome瀏覽器中訪問/;然后,打開瀏覽器的開發(fā)者工具窗口,選擇“Network”選項(xiàng);接著,在翻譯頁面中輸入需要翻譯的內(nèi)容,如“蘋果”,單擊“翻譯”按鈕;最后,在開發(fā)者工具窗口的請求記錄中選擇“translate_o?smartresult=dict&smartresult=rule”選項(xiàng),即可查看HTTP請求的URL和請求體(即為url和data參數(shù)),如圖2-6所示。2.2urllib庫圖2-6有道在線翻譯的POST請求信息2.2urllib庫【參考代碼】

importurllib.request #導(dǎo)入request模塊url='/translate?smartresult=dict&'\'smartresult=rule' #定義url字符串datavalue={'i':'蘋果','from':'AUTO','to':'AUTO','smartresult':'dict','client':'fanyideskweb','salt':'15924715113269','sign':'5c3a992ac57ed879b7678ff05bb3ec44','ts':'1592471511326',2.2urllib庫'bv':'c74c03c52496795b65595fdc27140f0f','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTlME'} #定義datavalue參數(shù)#編碼datavalue參數(shù)datavalue=urllib.parse.urlencode(datavalue).encode('utf-8')#構(gòu)造HTTP請求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen(url,data=datavalue)resp=response.read().decode('utf-8') #讀取網(wǎng)頁內(nèi)容并解碼print(resp) #輸出網(wǎng)頁內(nèi)容2.2urllib庫有道在線翻譯網(wǎng)站存在反爬蟲機(jī)制,在編寫爬蟲程序時需要將url中的“_o”去掉。2.2urllib庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-7所示。返回的響應(yīng)體中包含了翻譯的內(nèi)容和結(jié)果,如果想要修改翻譯的內(nèi)容,只需要修改data參數(shù)中“i”的值。圖2-7例2-2程序的運(yùn)行結(jié)果2.2urllib庫2.Request()函數(shù)當(dāng)HTTP請求信息較復(fù)雜時,可用Request()函數(shù)進(jìn)行設(shè)置,其函數(shù)原型如下:Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)2.2urllib庫(1)url:請求的URL。(2)data:請求體信息,其使用方法與urlopen()函數(shù)中的data參數(shù)相同。(3)headers:請求頭信息,如User_Agent、Cookie和Host等,是字典類型。(4)origin_req_host:客戶端的host名稱或者IP地址。(5)unverifiable:表示這個請求是無法驗(yàn)證的,在默認(rèn)情況下設(shè)置為False。(6)method:請求方法,如GET、POST等,是字符串類型。調(diào)用函數(shù)后,返回一個Request類型的對象,然后再通過urlopen()函數(shù)構(gòu)造完整的HTTP請求。當(dāng)服務(wù)器有反爬蟲機(jī)制時,可通過設(shè)置headers參數(shù)偽裝成瀏覽器去訪問網(wǎng)站。2.2urllib庫【例2-2】

通過設(shè)置headers參數(shù)偽裝成瀏覽器爬取有道在線翻譯網(wǎng)站的內(nèi)容(網(wǎng)址/),輸出爬取到的信息。importurllib.request #導(dǎo)入request模塊url='/' #定義url字符串#設(shè)置headersvalue參數(shù),偽裝成瀏覽器headersvalue={'User-Agent':'Mozilla/5.0(WindowsNT10.0;''Win64;x64)AppleWebKit/537.36''(KHTML,likeGecko)Chrome/''83.0.4103.97Safari/537.36'}2.2urllib庫#創(chuàng)建Request對象,并將返回的結(jié)果賦值給requestrequest=urllib.request.Request(url,headers=headersvalue)#構(gòu)造HTTP請求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen(request)resp=response.read().decode('utf-8') #讀取網(wǎng)頁內(nèi)容并解碼print(resp) #輸出網(wǎng)頁內(nèi)容2.2urllib庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-8所示。圖2-8例2-3程序的運(yùn)行結(jié)果2.2urllib庫2.2.4處理異常error模塊提供了request模塊產(chǎn)生的異常處理方法,它主要包含了URLError和HTTPError兩個類。(1)URLError類是error異常模塊的基類,可以捕獲request模塊產(chǎn)生的異常,它具有一個reason屬性(返回異常的原因)。(2)HTTPError類是URLError類的子類,專門處理HTTP請求的異常,它具有3個屬性,分別為reason(返回異常原因)、code(返回HTTP狀態(tài)碼)和headers(返回請求頭)。因?yàn)镠TTPError是URLError的子類,并不能處理父類支持的異常處理,所以一般對兩種異常分開捕獲,可先捕獲子類的異常,再捕獲父類的異常。2.2urllib庫【例2-3】

爬取不存在的網(wǎng)站內(nèi)容(如/api.htm),輸出異常原因。【問題分析】訪問一個不存在的網(wǎng)頁時,會出現(xiàn)異?,F(xiàn)象,程序可以通過捕獲異常,輸出異常原因,從而避免程序因?yàn)楫惓=K止運(yùn)行。2.2urllib庫【參考代碼】

importurllib.request #導(dǎo)入request模塊importurllib.error #導(dǎo)入error模塊try: #處理異常#構(gòu)造HTTP請求,并將返回的結(jié)果賦值給responseresponse=urllib.request.urlopen('/api.htm')excepturllib.error.HTTPErrorase: #捕獲HTTP請求的異常#輸出HTTP請求的異常原因、狀態(tài)碼和請求頭print('異常原因:',e.reason)print('狀態(tài)碼:',e.code)print('請求頭:\n',e.headers)2.2urllib庫【參考代碼】

excepturllib.error.URLErrorase: #捕獲URL異常 print(e.reason) #輸出URL異常原因else: #如果沒有異常則輸出“RequestSuccessfully” print('RequestSuccessfully')2.2urllib庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-9所示。圖2-9例2-4程序的運(yùn)行結(jié)果2.2urllib庫2.2.5解析URLparse模塊提供了解析URL的方法,包括URL的拆分、合并和轉(zhuǎn)換,其方法如表2-6所示。功能函數(shù)說明拆分urlparse(urlstring)將URL拆分為六個部分,分別是scheme、netloc、path、params、query和fragmenturlsplit(urlstring)將URL拆分為五個部分,分別是scheme、netloc、path、query和fragment表2-6解析URL的方法2.2urllib庫功能函數(shù)說明合并urljoin(url1,url2)將基礎(chǔ)鏈接url1和新鏈接url2合并,分析url1的scheme、netloc、path內(nèi)容,并補(bǔ)充url2缺失的部分urlunparse(parts)將可迭代對象parts合并為URL,parts長度為7urlunsplit(parts)將可迭代對象parts合并為URL,parts長度為6轉(zhuǎn)換

urlencode(query)將字典形式的數(shù)據(jù)轉(zhuǎn)換為URL后面的查詢字符串parse_qs(qs)將URL后面的查詢字符串轉(zhuǎn)換為字典parse_qsl(qs)將URL后面的查詢字符串轉(zhuǎn)換為列表quote(str)將URL中的中文字符轉(zhuǎn)換為URL編碼unquote(str)將URL編碼轉(zhuǎn)換為中文字符,進(jìn)行解碼表2-6解析URL的方法(續(xù))2.2urllib庫【例2-5】解析“/?path=file&keyfrom=Nav-doc”,輸出返回結(jié)果。importurllib.parse #導(dǎo)入parse模塊#定義url字符串url='/?path=file&keyfrom=Nav-doc'print(urllib.parse.urlparse(url)) #拆分url并輸出結(jié)果#合并url并輸出結(jié)果print(urllib.parse.urljoin('/','?path=file&keyfrom=Nav-doc'))#定義params字符串params={'path':'file','keyfrom':'Nav-doc'}【參考代碼】

2.2urllib庫#編碼params參數(shù),合并url并輸出結(jié)果print('/?'+urllib.parse.urlencode(params))query='path=file&keyfrom=Nav-doc' #定義query字符串print(urllib.parse.parse_qs(query)) #將query字符串轉(zhuǎn)換成字典print(urllib.parse.parse_qsl(query)) #將query字符串轉(zhuǎn)換成列表keyword='網(wǎng)絡(luò)爬蟲' 定義keyword中文字符串#將中文字符轉(zhuǎn)換為URL編碼,合并后賦值給urlurl='/?wd='+urllib.parse.quote(keyword)print(url) #輸出URL編碼的url#將URL編碼轉(zhuǎn)換為中文字符并輸出結(jié)果print(urllib.parse.unquote(url))2.2urllib庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-10所示。圖2-10例2-5程序的運(yùn)行結(jié)果2.2urllib庫2.2.6分析Robots協(xié)議robotparser模塊提供了分析網(wǎng)站Robots協(xié)議的RobotFileParser類,它可以通過分析網(wǎng)站的robots.txt文件來判斷某網(wǎng)頁是否能被爬取。RobotFileParser類提供了多種方法,常用的方法如下。2.2urllib庫(1)set_url():設(shè)置robots.txt文件的URL。(2)read():讀取robots.txt文件并進(jìn)行分析。(3)can_fetch():第一個參數(shù)為User_Agent,第二個參數(shù)為要爬取網(wǎng)頁的URL,判斷該網(wǎng)頁是否能被爬取。(4)parse():解析robots.txt文件中某些行的內(nèi)容。(5)mtime():返回上次抓取和分析robots.txt文件的時間。(6)modified():將當(dāng)前時間設(shè)置為上次抓取和分析robots.txt文件的時間。2.2urllib庫【例2-3】解析有道在線翻譯的robots.txt文件(網(wǎng)址/robots.txt),判斷百度爬蟲是否可以爬取有道網(wǎng)頁翻譯(/web2/index.html)和有道人工翻譯網(wǎng)頁(/?path=fast&keyfrom=Nav-fast),輸出判斷結(jié)果?!締栴}分析】首先創(chuàng)建RobotFileParser類對象,然后通過set_url()方法設(shè)置robots.txt文件的URL,接著利用read()方法讀取robots.txt文件并進(jìn)行分析,最后利用can_fetch()方法判斷網(wǎng)頁是否可以爬取,返回結(jié)果(True或False)。2.2urllib庫importurllib.robotparser #導(dǎo)入robotparser模塊#創(chuàng)建RobotFileParser類對象rprp=urllib.robotparser.RobotFileParser()#設(shè)置robots.txt文件的URLrp.set_url('/robots.txt')rp.read() #讀取robots.txt文件并進(jìn)行分析user_agent='Baiduspider' #定義爬蟲名稱#定義有道網(wǎng)頁翻譯的urlurl='/web2/index.html'【參考代碼】

2.2urllib庫#判斷是否可以爬取有道網(wǎng)頁翻譯并輸出判斷結(jié)果print(rp.can_fetch(user_agent,url))#定義有道人工翻譯網(wǎng)頁的urlurl='/?path=fast&keyfrom=Nav-fast'#判斷是否可以爬取有道人工翻譯網(wǎng)頁并輸出判斷結(jié)果print(rp.can_fetch(user_agent,url))2.2urllib庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-11所示。圖2-11例2-6程序的運(yùn)行結(jié)果.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲.Python網(wǎng)絡(luò)爬蟲SectionTitle2.3requests庫2.3requests庫2.3.1案例引入——爬取豆瓣網(wǎng)站的數(shù)據(jù)【例2-7】爬取豆瓣網(wǎng)的內(nèi)容(網(wǎng)址/),輸出爬取到的信息?!締栴}分析】使用get()函數(shù)發(fā)送HTTP請求,然后將HTTP響應(yīng)的各部分進(jìn)行輸出。2.3requests庫importrequests #導(dǎo)入requests模塊#發(fā)送HTTP請求,并將返回結(jié)果賦值給rr=requests.get('/')print('響應(yīng)類型:',type(r)) #輸出響應(yīng)類型print('請求的URL:',r.url) #輸出請求的URLprint('響應(yīng)狀態(tài)碼:',r.status_code) #輸出響應(yīng)狀態(tài)碼print('請求頭:',r.request.headers) #輸出請求頭【參考代碼】

2.3requests庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-12所示。圖2-12例2-7程序的運(yùn)行結(jié)果2.3requests庫2.3.2安裝requests庫上一小節(jié)學(xué)習(xí)了urllib庫的基本用法,使用起來比較煩瑣,而requests庫是對urllib庫的進(jìn)一步封裝,使用更加便捷。requests庫可以實(shí)現(xiàn)很多功能,包括URL獲取、HTTP長連接和連接緩存、HTTP會話、瀏覽器式的SSL驗(yàn)證、身份認(rèn)證、Cookie會話、文件分塊上傳、流下載、HTTP(S)代理功能、連接超時處理等。requests庫不是Python內(nèi)置的標(biāo)準(zhǔn)庫,使用之前需要安裝。安裝步驟如下。安裝requests庫2.3requests庫步驟一:啟動PyCharm,在菜單欄中選擇“File”→“Settings”選項(xiàng),如圖2-13所示。圖2-13設(shè)置項(xiàng)目

2.3requests庫步驟二:

打開“Settings”對話框,選擇“Project:conda_Test”→“ProjectInterpreter”選項(xiàng),然后在顯示的列表框的右側(cè)單擊“+”按鈕,如圖2-14所示。圖2-14選擇安裝項(xiàng)目2.3requests庫步驟三:打開“AvailablePackages”對話框,在搜索欄中輸入“requests”,然后在顯示的列表中選擇“requests”選項(xiàng),單擊“InstallPackage”按鈕,如圖2-15所示。圖2-15選擇安裝庫2.3requests庫步驟四:等待安裝,安裝成功后,對話框中將顯示“Package'requests'installedsuccessfully”(見圖2-16),關(guān)閉“AvailablePackages”對話框,單擊“Settings”對話框的“OK”按鈕完成安裝。圖2-16顯示安裝成功提示2.3requests庫如果需要卸載庫,可在“Settings”對話框的已安裝庫列表中選擇該庫,然后單擊右側(cè)的“-”按鈕進(jìn)行卸載。2.3requests庫2.3.3請求方法requests庫提供了幾乎所有的HTTP請求方法,其中最常用的是GET方法和POST方法。請求方法2.3requests庫1.GET方法urlopen()函數(shù)可以構(gòu)造基本的HTTP請求,其函數(shù)原型如下:(1)url:請求的URL。這是必傳參數(shù),其他都是可選參數(shù)。(2)params:字典或字節(jié)序列,作為參數(shù)增加到url中。(3)**kwargs:控制訪問的參數(shù),如headers、cookies、timeout和proxies等。調(diào)用函數(shù)后,返回一個Response類型的對象,該對象提供的屬性和方法如表2-7所示。get(url,params=None,**kwargs)2.3requests庫具體例子參見例2-7。屬性/方法說明status_code獲取響應(yīng)狀態(tài)碼headers獲取響應(yīng)頭request.headers獲取請求頭url獲取請求的URLencoding獲取從HTTPheaders中猜測的響應(yīng)內(nèi)容編碼方式apparent_encoding獲取從響應(yīng)內(nèi)容分析出的編碼方式content獲取二進(jìn)制類型的響應(yīng)內(nèi)容,會自動解碼gzip和deflate編碼的響應(yīng)內(nèi)容text獲取文本類型的響應(yīng)內(nèi)容json()返回JSON類型數(shù)據(jù)raise_for_status()若是status_code不是200,則會拋出異常表2-7Response類型對象提供的屬性和方法2.3requests庫2.POST方法POST方法通過post()函數(shù)實(shí)現(xiàn),其函數(shù)原型如下:(1)url:請求的URL。這是必傳參數(shù),其他都是可選參數(shù)。(2)data:字典、字節(jié)序列或文件對象,作為請求體的內(nèi)容。(3)json:JSON格式的數(shù)據(jù),作為請求體的內(nèi)容。(4)**kwargs:控制訪問的參數(shù),如params、headers、cookies、timeout和proxies等。post()函數(shù)同樣返回一個Response類型的對象。post(url,data=None,json=None,**kwargs)2.3requests庫【例2-8】模擬登錄豆瓣網(wǎng)站,輸出響應(yīng)對象的信息。【問題分析】首先,在GoogleChrome瀏覽器中訪問/,打開豆瓣網(wǎng)的登錄界面;然后,打開瀏覽器的開發(fā)者工具窗口,選擇“Network”選項(xiàng);接著,在豆瓣網(wǎng)的登錄界面輸入用戶名和密碼,登錄豆瓣網(wǎng);最后,在開發(fā)者工具窗口的請求記錄中選擇“basic”選項(xiàng),即可顯示HTTP請求的URL和請求體(即為url和data參數(shù)),如圖2-17所示。2.3requests庫圖2-17登錄豆瓣網(wǎng)的POST請求信息2.3requests庫FormData部分為提交的表單數(shù)據(jù),其中,name為賬戶名,password為密碼,remember為是否記住密碼,false表示不記住密碼。2.3requests庫importrequests #導(dǎo)入requests模塊datavalue={'name':'11111','password':'222222','remember':'false'} #定義datavalue參數(shù)#定義url字符串url='/j/mobile/login/basic'#發(fā)送HTTP請求,并將返回結(jié)果賦值給rr=requests.post(url,data=datavalue)【參考代碼】

2.3requests庫print(type(r)) #輸出返回對象類型print(r.url) #輸出請求的URLprint(r.status_code)

#輸出返回狀態(tài)碼print(r.request.headers)

#輸出請求頭2.3requests庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-18所示。圖2-18例2-8程序的運(yùn)行結(jié)果2.3requests庫requests庫實(shí)現(xiàn)HTTP其他基本請求的方法如下:requests.put('/') #PUT請求requests.delete('/') #DELETE請求requests.head('/') #HEAD請求requests.options('/') #OPTIONS請求2.3requests庫2.3.4傳遞URL參數(shù)有時網(wǎng)站會通過URL來傳遞查詢參數(shù),這時可使用get()函數(shù)或post()函數(shù)的params參數(shù)進(jìn)行設(shè)置。傳遞URL參數(shù)2.3requests庫【例2-9】在豆瓣網(wǎng)中查詢與Python相關(guān)的內(nèi)容,輸出url值。【問題分析】

首先以字典形式定義params參數(shù),然后將其傳遞到“/search”中,最后獲取url(/search?q=Python)。importrequests #導(dǎo)入requests模塊paramsvalue={'q':'Python'} #定義字典形式的paramsvalue參數(shù)值#將paramsvalue作為參數(shù)增加到url中并發(fā)送請求,將返回結(jié)果賦值給rr=requests.get('/search',params=paramsvalue)print(r.url) #輸出url2.3requests庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-19所示。圖2-19例2-9程序的運(yùn)行結(jié)果2.3requests庫2.3.5定制請求頭在requests庫中,get()或post()函數(shù)可以直接傳遞字典形式的User_Agent信息給headers參數(shù)實(shí)現(xiàn)定制請求頭。定制請求頭【例2-9】

通過定制請求頭爬取豆瓣網(wǎng)站的內(nèi)容(網(wǎng)址/),輸出爬取到的信息。2.3requests庫mportrequests #導(dǎo)入requests模塊url='/' #定義url字符串headersvalue={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.97Safari/537.36'} #設(shè)置請求頭的User-Agent信息#不設(shè)置headers,發(fā)送HTTP請求,并將返回結(jié)果賦值給rr=requests.get(url)【參考代碼】

2.3requests庫print(r.status_code) #輸出返回狀態(tài)print(r.request.headers) #輸出請求頭#設(shè)置headers,發(fā)送HTTP請求,并將返回結(jié)果賦值給rr=requests.get(url,headers=headersvalue)print(r.status_code) #輸出返回狀態(tài)print(r.request.headers) #輸出請求頭2.3requests庫【運(yùn)行結(jié)果】程序的運(yùn)行結(jié)果如圖2-20所示。圖2-20例2-10程序的運(yùn)行結(jié)果2.3requests庫從圖2-20可以看出,例2-10第一次發(fā)送HTTP請求時,請求頭中的User_Agent信息為Python的requests庫的版本信息,表示爬蟲程序發(fā)送該請求,且返回狀態(tài)碼是418,表示禁止爬蟲程序爬取該網(wǎng)站;而第二次設(shè)置為瀏覽器信息,返回狀態(tài)碼為200,表示偽裝成瀏覽器后成功爬取網(wǎng)站。所以,設(shè)置請求頭參數(shù)是應(yīng)對反爬蟲機(jī)制的一種有效方法。2.3requests庫2.3.6設(shè)置Cookie例2-8中利用post()函數(shù)登錄了豆瓣網(wǎng)頁,但是如果想要爬取豆瓣網(wǎng)站登錄后的內(nèi)容,還需要用到get()函數(shù)去請求頁面,這時候可直接利用Cookie來維持登錄狀態(tài)。設(shè)置Cookie2.3requests庫Cookie可以幫助用戶記錄訪問Web頁面時的個人信息,并保存在客戶端,當(dāng)用戶再次訪問同一Web頁面時,Cookie可以提供上次用戶訪問信息。2.3requests庫【例2-11】

通過設(shè)置Cookie爬取用戶登錄狀態(tài)下豆瓣網(wǎng)站內(nèi)容(網(wǎng)址/),輸出爬取到的信息。【問題分析】

登錄豆瓣網(wǎng),在GoogleChrome瀏覽器的開發(fā)者工具窗口中復(fù)制“RequestHeaders”中“Cookie”信息(見圖2-21),將其設(shè)置到程序的headers參數(shù)中。2.3requests庫圖2-21用戶狀態(tài)下豆瓣網(wǎng)的“Cookie”信息2.3requests庫importrequests #導(dǎo)入requests模塊headersvalue={ 'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/83.0.4103.97Safari/537.36','Cookie':'ll="108288";bid=FU35Y0eS-KI;_vwo_uuid_v2=D18B3319C1E99BBB6569C2519D7E87F51|5e9046ac929cff3665e02f4d7f9f68d7;__yadk_uid=5fkfy

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論