Python網絡爬蟲項目式教程 課件 項目3-5 網絡爬蟲初步之爬取豆瓣電影TOP250欄目、使用Requests庫爬取陽光電影網、使用模擬登錄爬取古詩文網_第1頁
Python網絡爬蟲項目式教程 課件 項目3-5 網絡爬蟲初步之爬取豆瓣電影TOP250欄目、使用Requests庫爬取陽光電影網、使用模擬登錄爬取古詩文網_第2頁
Python網絡爬蟲項目式教程 課件 項目3-5 網絡爬蟲初步之爬取豆瓣電影TOP250欄目、使用Requests庫爬取陽光電影網、使用模擬登錄爬取古詩文網_第3頁
Python網絡爬蟲項目式教程 課件 項目3-5 網絡爬蟲初步之爬取豆瓣電影TOP250欄目、使用Requests庫爬取陽光電影網、使用模擬登錄爬取古詩文網_第4頁
Python網絡爬蟲項目式教程 課件 項目3-5 網絡爬蟲初步之爬取豆瓣電影TOP250欄目、使用Requests庫爬取陽光電影網、使用模擬登錄爬取古詩文網_第5頁
已閱讀5頁,還剩263頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目三網絡爬蟲初步之爬取豆瓣電影TOP250欄目

項目要

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

項目分

析要完成項目任務,用到了Urllib請求網頁,對接收到的響應內容使用BeautiflSoup4模塊進行提取,數(shù)據(jù)持久化存儲這里使用到了SQLite輕量級數(shù)據(jù)庫。

項目目

標【知識目標】熟悉Urllib,掌握BeautiflSoup4的基礎知識、SQLite和Excel的使用?!灸芰δ繕恕繒褂肬rllib請求網頁、會使用BeautiflSoup4框架提取網頁內容,會使用Sqlite和Excel進行數(shù)據(jù)的持久化存儲?!舅刭|目標】提高學生的發(fā)現(xiàn)問題、分析問題、解決問題的能力。

知識導

圖任務一Urllib框架請求網頁--任務演示本任務是使用Python內置的HTTP請求庫Urllib向服務器發(fā)出HTTP請求,然后將請求的網頁進行打印輸出。任務一Urllib框架請求網頁–知識準備爬蟲開發(fā)的基本流程字符的編碼和解碼爬蟲開發(fā)的基本流程1.爬蟲開發(fā)的基本流程

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

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

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

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

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

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

【大家注意】在Python2.X中,有Urllib庫,也有Urllib2庫,但是在最新的Python3.X中,將Urllib2合并到了Urllib中,這個庫在我們爬取網頁的時候會經常用到。Urllib庫不需要安裝,只要導入就可以使用了。2.Urllib框架的基本使用

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

