Python網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目式教程 課件 項(xiàng)目3-5 網(wǎng)絡(luò)爬蟲(chóng)初步之爬取豆瓣電影TOP250欄目、使用Requests庫(kù)爬取陽(yáng)光電影網(wǎng)、使用模擬登錄爬取古詩(shī)文網(wǎng)_第1頁(yè)
Python網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目式教程 課件 項(xiàng)目3-5 網(wǎng)絡(luò)爬蟲(chóng)初步之爬取豆瓣電影TOP250欄目、使用Requests庫(kù)爬取陽(yáng)光電影網(wǎng)、使用模擬登錄爬取古詩(shī)文網(wǎng)_第2頁(yè)
Python網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目式教程 課件 項(xiàng)目3-5 網(wǎng)絡(luò)爬蟲(chóng)初步之爬取豆瓣電影TOP250欄目、使用Requests庫(kù)爬取陽(yáng)光電影網(wǎng)、使用模擬登錄爬取古詩(shī)文網(wǎng)_第3頁(yè)
Python網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目式教程 課件 項(xiàng)目3-5 網(wǎng)絡(luò)爬蟲(chóng)初步之爬取豆瓣電影TOP250欄目、使用Requests庫(kù)爬取陽(yáng)光電影網(wǎng)、使用模擬登錄爬取古詩(shī)文網(wǎng)_第4頁(yè)
Python網(wǎng)絡(luò)爬蟲(chóng)項(xiàng)目式教程 課件 項(xiàng)目3-5 網(wǎng)絡(luò)爬蟲(chóng)初步之爬取豆瓣電影TOP250欄目、使用Requests庫(kù)爬取陽(yáng)光電影網(wǎng)、使用模擬登錄爬取古詩(shī)文網(wǎng)_第5頁(yè)
已閱讀5頁(yè),還剩263頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

項(xiàng)目三網(wǎng)絡(luò)爬蟲(chóng)初步之爬取豆瓣電影TOP250欄目

項(xiàng)目要

求本項(xiàng)目將使用Urllib2框架將網(wǎng)頁(yè)內(nèi)容進(jìn)行爬取,使用BeautiflSoup4將數(shù)據(jù)從HTML中提取出來(lái),讓后將提取出來(lái)的數(shù)據(jù)放到EXCEL表格和SQLite數(shù)據(jù)庫(kù)中保存,從而實(shí)現(xiàn)數(shù)據(jù)的可持續(xù)化存儲(chǔ)。

項(xiàng)目分

析要完成項(xiàng)目任務(wù),用到了Urllib請(qǐng)求網(wǎng)頁(yè),對(duì)接收到的響應(yīng)內(nèi)容使用BeautiflSoup4模塊進(jìn)行提取,數(shù)據(jù)持久化存儲(chǔ)這里使用到了SQLite輕量級(jí)數(shù)據(jù)庫(kù)。

項(xiàng)目目

標(biāo)【知識(shí)目標(biāo)】熟悉Urllib,掌握BeautiflSoup4的基礎(chǔ)知識(shí)、SQLite和Excel的使用。【能力目標(biāo)】會(huì)使用Urllib請(qǐng)求網(wǎng)頁(yè)、會(huì)使用BeautiflSoup4框架提取網(wǎng)頁(yè)內(nèi)容,會(huì)使用Sqlite和Excel進(jìn)行數(shù)據(jù)的持久化存儲(chǔ)?!舅刭|(zhì)目標(biāo)】提高學(xué)生的發(fā)現(xiàn)問(wèn)題、分析問(wèn)題、解決問(wèn)題的能力。

知識(shí)導(dǎo)

圖任務(wù)一Urllib框架請(qǐng)求網(wǎng)頁(yè)--任務(wù)演示本任務(wù)是使用Python內(nèi)置的HTTP請(qǐng)求庫(kù)Urllib向服務(wù)器發(fā)出HTTP請(qǐng)求,然后將請(qǐng)求的網(wǎng)頁(yè)進(jìn)行打印輸出。任務(wù)一Urllib框架請(qǐng)求網(wǎng)頁(yè)–知識(shí)準(zhǔn)備爬蟲(chóng)開(kāi)發(fā)的基本流程字符的編碼和解碼爬蟲(chóng)開(kāi)發(fā)的基本流程1.爬蟲(chóng)開(kāi)發(fā)的基本流程

根據(jù)網(wǎng)絡(luò)爬蟲(chóng)開(kāi)發(fā)的基本步驟是先向服務(wù)器發(fā)起HTTP請(qǐng)求,然后將請(qǐng)求到的網(wǎng)頁(yè)進(jìn)行解析,最后將得到的數(shù)據(jù)進(jìn)行保存,因此開(kāi)發(fā)一個(gè)網(wǎng)路爬蟲(chóng)的基本流程,可以總結(jié)如下:(1)準(zhǔn)備工作通過(guò)瀏覽器查看分析目標(biāo)網(wǎng)頁(yè),學(xué)習(xí)編程基礎(chǔ)規(guī)范。(2)獲取數(shù)據(jù)通過(guò)HTTP庫(kù)向目標(biāo)站點(diǎn)發(fā)起請(qǐng)求,請(qǐng)求可以包含額外的header等信息,如果服務(wù)器能正常響應(yīng),會(huì)得到一個(gè)Response,便是所要獲取的頁(yè)面內(nèi)容。1.爬蟲(chóng)開(kāi)發(fā)的基本流程(3)解析內(nèi)容

得到的內(nèi)容可能是HTML\JSON等格式,可以使用頁(yè)面解析庫(kù)、正則表達(dá)式等進(jìn)行解析。(4)保存數(shù)據(jù)

保存形式多樣,可以存為文本,也可以保存到數(shù)據(jù)庫(kù),或者保存特定格式的文件。2.Urllib框架的基本使用Urllib是Python內(nèi)置的HTTP請(qǐng)求庫(kù),該庫(kù)主要用來(lái)請(qǐng)求網(wǎng)絡(luò)資源。Urllib庫(kù)主要有4個(gè)模塊,具體模塊功能如下:模塊功能備注urllib.request請(qǐng)求模塊,用于發(fā)起網(wǎng)絡(luò)請(qǐng)求

urllib.parse解析模塊,用于解析URL

urllib.error異常處理模塊,用于處理request引起的異常

urllib.robotparserrobots.txt用于解析robots.txt文件

【大家注意】在Python2.X中,有Urllib庫(kù),也有Urllib2庫(kù),但是在最新的Python3.X中,將Urllib2合并到了Urllib中,這個(gè)庫(kù)在我們爬取網(wǎng)頁(yè)的時(shí)候會(huì)經(jīng)常用到。Urllib庫(kù)不需要安裝,只要導(dǎo)入就可以使用了。2.Urllib框架的基本使用

(1)urllib.request模塊request模塊主要負(fù)責(zé)構(gòu)造和發(fā)起網(wǎng)絡(luò)請(qǐng)求,并在其中添加Headers(請(qǐng)求頭)、Proxy(IP代理)等。利用它可以模擬瀏覽器的請(qǐng)求發(fā)起過(guò)程。該模塊主要有發(fā)起網(wǎng)絡(luò)請(qǐng)求、操作Cookie、添加Headers、使用代理等功能。2.Urllib框架的基本使用1)發(fā)起網(wǎng)絡(luò)請(qǐng)求urllib.request中主要有urlopen()函數(shù),該函數(shù)的原型為:urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)url:需要訪問(wèn)的網(wǎng)址data:Post提交的數(shù)據(jù),默認(rèn)為None,發(fā)送一個(gè)GET請(qǐng)求到指定的頁(yè)面,當(dāng)data不為None時(shí),發(fā)送的是POST請(qǐng)求。Timeout請(qǐng)求的超時(shí)參數(shù),單位為秒。可選的cafile和capath參數(shù)為HTTPS請(qǐng)求指定一組可信的CA證書(shū)。cafile應(yīng)指向包含一系列CA證書(shū)的單個(gè)文件,而capath應(yīng)指向散列證書(shū)文件的目錄。cadefault參數(shù)被忽略。urlopen返回對(duì)象提供以下八個(gè)方法,如表所示。2.Urllib框架的基本使用方法功能read()對(duì)HTTPResponse類(lèi)型數(shù)據(jù)進(jìn)行操作,獲取返回的數(shù)據(jù)readline()對(duì)HTTPResponse類(lèi)型數(shù)據(jù)進(jìn)行操作,讀取一行readlines()對(duì)HTTPResponse類(lèi)型數(shù)據(jù)進(jìn)行操作,獲取多行fileno()對(duì)HTTPResponse類(lèi)型數(shù)據(jù)進(jìn)行操作close()對(duì)HTTPResponse類(lèi)型數(shù)據(jù)進(jìn)行操作info()返回HTTPMessage對(duì)象,表示遠(yuǎn)程服務(wù)器返回的頭信息getcode()返回Http狀態(tài)碼。如果是http請(qǐng)求,200請(qǐng)求成功完成;404網(wǎng)址未找到geturl()返回請(qǐng)求的url