這里首先給出一個請求網頁的例子,使用了GET方法。01importurllib.request02url=''03response=urllib.request.urlopen(url)04print(response.read())2.Urllib框架的基本使用再來看一個GET請求的例子:01importurllib.request02importurllib.parse03response=urllib.request.urlopen("/get")04print(response.read().decode("utf-8"))運行程序,結果如下:{"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請求網頁超時的例子,如下所示。01importurllib.request02url=''03try:04response=urllib.request.urlopen(url,0.01)05print(response.read())06exceptExceptionasresult:07print(result)urlopen方法會默認會發(fā)送get請求,當傳入data參數(shù)時,則會發(fā)起POST請求。這里給出使用urllib.requst的POST請求的例子。01importurllib.request02url=''03data=b"Python"04try:05response=urllib.request.urlopen(url,data=data)06print(response.read())07exceptExceptionasresult:08print(result)2.Urllib框架的基本使用2)操作CookieCookie是瀏覽器支持的一種本地存儲機制。一般由服務端設置生成,在響應請求時被自動存儲在瀏覽器中。urllib.request可以對Cookie進行操作,下面給出一個例子。01fromurllibimportrequest02fromhttpimportcookiejar03#創(chuàng)建一個cookie對象04cookie=cookiejar.CookieJar()05#創(chuàng)一個cookie處理器06cookies=request.HTTPCookieProcessor(cookie)07#以它為參數(shù),創(chuàng)建opener對象08opener=request.build_opener(cookies)09#使用這個opener來發(fā)請求10res=opener.open('/')11print(cookies.cookiejar)2.Urllib框架的基本使用3)設置代理運行爬蟲的時候,經常會出現(xiàn)被封IP的情況,這時我們就需要使用ip代理來處理,urllib的IP代理的設置的范例代碼如下。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為了讓被爬取的網頁所在的服務器不被識別到是爬蟲,還可以偽裝請求頭。就是使用已有瀏覽器的請求頭,來請求網頁,具體的范例代碼如下。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的標準接口,實現(xiàn)url的各種抽取。parse模塊的使用:url的解析,合并,編碼,解碼。url.parse模塊包含了urlparse函數(shù),該函數(shù)主要是用于解析url中的參數(shù),對url按照一定格式進行拆分或拼接。urlparse()把url拆分為6個部分,scheme(協(xié)議),netloc(域名),path(路徑),params(可選參數(shù)),query(連接鍵值對),fragment(特殊錨),并且以元組形式返回。下面通過一個例子來加以說明。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沒有協(xié)議,可以設置默認的協(xié)議,如果url有協(xié)議,設置此參數(shù)無效06allow_fragments=True:是否忽略錨點,默認為True表示不忽略,為False表示忽略07"""08result=parse.urlparse(url=url,scheme='http',allow_fragments=True)09print(result)10print(result.scheme)該段程序運行結果為: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模塊還包含了對url的構造函數(shù),該函數(shù)為urlunparse(),請看下面的實例。運行結果如圖所示:2.Urllib框架的基本使用(3)urllib.error模塊我們在爬蟲的時候發(fā)請求的時候難免出現(xiàn)各種錯誤,如訪問不到服務器或者訪問被禁止等等,出錯了之后urllib將錯誤信息封裝成了一個模塊對象中,這個模塊就叫error模塊。urllib.error模塊定義由urllib.request引發(fā)的異常類。異常處理主要用到兩個類,urllib.error.URLError和urllib.error.HTTPError。URLError是urrlib.error異常類的基類,具有reason屬性,返回錯誤原因。可以捕獲由urllib.request產生的異常。引起該異常的主要原因是服務器連接失敗、服務器故障、遠程URL地址不存在以及觸發(fā)了HTTPError等。下面通過一個例子加以說明。01fromurllibimportrequest,error02url="https://www.baidu.cpm/"03try:04response=request.urlopen(url)05print(response.read())06excepterror.URLErrorasresult:07print(result)2.Urllib框架的基本使用上面例子中,請求一個不存在的網址,就觸發(fā)了一個異常。運行結果如圖所示:下面我們通過請求一個存在的網址,但是請求的具體頁面不存在,我們使用這個HTTPError異常來進行捕獲一下,請看下面的例子。01fromurllibimportrequest,error02url="/s/1232323xxxx"03try:04response=request.urlopen(url)05print(response.read())06excepterror.HTTPErrorasresult:07print(result)2.Urllib框架的基本使用運行該程序,結果如圖。(4)urllib.robotparserrobots.txt模塊robots.txt一般指robots協(xié)議。robots協(xié)議也叫robots.txt(統(tǒng)一小寫)是一種存放于網站根目錄下的ASCII編碼的文本文件,它通常告訴網絡搜索引擎的漫游器(又稱網絡蜘蛛),此網站中的哪些內容是不應被搜索引擎的漫游器獲取的,哪些是可以被漫游器獲取的。urllib.robotparser是專門用來解析robots.txt文件的。2.Urllib框架的基本使用此模塊提供單個類,RobotFileParser用于回答有關特定用戶代理是否可以在發(fā)布該robots.txt文件的網站上獲取URL的問題。urllib.robotparser.RobotFileParser(url='robots.txt文件對應的完整網址'),該類提供了robots.txt應該在url處讀取,解析和回答有關文件的問題的方法。1)read()函數(shù)該函數(shù)用于獲取整個robots.txt文件。2)parse()函數(shù)該函數(shù)用于解析多少行。3)can_fetch(useragent,url)該函數(shù)表示返回True是否允許useragent

根據(jù)解析