這里首先給出一個(gè)請(qǐng)求網(wǎng)頁(yè)的例子,使用了GET方法。01importurllib.request02url=''03response=urllib.request.urlopen(url)04print(response.read())2.Urllib框架的基本使用再來(lái)看一個(gè)GET請(qǐng)求的例子:01importurllib.request02importurllib.parse03response=urllib.request.urlopen("/get")04print(response.read().decode("utf-8"))運(yùn)行程序,結(jié)果如下:{"args":{},"headers":{"Accept-Encoding":"identity","Host":"","User-Agent":"Python-urllib/3.7","X-Amzn-Trace-Id":"Root=1-5f2f5457-0d128690cb4472f0da71b820"},"origin":"2","url":"/get"}2.Urllib框架的基本使用給出使用urllib.request請(qǐng)求網(wǎng)頁(yè)超時(shí)的例子,如下所示。01importurllib.request02url=''03try:04response=urllib.request.urlopen(url,0.01)05print(response.read())06exceptExceptionasresult:07print(result)urlopen方法會(huì)默認(rèn)會(huì)發(fā)送get請(qǐng)求,當(dāng)傳入data參數(shù)時(shí),則會(huì)發(fā)起POST請(qǐng)求。這里給出使用urllib.requst的POST請(qǐng)求的例子。01importurllib.request02url=''03data=b"Python"04try:05response=urllib.request.urlopen(url,data=data)06print(response.read())07exceptExceptionasresult:08print(result)2.Urllib框架的基本使用2)操作CookieCookie是瀏覽器支持的一種本地存儲(chǔ)機(jī)制。一般由服務(wù)端設(shè)置生成,在響應(yīng)請(qǐng)求時(shí)被自動(dòng)存儲(chǔ)在瀏覽器中。urllib.request可以對(duì)Cookie進(jìn)行操作,下面給出一個(gè)例子。01fromurllibimportrequest02fromhttpimportcookiejar03#創(chuàng)建一個(gè)cookie對(duì)象04cookie=cookiejar.CookieJar()05#創(chuàng)一個(gè)cookie處理器06cookies=request.HTTPCookieProcessor(cookie)07#以它為參數(shù),創(chuàng)建opener對(duì)象08opener=request.build_opener(cookies)09#使用這個(gè)opener來(lái)發(fā)請(qǐng)求10res=opener.open('/')11print(cookies.cookiejar)2.Urllib框架的基本使用3)設(shè)置代理運(yùn)行爬蟲(chóng)的時(shí)候,經(jīng)常會(huì)出現(xiàn)被封IP的情況,這時(shí)我們就需要使用ip代理來(lái)處理,urllib的IP代理的設(shè)置的范例代碼如下。01fromurllibimportrequest02proxy='46:9999'03proxy_support=request.ProxyHandler({'http':proxy})04opener=request.build_opener(proxy_support)05request.install_opener(opener)06result=request.urlopen('')07print(result)2.Urllib框架的基本使用4)添加Headers為了讓被爬取的網(wǎng)頁(yè)所在的服務(wù)器不被識(shí)別到是爬蟲(chóng),還可以偽裝請(qǐng)求頭。就是使用已有瀏覽器的請(qǐng)求頭,來(lái)請(qǐng)求網(wǎng)頁(yè),具體的范例代碼如下。01importurllib.request02url=""03#注意:在urllib中這種的headers是需要是字典的04headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64;rv:6.0)Gecko/20100101Firefox/6.0"}05req=urllib.request.Request(url=url,headers=headers)06file=urllib.request.urlopen(req)07print(file.read())2.Urllib框架的基本使用(2)urllib.parse模塊url.parse模塊定義了url的標(biāo)準(zhǔn)接口,實(shí)現(xiàn)url的各種抽取。parse模塊的使用:url的解析,合并,編碼,解碼。url.parse模塊包含了urlparse函數(shù),該函數(shù)主要是用于解析url中的參數(shù),對(duì)url按照一定格式進(jìn)行拆分或拼接。urlparse()把url拆分為6個(gè)部分,scheme(協(xié)議),netloc(域名),path(路徑),params(可選參數(shù)),query(連接鍵值對(duì)),fragment(特殊錨),并且以元組形式返回。下面通過(guò)一個(gè)例子來(lái)加以說(shuō)明。2.Urllib框架的基本使用01fromurllibimportparse02url='/weixin_43831576/article/details/84582424?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.channel_param'03"""04url:待解析的url05scheme='':假如解析的url沒(méi)有協(xié)議,可以設(shè)置默認(rèn)的協(xié)議,如果url有協(xié)議,設(shè)置此參數(shù)無(wú)效06allow_fragments=True:是否忽略錨點(diǎn),默認(rèn)為T(mén)rue表示不忽略,為False表示忽略07"""08result=parse.urlparse(url=url,scheme='http',allow_fragments=True)09print(result)10print(result.scheme)該段程序運(yùn)行結(jié)果為:ParseResult(scheme='https',netloc='',path='/weixin_43831576/article/details/84582424',params='',query='utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-10.channel_param',fragment='')https2.Urllib框架的基本使用url.parse模塊還包含了對(duì)url的構(gòu)造函數(shù),該函數(shù)為urlunparse(),請(qǐng)看下面的實(shí)例。運(yùn)行結(jié)果如圖所示:2.Urllib框架的基本使用(3)urllib.error模塊我們?cè)谂老x(chóng)的時(shí)候發(fā)請(qǐng)求的時(shí)候難免出現(xiàn)各種錯(cuò)誤,如訪問(wèn)不到服務(wù)器或者訪問(wèn)被禁止等等,出錯(cuò)了之后urllib將錯(cuò)誤信息封裝成了一個(gè)模塊對(duì)象中,這個(gè)模塊就叫error模塊。urllib.error模塊定義由urllib.request引發(fā)的異常類(lèi)。異常處理主要用到兩個(gè)類(lèi),urllib.error.URLError和urllib.error.HTTPError。URLError是urrlib.error異常類(lèi)的基類(lèi),具有reason屬性,返回錯(cuò)誤原因??梢圆东@由urllib.request產(chǎn)生的異常。引起該異常的主要原因是服務(wù)器連接失敗、服務(wù)器故障、遠(yuǎn)程URL地址不存在以及觸發(fā)了HTTPError等。下面通過(guò)一個(gè)例子加以說(shuō)明。01fromurllibimportrequest,error02url="https://www.baidu.cpm/"03try:04response=request.urlopen(url)05print(response.read())06excepterror.URLErrorasresult:07print(result)2.Urllib框架的基本使用上面例子中,請(qǐng)求一個(gè)不存在的網(wǎng)址,就觸發(fā)了一個(gè)異常。運(yùn)行結(jié)果如圖所示:下面我們通過(guò)請(qǐng)求一個(gè)存在的網(wǎng)址,但是請(qǐng)求的具體頁(yè)面不存在,我們使用這個(gè)HTTPError異常來(lái)進(jìn)行捕獲一下,請(qǐng)看下面的例子。01fromurllibimportrequest,error02url="/s/1232323xxxx"03try:04response=request.urlopen(url)05print(response.read())06excepterror.HTTPErrorasresult:07print(result)2.Urllib框架的基本使用運(yùn)行該程序,結(jié)果如圖。(4)urllib.robotparserrobots.txt模塊robots.txt一般指robots協(xié)議。robots協(xié)議也叫robots.txt(統(tǒng)一小寫(xiě))是一種存放于網(wǎng)站根目錄下的ASCII編碼的文本文件,它通常告訴網(wǎng)絡(luò)搜索引擎的漫游器(又稱(chēng)網(wǎng)絡(luò)蜘蛛),此網(wǎng)站中的哪些內(nèi)容是不應(yīng)被搜索引擎的漫游器獲取的,哪些是可以被漫游器獲取的。urllib.robotparser是專(zhuān)門(mén)用來(lái)解析robots.txt文件的。2.Urllib框架的基本使用此模塊提供單個(gè)類(lèi),RobotFileParser用于回答有關(guān)特定用戶(hù)代理是否可以在發(fā)布該robots.txt文件的網(wǎng)站上獲取URL的問(wèn)題。urllib.robotparser.RobotFileParser(url='robots.txt文件對(duì)應(yīng)的完整網(wǎng)址'),該類(lèi)提供了robots.txt應(yīng)該在url處讀取,解析和回答有關(guān)文件的問(wèn)題的方法。1)read()函數(shù)該函數(shù)用于獲取整個(gè)robots.txt文件。2)parse()函數(shù)該函數(shù)用于解析多少行。3)can_fetch(useragent,url)該函數(shù)表示返回True是否允許useragent

根據(jù)解析

文件中包含的規(guī)則獲取urlrobots.txt,也就是說(shuō)使用該方法來(lái)判斷某個(gè)網(wǎng)頁(yè)是否可以抓取。2.Urllib框架的基本使用4)mtime()函數(shù)返回robots.txt上次提取文件的時(shí)間。這對(duì)于需要robots.txt定期檢查新文件的長(zhǎng)期運(yùn)行的Web蜘蛛非常有用。5)modified()將robots.txt文件上次提取的時(shí)間設(shè)置為當(dāng)前時(shí)間。6)crawl_delay(使用者)返回有問(wèn)題的useragent的Crawl-delay參數(shù)值。這里給出一個(gè)例子。01importurllib.robotparser02rp=urllib.robotparser.RobotFileParser()03rp.set_url("/robots.txt")04rp.read()05print(rp.can_fetch("*",'/view/edeb9eaa49d7c1c708a1284ac850ad02df80070a.html?fr=search-1_income6'))2.Urllib框架的基本使用運(yùn)行程序,結(jié)果如圖:3.字符的編碼和解碼Python3默認(rèn)編碼為unicode,由str類(lèi)型進(jìn)行表示。二進(jìn)制數(shù)據(jù)使用bytes類(lèi)型表示,所以不會(huì)將str和bytes混在一起。在實(shí)際應(yīng)用中我們經(jīng)常需要將兩者進(jìn)行互轉(zhuǎn)。實(shí)際上,使用urllib.request.urlopen方法返回的數(shù)據(jù)是bytes數(shù)據(jù)類(lèi)型,而做數(shù)據(jù)解析的時(shí)候,往往需要的str類(lèi)型,故此時(shí)有必要對(duì)這些數(shù)據(jù)的類(lèi)型的轉(zhuǎn)換方法作一介紹。2.Urllib框架的基本使用01#-*-codeing=utf-8-*-02importurllib.request03response=urllib.request.urlopen("")04print(response)05print(type(response.read()))運(yùn)行程序,結(jié)果如圖。返回一個(gè)名為HTTPResponse的一個(gè)對(duì)象,該對(duì)象返回了請(qǐng)求到的網(wǎng)頁(yè)的所有信息??梢允褂胷esponse.read()方法讀取信息。print(response.read())此時(shí)可以得到整個(gè)網(wǎng)頁(yè)的源碼,但是此時(shí)顯示的源代碼還是不直觀。繼續(xù)修改以上的代碼。print(response.read().decode('utf-8'))2.Urllib框架的基本使用decode()方法以encoding指定的編碼格式解碼字符串。經(jīng)過(guò)decode()方法處理以后的編碼類(lèi)型為str型。注意:字符串在Python內(nèi)部的表示是unicode編碼,因此,在做編碼轉(zhuǎn)換時(shí),通常需要以u(píng)nicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再?gòu)膗nicode編碼(encode)成另一種編碼。要將bytes類(lèi)型的數(shù)據(jù)(字節(jié)碼)轉(zhuǎn)成str類(lèi)型,需要使用decode方法,也就是bytes>(decode)>str。要將str的數(shù)據(jù)轉(zhuǎn)成bytes型,需要使用encode,也就是str>(encode)>bytes。encode的作用是將unicode編碼轉(zhuǎn)換成其他編碼的字符串,如str.encode(‘utf-8’),表示將unicode編碼的字符串str轉(zhuǎn)換成utf-8編碼。2.Urllib框架的基本使用01importurllib.request02fromurllibimporterror03url="/"04response=urllib.request.urlopen(url).read()05print(type(response))#字節(jié)碼06response=response.decode('gb2312')07print(type(response))08response=response.encode('utf-8')09print(type(response))10wfile=open(r'./1.html',r'wb')11wfile.write(response)12wfile.close()運(yùn)行結(jié)果如圖。任務(wù)一Urllib框架請(qǐng)求網(wǎng)頁(yè)--任務(wù)實(shí)施有了urllib請(qǐng)求網(wǎng)頁(yè)的基本知識(shí)后,我們就可以使用urllib來(lái)進(jìn)行網(wǎng)頁(yè)的請(qǐng)求了。這里使用urllib的GET方法。1.