文件中包含的規(guī)則獲取urlrobots.txt,也就是說使用該方法來判斷某個網頁是否可以抓取。2.Urllib框架的基本使用4)mtime()函數(shù)返回robots.txt上次提取文件的時間。這對于需要robots.txt定期檢查新文件的長期運行的Web蜘蛛非常有用。5)modified()將robots.txt文件上次提取的時間設置為當前時間。6)crawl_delay(使用者)返回有問題的useragent的Crawl-delay參數(shù)值。這里給出一個例子。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框架的基本使用運行程序,結果如圖:3.字符的編碼和解碼Python3默認編碼為unicode,由str類型進行表示。二進制數(shù)據(jù)使用bytes類型表示,所以不會將str和bytes混在一起。在實際應用中我們經常需要將兩者進行互轉。實際上,使用urllib.request.urlopen方法返回的數(shù)據(jù)是bytes數(shù)據(jù)類型,而做數(shù)據(jù)解析的時候,往往需要的str類型,故此時有必要對這些數(shù)據(jù)的類型的轉換方法作一介紹。2.Urllib框架的基本使用01#-*-codeing=utf-8-*-02importurllib.request03response=urllib.request.urlopen("")04print(response)05print(type(response.read()))運行程序,結果如圖。返回一個名為HTTPResponse的一個對象,該對象返回了請求到的網頁的所有信息??梢允褂胷esponse.read()方法讀取信息。print(response.read())此時可以得到整個網頁的源碼,但是此時顯示的源代碼還是不直觀。繼續(xù)修改以上的代碼。print(response.read().decode('utf-8'))2.Urllib框架的基本使用decode()方法以encoding指定的編碼格式解碼字符串。經過decode()方法處理以后的編碼類型為str型。注意:字符串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。要將bytes類型的數(shù)據(jù)(字節(jié)碼)轉成str類型,需要使用decode方法,也就是bytes>(decode)>str。要將str的數(shù)據(jù)轉成bytes型,需要使用encode,也就是str>(encode)>bytes。encode的作用是將unicode編碼轉換成其他編碼的字符串,如str.encode(‘utf-8’),表示將unicode編碼的字符串str轉換成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()運行結果如圖。任務一Urllib框架請求網頁--任務實施有了urllib請求網頁的基本知識后,我們就可以使用urllib來進行網頁的請求了。這里使用urllib的GET方法。1.

URL分析使用我們要爬取的頁面為/top250?start=25&filter,下面對該頁面做一些必要的分析。頁面包括250條電影數(shù)據(jù),分10頁,每頁25條。每頁的URL的不同之處:最后的數(shù)值=(頁數(shù)-1)*25借助Chrome開發(fā)者工具(F12)來分析網頁,在Elements下找到需要的數(shù)據(jù)位置。使用Chrome瀏覽器輸入/top250?start=25&filter地址訪問網頁,然后按下F12進入開發(fā)者模式。2.編碼規(guī)范一般Python程序第一行需要加入#_*_coding:utf-8或者#coding=utf-8這樣可以在代碼中包含中文。在Python中,使用函數(shù)實現(xiàn)單一功能或相關聯(lián)功能的代碼段,可以提高可閱讀性和代碼重復利用率,函數(shù)代碼塊以def關鍵詞開頭,后接空格、函數(shù)標識符名稱、圓括號、冒號,括號中可以傳入?yún)?shù),函數(shù)段縮進(Tab或四個空格,只能選一種),return用于結束函數(shù),可以返回一個值,也可以不帶任何表達式(表示返回None)。Python文件可以加入main函數(shù)用于測試程序:If__main__==”__main__”:Python使用#添加注釋,說明代碼(段)的作用3.爬取豆瓣電影TOP250這里需要爬取的網頁實際上有列表頁面和電影的詳情頁面,下面分別介紹這兩種網頁的爬取。首先考慮不分頁的情況,此時的目標網頁如下:url=”/top250?start=0&filter”對應的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類型07response=file.decode('utf-8')08print(type(response))#str類型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#爬取列表頁17datalist=getData(baseurl)3.爬取豆瓣電影TOP250運行上面程序,結果如下:<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"/>….任務一Urllib框架請求網頁–任務拓展爬取的數(shù)據(jù)我們可以是Excel表格或數(shù)據(jù)庫進行存儲或csv文件進行存儲,這里我們先介紹一下如何使用csv進行數(shù)據(jù)的保存。CSV實際上是逗號分隔值文件格式,逗號分隔值(Comma-SeparatedValues,CSV,有時也稱為字符分隔值,因為分隔字符也可以不是逗號),其文件以純文本形式存儲表格數(shù)據(jù)(數(shù)字和文本)。純文本意味著該文件是一個字符序列,不含必須像二進制數(shù)字那樣被解讀的數(shù)據(jù)。CSV文件由任意數(shù)目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或制表符。通常,所有記錄都有完全相同的字段序列。通常都是純文本文件。建議使用WORDPAD或是記事本來開啟,再則先另存新檔后用EXCEL開啟,也是方法之一。任務一Urllib框架請求網頁–任務拓展接下來看下Python如何將數(shù)據(jù)寫入csv文件并將其內容打印輸出到控制臺,這里給出參考代碼。01importcsv02withopen("test.csv","w",encoding='utf-8-sig')ascsvfile:03writer=csv.writer(csvfile)04#先寫入列名05writer.writerow(["編號","列1","列2"])06#寫入多行數(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)任務二BeautiflSoup4解析網頁–任務演示本任務準備使用Python內置的HTTP請求庫Urllib向服務器發(fā)出HTTP請求,然后將請求的網頁使用BeautiflSoup4模塊進行解析,提取該網頁中包含的圖片和電影標題等內容。任務二BeautiflSoup4解析網頁–知識說明本任務準備使用Python內置的HTTP請求庫Urllib向服務器發(fā)出HTTP請求,然后將請求的網頁使用BeautiflSoup4模塊進行解析,提取該網頁中包含的圖片和電影標題等內容。任務二BeautiflSoup4解析網頁–知識準備BeautiflSoup4是Python解析HTML/XML非常好用的第三方庫。它主要借助網頁的結構和屬性等特性來解析網頁。要使用BeautiflSoup4庫,必須先進行安裝,主要使用一下命令:pipinstallbeautiflsoup4

安裝完成以后應該使用如下命令進行導入:formbs4importBeautifulSoup1.BeautiflSoup4的四個對象BeautiflSoup4將復雜HTML文檔轉換成一個復雜的樹形結構,每個節(jié)點都是Python對象,所有對象可以歸納為以下4種:TagNavigableStringBeautifulSoupComment(1)TagTag通俗點講就是HTML中的一個個標簽。通過該標簽可以找到該標簽對應的具體內容,而且找到的第一個內容。如在文檔:<pclass=‘title’>這是標題</p>中,tag為p。接下來介紹一下Tag的兩大屬性:name和attribute。1.BeautiflSoup4的四個對象01frombs4importBeautifulSoup02str="""03<pclass='title'>這是標題</p>04<pclass='sub_title'>這是副標題</p>05"""06bs=BeautifulSoup(str,"html.parser")07print()08print(bs.p.attrs)運行程序,結果如下:p{'class':['title']}1.BeautiflSoup4的四個對象再看一個例子。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)運行程序,結果如下:<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的四個對象(2)NavigableString既然我們已經得到了標簽的內容,那么問題來了,我們要想獲取標簽內部的文字怎么辦呢?很簡單,用.string方法就可以了。也就是說,使用用NavigableString,可以獲取標簽里的內容。下面通過一個例子加以說明。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)運行程序,結果如下:<title>百度一下,你就知道</title><class'bs4.element.NavigableString'>百度一下,你就知道1.BeautiflSoup4的四個對象(3)BeautifulSoupBeautifulSoup表示整個文檔對象。BeautifulSoup