URL分析使用我們要爬取的頁(yè)面為/top250?start=25&filter,下面對(duì)該頁(yè)面做一些必要的分析。頁(yè)面包括250條電影數(shù)據(jù),分10頁(yè),每頁(yè)25條。每頁(yè)的URL的不同之處:最后的數(shù)值=(頁(yè)數(shù)-1)*25借助Chrome開(kāi)發(fā)者工具(F12)來(lái)分析網(wǎng)頁(yè),在Elements下找到需要的數(shù)據(jù)位置。使用Chrome瀏覽器輸入/top250?start=25&filter地址訪問(wèn)網(wǎng)頁(yè),然后按下F12進(jìn)入開(kāi)發(fā)者模式。2.編碼規(guī)范一般Python程序第一行需要加入#_*_coding:utf-8或者#coding=utf-8這樣可以在代碼中包含中文。在Python中,使用函數(shù)實(shí)現(xiàn)單一功能或相關(guān)聯(lián)功能的代碼段,可以提高可閱讀性和代碼重復(fù)利用率,函數(shù)代碼塊以def關(guān)鍵詞開(kāi)頭,后接空格、函數(shù)標(biāo)識(shí)符名稱(chēng)、圓括號(hào)、冒號(hào),括號(hào)中可以傳入?yún)?shù),函數(shù)段縮進(jìn)(Tab或四個(gè)空格,只能選一種),return用于結(jié)束函數(shù),可以返回一個(gè)值,也可以不帶任何表達(dá)式(表示返回None)。Python文件可以加入main函數(shù)用于測(cè)試程序:If__main__==”__main__”:Python使用#添加注釋?zhuān)f(shuō)明代碼(段)的作用3.爬取豆瓣電影TOP250這里需要爬取的網(wǎng)頁(yè)實(shí)際上有列表頁(yè)面和電影的詳情頁(yè)面,下面分別介紹這兩種網(wǎng)頁(yè)的爬取。首先考慮不分頁(yè)的情況,此時(shí)的目標(biāo)網(wǎng)頁(yè)如下:url=”/top250?start=0&filter”對(duì)應(yīng)的Python代碼如下:3.爬取豆瓣電影TOP25001defgetData(url):02#注意:在urllib中這種的headers是需要是字典的03headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64;rv:6.0)Gecko/20100101Firefox/6.0"}04req=urllib.request.Request(url=url,headers=headers)05file=urllib.request.urlopen(req).read()06print(type(file))#bytes類(lèi)型07response=file.decode('utf-8')08print(type(response))#str類(lèi)型09response=response.encode('utf-8')10print(response)11wfile=open(r'./page_index.html',r'wb')12wfile.write(response)13wfile.close()15returnresponse14importurllib.request15baseurl='/top250?start=0&filter'16#爬取列表頁(yè)17datalist=getData(baseurl)3.爬取豆瓣電影TOP250運(yùn)行上面程序,結(jié)果如下:<class'bytes'><class'str'>b'<!DOCTYPEhtml>\n<htmllang="zh-CN"class="ua-windowsua-ff6">\n<head>\n<metahttp-equiv="Content-Type"content="text/html;charset=utf-8">\n<metaname="renderer"content="webkit">\n<metaname="referrer"content="always">\n<metaname="google-site-verification"content="ok0wCgT20tBBgo9_zat2iAcimtN4Ftf5ccsh092Xeyw"/>….任務(wù)一Urllib框架請(qǐng)求網(wǎng)頁(yè)–任務(wù)拓展爬取的數(shù)據(jù)我們可以是Excel表格或數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)或csv文件進(jìn)行存儲(chǔ),這里我們先介紹一下如何使用csv進(jìn)行數(shù)據(jù)的保存。CSV實(shí)際上是逗號(hào)分隔值文件格式,逗號(hào)分隔值(Comma-SeparatedValues,CSV,有時(shí)也稱(chēng)為字符分隔值,因?yàn)榉指糇址部梢圆皇嵌禾?hào)),其文件以純文本形式存儲(chǔ)表格數(shù)據(jù)(數(shù)字和文本)。純文本意味著該文件是一個(gè)字符序列,不含必須像二進(jìn)制數(shù)字那樣被解讀的數(shù)據(jù)。CSV文件由任意數(shù)目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見(jiàn)的是逗號(hào)或制表符。通常,所有記錄都有完全相同的字段序列。通常都是純文本文件。建議使用WORDPAD或是記事本來(lái)開(kāi)啟,再則先另存新檔后用EXCEL開(kāi)啟,也是方法之一。任務(wù)一Urllib框架請(qǐng)求網(wǎng)頁(yè)–任務(wù)拓展接下來(lái)看下Python如何將數(shù)據(jù)寫(xiě)入csv文件并將其內(nèi)容打印輸出到控制臺(tái),這里給出參考代碼。01importcsv02withopen("test.csv","w",encoding='utf-8-sig')ascsvfile:03writer=csv.writer(csvfile)04#先寫(xiě)入列名05writer.writerow(["編號(hào)","列1","列2"])06#寫(xiě)入多行數(shù)據(jù)07writer.writerows([[0,1,2],[3,4,5],[6,7,8]])08#讀取csv文件用reader09withopen("test.csv","r",encoding='utf-8-sig')ascsvfile:10reader=csv.reader(csvfile)11foriteminreader:12iflen(item)!=0:13print(item)任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–任務(wù)演示本任務(wù)準(zhǔn)備使用Python內(nèi)置的HTTP請(qǐng)求庫(kù)Urllib向服務(wù)器發(fā)出HTTP請(qǐng)求,然后將請(qǐng)求的網(wǎng)頁(yè)使用BeautiflSoup4模塊進(jìn)行解析,提取該網(wǎng)頁(yè)中包含的圖片和電影標(biāo)題等內(nèi)容。任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–知識(shí)說(shuō)明本任務(wù)準(zhǔn)備使用Python內(nèi)置的HTTP請(qǐng)求庫(kù)Urllib向服務(wù)器發(fā)出HTTP請(qǐng)求,然后將請(qǐng)求的網(wǎng)頁(yè)使用BeautiflSoup4模塊進(jìn)行解析,提取該網(wǎng)頁(yè)中包含的圖片和電影標(biāo)題等內(nèi)容。任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–知識(shí)準(zhǔn)備BeautiflSoup4是Python解析HTML/XML非常好用的第三方庫(kù)。它主要借助網(wǎng)頁(yè)的結(jié)構(gòu)和屬性等特性來(lái)解析網(wǎng)頁(yè)。要使用BeautiflSoup4庫(kù),必須先進(jìn)行安裝,主要使用一下命令:pipinstallbeautiflsoup4

安裝完成以后應(yīng)該使用如下命令進(jìn)行導(dǎo)入:formbs4importBeautifulSoup1.BeautiflSoup4的四個(gè)對(duì)象BeautiflSoup4將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹(shù)形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以歸納為以下4種:TagNavigableStringBeautifulSoupComment(1)TagTag通俗點(diǎn)講就是HTML中的一個(gè)個(gè)標(biāo)簽。通過(guò)該標(biāo)簽可以找到該標(biāo)簽對(duì)應(yīng)的具體內(nèi)容,而且找到的第一個(gè)內(nèi)容。如在文檔:<pclass=‘title’>這是標(biāo)題</p>中,tag為p。接下來(lái)介紹一下Tag的兩大屬性:name和attribute。1.BeautiflSoup4的四個(gè)對(duì)象01frombs4importBeautifulSoup02str="""03<pclass='title'>這是標(biāo)題</p>04<pclass='sub_title'>這是副標(biāo)題</p>05"""06bs=BeautifulSoup(str,"html.parser")07print()08print(bs.p.attrs)運(yùn)行程序,結(jié)果如下:p{'class':['title']}1.BeautiflSoup4的四個(gè)對(duì)象再看一個(gè)例子。01frombs4importBeautifulSoup02file=open("./baidu.html","rb")03html=file.read()04bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器05print(bs.title)06print(bs.a)07print(bs.head)08print(type(bs.head)運(yùn)行程序,結(jié)果如下:<title>百度一下,你就知道</title><aclass="mnav"href=""name="tj_trnews">新聞</a><head><metacontent="text/html;charset=utf-8"http-equiv="Content-Type"/>…<class'bs4.element.Tag'>1.BeautiflSoup4的四個(gè)對(duì)象(2)NavigableString既然我們已經(jīng)得到了標(biāo)簽的內(nèi)容,那么問(wèn)題來(lái)了,我們要想獲取標(biāo)簽內(nèi)部的文字怎么辦呢?很簡(jiǎn)單,用.string方法就可以了。也就是說(shuō),使用用NavigableString,可以獲取標(biāo)簽里的內(nèi)容。下面通過(guò)一個(gè)例子加以說(shuō)明。01frombs4importBeautifulSoup02file=open("./baidu.html","rb")03html=file.read()04bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器05print(bs.title)06print(type(bs.title.string))07print(bs.title.string)運(yùn)行程序,結(jié)果如下:<title>百度一下,你就知道</title><class'bs4.element.NavigableString'>百度一下,你就知道1.BeautiflSoup4的四個(gè)對(duì)象(3)BeautifulSoupBeautifulSoup表示整個(gè)文檔對(duì)象。BeautifulSoup

對(duì)象表示的是一個(gè)文檔的全部?jī)?nèi)容.大部分時(shí)候,可以把它當(dāng)作Tag對(duì)象,是一個(gè)特殊的Tag,我們可以分別獲取它的類(lèi)型,名稱(chēng),以及屬性。01frombs4importBeautifulSoup02file=open("./baidu.html","rb")03html=file.read()04bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器05print(bs)06print("bs的屬性為:")07print(type(bs))1.BeautiflSoup4的四個(gè)對(duì)象運(yùn)行程序,結(jié)果如下:<!--DOCTPYEhtml--><html><head><metacontent="text/html;charset=utf-8"http-equiv="Content-Type"/><metacontent="IE=edge,chrome=1"http-equiv="X-UA-Compatible"/>…bs的屬性為:<class'bs4.BeautifulSoup'>1.BeautiflSoup4的四個(gè)對(duì)象(4)CommentComment是一個(gè)特殊的NavigableString,它可以取得標(biāo)簽內(nèi)字符串的注釋部分內(nèi)容,但是輸出的內(nèi)容不再包含注釋符號(hào)。frombs4importBeautifulSoupimportbs4str='<ahref="/"class="sister"id="link1"><!--ThisisComment--></a>'soup=BeautifulSoup(str,'html.parser')print(soup.a.string)#獲取了注釋部分的內(nèi)容print("soup.a.string的屬性為:")print(type(soup.a.string))運(yùn)行程序,結(jié)果如下:ThisisCommentsoup.a.string的屬性為:<class'bs4.element.Comment'>2.文檔的遍歷BeautiflSoup中可以遍歷子節(jié)點(diǎn)、所有子孫節(jié)點(diǎn)以及父節(jié)點(diǎn)以及所有父節(jié)點(diǎn),以及獲取其內(nèi)容。(1)contentscontents獲取Tag的所有節(jié)點(diǎn),返回一個(gè)list。也就是說(shuō)Tag的content屬性可以將tag的子節(jié)點(diǎn)以列表的方式輸出。舉例如下:01html="""02<html><head>03<metacontent="always"name="referrer"/>04<metacontent="#2932e1"name="theme-color"/>05<metacontent="百度"name="description"/>06….

28"""29frombs4importBeautifulSoup30bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器31print(bs.head.contents)32print(bs.head.contents[1])2.文檔的遍歷運(yùn)行結(jié)果如下:['\n',<metacontent="always"name="referrer"/>,'\n',<metacontent="#2932e1"name="theme-color"/>,'\n',<metacontent="百度"name="description"/>,'\n',<linkhref="/favicon.ico"rel="shortcuticon"type="image/x-icon"/>,'\n',<linkhref="/content-search.xml"rel="search"title="百度"type="application/opensearchdescription+xml"/>,'\n',<linkhref="http:///img/baidu_85beaf5496f291521eb75ba38eacbd87.svg"mask=""rel="icon"sizes="any"/>,'\n',<linkhref="/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css"rel="stylesheet"/>,'\n',<title>百度首頁(yè)</title>]<metacontent="always"name="referrer"/>2.文檔的遍歷(2)childrenchildren獲取Tag的所有子節(jié)點(diǎn),它返回的不是一個(gè)list,而是一個(gè)列表生成器對(duì)象。不過(guò)我們可以通過(guò)遍歷獲取所有子節(jié)點(diǎn)。01html="""02此處內(nèi)容同上一個(gè)例子03"""04frombs4importBeautifulSoup05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06print("bs.head.children的類(lèi)型為:")07print(bs.head.children)08foriteminbs.head.children:09print(item)運(yùn)行結(jié)果為:bs.head.children的類(lèi)型為:<list_iteratorobjectat0x0000019BB04274A8>bs.head.children遍歷出的內(nèi)容為:<metacontent="always"name="referrer"/>2.文檔的遍歷(3)descendants.contents和.children屬性?xún)H包含tag的直接子節(jié)點(diǎn),.descendants屬性可以對(duì)所有tag的子孫節(jié)點(diǎn)進(jìn)行遞歸循環(huán),和children類(lèi)似,要獲取其中的內(nèi)容,我們需要對(duì)其進(jìn)行遍歷。01html="""02<html><head>03<metacontent="always"name="referrer"/>04<metacontent="#2932e1"name="theme-color"/>05<metacontent="百度"name="description"/>06<linkhref="/favicon.ico"rel="shortcuticon"type="image/x-icon"/>07…08"""

28frombs4importBeautifulSoup29bs=BeautifulSoup(html,"html.parser")#使用了htmla.parser解析器30print("bs.head.descendants的類(lèi)型為:")31print(bs.head.descendants)32print("bs.head.children遍歷出的內(nèi)容為:")33foriteminbs.head.descendants:34print(item)2.文檔的遍歷運(yùn)行結(jié)果如下:bs.head.descendants的類(lèi)型為:<generatorobjectTag.descendantsat0x000001A731D74570>bs.head.children遍歷出的內(nèi)容為:<metacontent="always"name="referrer"/>(4)string和strings方法獲取文件的內(nèi)容如果一個(gè)標(biāo)簽里面沒(méi)有標(biāo)簽了,那么.string就會(huì)返回標(biāo)簽里面的內(nèi)容,如果tag包含了多個(gè)子節(jié)點(diǎn),tag就無(wú)法確定,string方法應(yīng)該調(diào)用哪個(gè)子節(jié)點(diǎn)的內(nèi)容,.string的輸出結(jié)果是None。.string方法此時(shí)需要遍歷獲取,.stripped_strings

輸出的字符串中可能包含了很多空格或空行,使用.stripped_strings可以去除多余空白內(nèi)容。2.文檔的遍歷01"""02#html="""03#此處內(nèi)容同上一個(gè)例子04#"""05frombs4importBeautifulSoup06bs=BeautifulSoup(html,"html.parser")#使用了htmla.parser解析器07print(bs.title.string)08print("*****"*20)09foriteminbs.body.strings:10print(item)11print("*****"*20)12foriteminbs.body.stripped_strings:13print(item)運(yùn)行程序,結(jié)果如下:百度首頁(yè)*******************************************************************************新聞2.文檔的遍歷(5)parent屬性和parents屬性parent屬性用來(lái)表示遍歷父節(jié)點(diǎn),parents屬性用來(lái)表示遍歷所有父節(jié)點(diǎn),請(qǐng)看下面的實(shí)例。01html="""02<html><head>03<metacontent="always"name="referrer"/>04<metacontent="#2932e1"name="theme-color"/>05<metacontent="百度"name="description"/>06…30"""31frombs4importBeautifulSoup32bs=BeautifulSoup(html,"html.parser")#使用了htmla.parser解析器33p=bs.p34print()35title=bs.head.title.string36print(title)37print("***"*20)38foritemintitle.parents:39print()2.文檔的遍歷運(yùn)行程序,結(jié)果如下。div百度首頁(yè)************************************************************titleheadhtml[document]3.文檔的搜索運(yùn)行程序,結(jié)果如下。