對象表示的是一個文檔的全部內容.大部分時候,可以把它當作Tag對象,是一個特殊的Tag,我們可以分別獲取它的類型,名稱,以及屬性。01frombs4importBeautifulSoup02file=open("./baidu.html","rb")03html=file.read()04bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器05print(bs)06print("bs的屬性為:")07print(type(bs))1.BeautiflSoup4的四個對象運行程序,結果如下:<!--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的四個對象(4)CommentComment是一個特殊的NavigableString,它可以取得標簽內字符串的注釋部分內容,但是輸出的內容不再包含注釋符號。frombs4importBeautifulSoupimportbs4str='<ahref="/"class="sister"id="link1"><!--ThisisComment--></a>'soup=BeautifulSoup(str,'html.parser')print(soup.a.string)#獲取了注釋部分的內容print("soup.a.string的屬性為:")print(type(soup.a.string))運行程序,結果如下:ThisisCommentsoup.a.string的屬性為:<class'bs4.element.Comment'>2.文檔的遍歷BeautiflSoup中可以遍歷子節(jié)點、所有子孫節(jié)點以及父節(jié)點以及所有父節(jié)點,以及獲取其內容。(1)contentscontents獲取Tag的所有節(jié)點,返回一個list。也就是說Tag的content屬性可以將tag的子節(jié)點以列表的方式輸出。舉例如下: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.文檔的遍歷運行結果如下:['\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>百度首頁</title>]<metacontent="always"name="referrer"/>2.文檔的遍歷(2)childrenchildren獲取Tag的所有子節(jié)點,它返回的不是一個list,而是一個列表生成器對象。不過我們可以通過遍歷獲取所有子節(jié)點。01html="""02此處內容同上一個例子03"""04frombs4importBeautifulSoup05bs=BeautifulSoup(html,"html.parser")#使用了html.parser解析器06print("bs.head.children的類型為:")07print(bs.head.children)08foriteminbs.head.children:09print(item)運行結果為:bs.head.children的類型為:<list_iteratorobjectat0x0000019BB04274A8>bs.head.children遍歷出的內容為:<metacontent="always"name="referrer"/>2.文檔的遍歷(3)descendants.contents和.children屬性僅包含tag的直接子節(jié)點,.descendants屬性可以對所有tag的子孫節(jié)點進行遞歸循環(huán),和children類似,要獲取其中的內容,我們需要對其進行遍歷。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的類型為:")31print(bs.head.descendants)32print("bs.head.children遍歷出的內容為:")33foriteminbs.head.descendants:34print(item)2.文檔的遍歷運行結果如下:bs.head.descendants的類型為:<generatorobjectTag.descendantsat0x000001A731D74570>bs.head.children遍歷出的內容為:<metacontent="always"name="referrer"/>(4)string和strings方法獲取文件的內容如果一個標簽里面沒有標簽了,那么.string就會返回標簽里面的內容,如果tag包含了多個子節(jié)點,tag就無法確定,string方法應該調用哪個子節(jié)點的內容,.string的輸出結果是None。.string方法此時需要遍歷獲取,.stripped_strings

輸出的字符串中可能包含了很多空格或空行,使用.stripped_strings可以去除多余空白內容。2.文檔的遍歷01"""02#html="""03#此處內容同上一個例子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)運行程序,結果如下:百度首頁*******************************************************************************新聞2.文檔的遍歷(5)parent屬性和parents屬性parent屬性用來表示遍歷父節(jié)點,parents屬性用來表示遍歷所有父節(jié)點,請看下面的實例。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.文檔的遍歷運行程序,結果如下。div百度首頁************************************************************titleheadhtml[document]3.文檔的搜索運行程序,結果如下。