BeautiflSoup還提供了模塊的搜索功能,根據(jù)標(biāo)簽名稱(chēng)、標(biāo)簽屬性、文檔文本和正則表達(dá)式來(lái)搜索。(1)find_all()find_all()方法根據(jù)指定的參數(shù),查找指定的節(jié)點(diǎn),而且是找出所有符合條件的節(jié)點(diǎn)。該函數(shù)的原型為:find_all(name,attrs,recursive,text,**kwargs)name:基于name參數(shù),進(jìn)行標(biāo)簽的查找attrs:基于attrs參數(shù),進(jìn)行標(biāo)簽屬性的查找recursive:基于正則表達(dá)式的查找text:基于text參數(shù),進(jìn)行查找**kwargs:基于函數(shù)的查找3.文檔的搜索1)基于name參數(shù)的查找基于name參數(shù),對(duì)標(biāo)簽進(jìn)行查找??梢砸匀魏螛?biāo)簽的名字來(lái)進(jìn)行查找,查找該標(biāo)簽第一次出現(xiàn)的地方。找到該標(biāo)簽以后,返回一個(gè)BeautifulSoup的標(biāo)簽對(duì)象。01frombs4importBeautifulSoup02file=open("./baidu.html","rb")03html=file.read()04bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器05t_list=bs.find_all("a")06print(t_list)3.文檔的搜索運(yùn)行程序,結(jié)果如下:[<aclass="mnav"href=""name="tj_trnews"><!--新1聞--></a>,<aclass="mnav"href=""name="tj_trnews">新聞</a>,<aclass="mnav"href=""name="tj_trhao123">hao123</a>,<aclass="mnav"href=""name="tj_trmap">地圖</a>,<aclass="mnav"href=""name="tj_trvideo">視頻</a>,<aclass="mnav"href=""name="tj_trtieba">貼吧</a>,<aclass="bri"href="/more"name="tj_triicon">更多產(chǎn)品</a>]3.文檔的搜索2)使用函數(shù)進(jìn)行匹配01frombs4importBeautifulSoup02importre03file=open("./baidu.html","rb")04html=file.read()05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06defname_is_exitsts(tag):07returntag.has_attr("name")08t_list=bs.find_all(name_is_exitsts)09foritemint_list:10print(item)運(yùn)行程序,結(jié)果如下:<metacontent="always"name="referrer"/><metacontent="#2932e1"name="theme-color"/><metacontent="百度"name="description"/><aclass="mnav"href=""name="tj_trnews"><!--新1聞--></a><aclass="mnav"href=""name="tj_trnews">新聞</a><aclass="mnav"href=""name="tj_trhao123">hao123</a><aclass="mnav"href=""name="tj_trmap">地圖</a>3.文檔的搜索2)使用參數(shù)進(jìn)行搜索find_all()函數(shù)中可以進(jìn)行標(biāo)簽屬性的查找,可以跟上id=”head”這樣的參數(shù)進(jìn)行搜索查找。01frombs4importBeautifulSoup02importre03file=open("./baidu.html","rb")04html=file.read()05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06t_list=bs.find_all(id="head")07foritemint_list:08print(item)運(yùn)行程序,結(jié)果如下:<divid="head"><divclass="head_wrapper"><divid="u1"><aclass="mnav"href=""name="tj_trnews"><!--新1聞--></a><aclass="mnav"href=""name="tj_trnews">新聞</a><aclass="mnav"href=""name="tj_trhao123">hao123</a><aclass="mnav"href=""name="tj_trmap">地圖</a>3.文檔的搜索上面例子結(jié)果反映出了找到了id=head的所有內(nèi)容。如果要找到所有class=“mnav”的所有內(nèi)容,可以使用如下代碼:4)使用text參數(shù)如果我們要查找文檔中內(nèi)容為hao123的內(nèi)容,則可以使用find_all(text=”hao123”)的這個(gè)方法。01frombs4importBeautifulSoup02importre03file=open("./baidu.html","rb")04html=file.read()05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06t_list=bs.find_all(text="hao123")07foritemint_list:08print(item)3.文檔的搜索上面例子結(jié)果反映出了找到了id=head的所有內(nèi)容。如果要找到所有class=“mnav”的所有內(nèi)容,可以使用如下代碼:4)使用text參數(shù)如果我們要查找文檔中內(nèi)容為hao123的內(nèi)容,則可以使用find_all(text=”hao123”)的這個(gè)方法。01frombs4importBeautifulSoup02importre03file=open("./baidu.html","rb")04html=file.read()05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06t_list=bs.find_all(text="hao123")07foritemint_list:08print(item)3.文檔的搜索運(yùn)行程序,結(jié)果如下。hao123對(duì)于查找特殊的文本,還可以用下面的方法。t_list=bs.find_all(text=pile("\d"))#利用正則表達(dá)式查找包含數(shù)字的文本如果要查找多個(gè)文本內(nèi)容,還可以是以下方式。t_list=bs.find_all(text=["新聞","地圖","hao123"])也就是說(shuō)text后面還可以跟一個(gè)列表。3.文檔的搜索5)基于正則表達(dá)式進(jìn)行查找01html="""02<html><head>03<title>百度首頁(yè)</title></head>04<body>05<bodylink="#0000cc">06<divid="wrapper">07<divid="head">08<divclass="head_wrapper">09<span>qiantomyou@</span>10…22</html>23"""24frombs4importBeautifulSoup25importre26key=pile('\w+@\w+\.\w+')27bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器28print(bs.find_all(text=key))3.文檔的搜索運(yùn)行結(jié)果,如下。['qiantomyou@']6)limit參數(shù)對(duì)于查找到的內(nèi)容可以限制條數(shù),這時(shí)可以使用limit參數(shù)。01frombs4importBeautifulSoup02importre03file=open("./baidu.html","rb")04html=file.read()05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06t_list=bs.find_all(class_="mnav",limit=3)07foritemint_list:print(item)運(yùn)行程序,結(jié)果如下。<aclass="mnav"href=""name="tj_trnews"><!--新1聞--></a><aclass="mnav"href=""name="tj_trnews">新聞</a><aclass="mnav"href=""name="tj_trhao123">hao123</a>3.文檔的搜索['qiantomyou@']6)limit參數(shù)對(duì)于查找到的內(nèi)容可以限制條數(shù),這時(shí)可以使用limit參數(shù)。01frombs4importBeautifulSoup02importre03file=open("./baidu.html","rb")04html=file.read()05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06t_list=bs.find_all(class_="mnav",limit=3)07foritemint_list:print(item)運(yùn)行程序,結(jié)果如下。<aclass="mnav"href=""name="tj_trnews"><!--新1聞--></a><aclass="mnav"href=""name="tj_trnews">新聞</a><aclass="mnav"href=""name="tj_trhao123">hao123</a>3.文檔的搜索運(yùn)行結(jié)果,如下。1)通過(guò)標(biāo)簽來(lái)查找01t_list=bs.select('title')02foritemint_list:03print(item)2)通過(guò)類(lèi)名來(lái)查找01t_list=bs.select(".mnav")02foritemint_list:03print(item)3)通過(guò)ID來(lái)查找01t_list=bs.select("#u1")02foritemint_list:03print(item)3.文檔的搜索運(yùn)行結(jié)果,如下。4)通過(guò)屬性來(lái)查找01t_list=bs.select("a[name='tj_trmap']")02foritemint_list:03print(item)5)通過(guò)子標(biāo)簽來(lái)查找01t_list=bs.select("head>title")02print(t_list)6)通過(guò)兄弟標(biāo)簽來(lái)查找t_list=bs.select(".mnav~.bri")print(t_list[0].get_text())任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–任務(wù)實(shí)施

有了將網(wǎng)頁(yè)的進(jìn)行爬取的相關(guān)知識(shí)后,又學(xué)習(xí)了BeautiflSoup解析網(wǎng)頁(yè)的知識(shí),接下來(lái),可以對(duì)豆瓣電影的列表數(shù)據(jù)進(jìn)行解析了。01defgetData(url):02#注意:在urllib中這種的headers是需要是字典的03headers={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64;rv:6.0)Gecko/20100101Firefox/6.0"}04req=urllib.request.Request(url=url,headers=headers)05file=urllib.request.urlopen(req).read()06response=file.decode('utf-8')07response=response.encode('utf-8')08wfile=open(r'./page_index.html',r'wb')09wfile.write(response)10wfile.close()11returnresponse12movielist=[]13moviepic=[]14movietitle=[]15importurllib.request16baseurl='/top250?start=0&filter'任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–任務(wù)實(shí)施17#爬取列表頁(yè)18datalist=getData(baseurl)19frombs4importBeautifulSoup20importre21bs=BeautifulSoup(datalist,"html.parser")22pagelist=bs.find_all("div",class_="item")23foriteminpagelist:#找到分頁(yè)頁(yè)面中的每個(gè)超鏈接24a=item.find('div',class_="hd").a25link=a.attrs['href']26movielist.append(link)27print("此分頁(yè)中一共找到的每個(gè)電影超鏈接為:")28print(movielist)任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–任務(wù)實(shí)施29print("****"*30)30#找到分頁(yè)中的圖片31foriteminpagelist:#找到分頁(yè)頁(yè)面中的每個(gè)電影圖片32link=item.find('img').get("src")33moviepic.append(link)34print("此分頁(yè)中一共找到的每個(gè)電影圖片為:")35print(moviepic)36print("****"*30)37print("此分頁(yè)中一共找到的每個(gè)電影標(biāo)題為:")38foriteminpagelist:#找到分頁(yè)頁(yè)面中的每個(gè)電影標(biāo)題39link=item.find('span',class_='title').get_text()40movietitle.append(link)41print(movietitle)任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–任務(wù)實(shí)施運(yùn)行程序結(jié)果如下:此分頁(yè)中一共找到的每個(gè)電影超鏈接為:['/subject/1292052/','/subject/1291546/','/subject/1292720/','/subject/1295644/’,…此分頁(yè)中一共找到的每個(gè)電影圖片為:['/view/photo/s_ratio_poster/public/p480747492.jpg','/view/photo/s_ratio_poster/public/p2561716440.jpg','/view/photo/s_ratio_poster/public/p2372307693.jpg','/view/photo/s_ratio_poster/public/p511118051.jpg’,…任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–任務(wù)拓展

解析網(wǎng)頁(yè)數(shù)據(jù),我們除了使用BeautiflSoup自帶的方法之外,我們還可以使用Python的正則表達(dá)式模塊進(jìn)行解析。01defgetData(html):#解析數(shù)據(jù)02frombs4importBeautifulSoup03importre04datalist=[]05findLink=pile(r'<ahref="(.*?)">')#創(chuàng)建正則表達(dá)式對(duì)象,表示規(guī)則06#影片的片名07findTitle=pile(r'<spanclass="title">(.*)</span>')08#影片圖片的鏈接規(guī)則09findImgSrc=pile(r'<img.*src="(.*?)"',re.S)#忽略換行符10#影片的評(píng)分11findRating=pile(r'<spanclass="rating_num"property="v:average">(.*)</span>')12#評(píng)價(jià)人數(shù)13findJudge=pile(r'<span>(\d)人評(píng)價(jià)</span>')14#概況任務(wù)二BeautiflSoup4解析網(wǎng)頁(yè)–任務(wù)拓展

解析網(wǎng)頁(yè)數(shù)據(jù),我們除了使用BeautiflSoup自帶的方法之外,我們還可以使用Python的正則表達(dá)式模塊進(jìn)行解析。15findInq=pile(r'<spanclass="inq">(.*)</span>')16#找到影片的相關(guān)內(nèi)容17findBd=pile(r'<pclass="">(.*?)</p>',re.S)18#2.逐一解析數(shù)據(jù)19soup=BeautifulSoup(html,"html.parser")20foriteminsoup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表21data=[]#保存一步電影的所有信息22item=str(item)23link=re.findall(findLink,item)[0]#獲取影片

溫馨提示

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

評(píng)論

0/150

提交評(píng)論