BeautiflSoup還提供了模塊的搜索功能,根據(jù)標簽名稱、標簽屬性、文檔文本和正則表達式來搜索。(1)find_all()find_all()方法根據(jù)指定的參數(shù),查找指定的節(jié)點,而且是找出所有符合條件的節(jié)點。該函數(shù)的原型為:find_all(name,attrs,recursive,text,**kwargs)name:基于name參數(shù),進行標簽的查找attrs:基于attrs參數(shù),進行標簽屬性的查找recursive:基于正則表達式的查找text:基于text參數(shù),進行查找**kwargs:基于函數(shù)的查找3.文檔的搜索1)基于name參數(shù)的查找基于name參數(shù),對標簽進行查找??梢砸匀魏螛撕灥拿謥磉M行查找,查找該標簽第一次出現(xiàn)的地方。找到該標簽以后,返回一個BeautifulSoup的標簽對象。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.文檔的搜索運行程序,結果如下:[<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">更多產品</a>]3.文檔的搜索2)使用函數(shù)進行匹配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)運行程序,結果如下:<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ù)進行搜索find_all()函數(shù)中可以進行標簽屬性的查找,可以跟上id=”head”這樣的參數(shù)進行搜索查找。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)運行程序,結果如下:<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.文檔的搜索上面例子結果反映出了找到了id=head的所有內容。如果要找到所有class=“mnav”的所有內容,可以使用如下代碼:4)使用text參數(shù)如果我們要查找文檔中內容為hao123的內容,則可以使用find_all(text=”hao123”)的這個方法。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.文檔的搜索上面例子結果反映出了找到了id=head的所有內容。如果要找到所有class=“mnav”的所有內容,可以使用如下代碼:4)使用text參數(shù)如果我們要查找文檔中內容為hao123的內容,則可以使用find_all(text=”hao123”)的這個方法。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.文檔的搜索運行程序,結果如下。hao123對于查找特殊的文本,還可以用下面的方法。t_list=bs.find_all(text=pile("\d"))#利用正則表達式查找包含數(shù)字的文本如果要查找多個文本內容,還可以是以下方式。t_list=bs.find_all(text=["新聞","地圖","hao123"])也就是說text后面還可以跟一個列表。3.文檔的搜索5)基于正則表達式進行查找01html="""02<html><head>03<title>百度首頁</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.文檔的搜索運行結果,如下。['qiantomyou@']6)limit參數(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)運行程序,結果如下。<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ù)對于查找到的內容可以限制條數(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)運行程序,結果如下。<aclass="mnav"href=""name="tj_trnews"><!--新1聞--></a><aclass="mnav"href=""name="tj_trnews">新聞</a><aclass="mnav"href=""name="tj_trhao123">hao123</a>3.文檔的搜索運行結果,如下。1)通過標簽來查找01t_list=bs.select('title')02foritemint_list:03print(item)2)通過類名來查找01t_list=bs.select(".mnav")02foritemint_list:03print(item)3)通過ID來查找01t_list=bs.select("#u1")02foritemint_list:03print(item)3.文檔的搜索運行結果,如下。4)通過屬性來查找01t_list=bs.select("a[name='tj_trmap']")02foritemint_list:03print(item)5)通過子標簽來查找01t_list=bs.select("head>title")02print(t_list)6)通過兄弟標簽來查找t_list=bs.select(".mnav~.bri")print(t_list[0].get_text())任務二BeautiflSoup4解析網頁–任務實施

有了將網頁的進行爬取的相關知識后,又學習了BeautiflSoup解析網頁的知識,接下來,可以對豆瓣電影的列表數(shù)據(jù)進行解析了。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'任務二BeautiflSoup4解析網頁–任務實施17#爬取列表頁18datalist=getData(baseurl)19frombs4importBeautifulSoup20importre21bs=BeautifulSoup(datalist,"html.parser")22pagelist=bs.find_all("div",class_="item")23foriteminpagelist:#找到分頁頁面中的每個超鏈接24a=item.find('div',class_="hd").a25link=a.attrs['href']26movielist.append(link)27print("此分頁中一共找到的每個電影超鏈接為:")28print(movielist)任務二BeautiflSoup4解析網頁–任務實施29print("****"*30)30#找到分頁中的圖片31foriteminpagelist:#找到分頁頁面中的每個電影圖片32link=item.find('img').get("src")33moviepic.append(link)34print("此分頁中一共找到的每個電影圖片為:")35print(moviepic)36print("****"*30)37print("此分頁中一共找到的每個電影標題為:")38foriteminpagelist:#找到分頁頁面中的每個電影標題39link=item.find('span',class_='title').get_text()40movietitle.append(link)41print(movietitle)任務二BeautiflSoup4解析網頁–任務實施運行程序結果如下:此分頁中一共找到的每個電影超鏈接為:['/subject/1292052/','/subject/1291546/','/subject/1292720/','/subject/1295644/’,…此分頁中一共找到的每個電影圖片為:['/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’,…任務二BeautiflSoup4解析網頁–任務拓展

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

解析網頁數(shù)據(jù),我們除了使用BeautiflSoup自帶的方法之外,我們還可以使用Python的正則表達式模塊進行解析。15findInq=pile(r'<spanclass="inq">(.*)</span>')16#找到影片的相關內容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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論