大數(shù)據(jù)爬蟲技術(shù) 課件 項目二 Python爬蟲_第1頁
大數(shù)據(jù)爬蟲技術(shù) 課件 項目二 Python爬蟲_第2頁
大數(shù)據(jù)爬蟲技術(shù) 課件 項目二 Python爬蟲_第3頁
大數(shù)據(jù)爬蟲技術(shù) 課件 項目二 Python爬蟲_第4頁
大數(shù)據(jù)爬蟲技術(shù) 課件 項目二 Python爬蟲_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

項目二Python爬蟲通過對本章的學(xué)習(xí),理解Python中擴展庫的安裝及使用方式,并熟悉Python爬蟲的代碼書寫。理解Python中擴展庫的安裝。掌握Python中使用擴展庫來爬取網(wǎng)頁數(shù)據(jù)。了解基礎(chǔ)爬蟲框架。Pythonurllib庫用于操作網(wǎng)頁URL,并對網(wǎng)頁的內(nèi)容進行抓取處理。urllib是URL和lib兩個單詞共同構(gòu)成的,URL就是網(wǎng)頁的地址,lib是library(庫)的縮寫。2.1urllib庫urllib.request:請求模塊。urllib.error:異常處理模塊。urllib.parse:解析模塊。urllib.robotparser:robot.txt文件解析模塊,在網(wǎng)絡(luò)爬蟲中基本不會用到,使用較少。urllib的request模塊提供了最基本的構(gòu)造HTTP請求的方法,使用它可以方便地實現(xiàn)請求的發(fā)送并得到響應(yīng),同時它還帶有處理授權(quán)驗證(authentication)、重定向(redirection)、瀏覽器Cookies以及其他內(nèi)容。(1)urlopen()使用urlopen()函數(shù)可以發(fā)送一個請求[例2-1]使用urlopen()爬取網(wǎng)頁代碼。代碼如下:importurllib.requestresponse=urllib.request.urlopen("")#發(fā)出請求并返回響應(yīng)print(response.read())#打印響應(yīng)返回的內(nèi)容

該例使用read()是讀取整個網(wǎng)頁內(nèi)容,運行結(jié)果如下所示。b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<noscript><metahttp-equiv="refresh"content="0;url=/"></noscript>\r\n</body>\r\n</html>'[例2-2]使用urlopen()爬取網(wǎng)頁代碼,并指定讀取的長度。代碼如下:importurllib.requestmyURL=urllib.request.urlopen("/")print(myURL.read(100))

該例使用read(100)讀取部分網(wǎng)頁內(nèi)容,運行結(jié)果如下所示。b'<html>\r\n<head>\r\n\t<script>\r\n\t\tlocation.replace(location.href.replace("https://","http://"));\r\n\t</scri‘[例2-3]使用urlopen()爬取網(wǎng)頁代碼,并讀取一行內(nèi)容。代碼如下:importurllib.requestmyURL=urllib.request.urlopen("/")print(myURL.readline())

該例使用readline()讀取一行網(wǎng)頁內(nèi)容,運行結(jié)果如下所示。b'<html>\r\n'[例2-4]使用urlopen()獲取網(wǎng)頁信息。代碼如下:importurllib.request#發(fā)出請求并得到響應(yīng)response=urllib.request.urlopen("")#查看響應(yīng)的類型print(type(response))#打印響應(yīng)狀態(tài)碼print(response.status)#打印請求頭print(response.getheaders())#打印請求頭中Server屬性的值(表示服務(wù)端使用Web服務(wù)器是什么軟件,如Tomcat、Nginx等)print(response.getheader("Server"))?urlopen()函數(shù)返回的是一個HTTPResponse對象,它包含了read()、readinto()、getheader(name)、getheaders()、fileno()等方法,以及msg、version、status、reason、debuglevel、closed等屬性。[例2-5]使用urlopen()設(shè)置超時參數(shù)。代碼如下:importurllib.requestresponse=urllib.request.urlopen("",timeout=1)print(response.read().decode("utf-8"))timeout參數(shù)可以設(shè)置超時時間,單位為秒,意思就是如果請求超出了設(shè)置的這個時間還沒有得到響應(yīng),就會拋出異常,如果不指定,就會使用全局默認時間。它支持HTTP、HTTPS、FTP請求。[例2-6]使用urlopen()爬取百度網(wǎng)頁,并輸出頁面內(nèi)容。代碼如下:importurllib.requestresponse=urllib.request.urlopen("")html=response.read()html=html.decode("utf-8")print(html)[例2-7]使用urlopen()爬取網(wǎng)頁,并保存到本地。代碼如下:fromurllibimportrequestfile=request.urlopen("/")data=file.read()#讀取全部內(nèi)容doc=open("E:/test/2022.html","wb")doc.write(data)doc.close()(2)Request()urlopen()方法可以實現(xiàn)最基本的請求的發(fā)起,但如果要加入Headers等信息,就可以利用Request對象來構(gòu)造請求。Request()對象的參數(shù)如下。urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)[例2-8]使用Request()獲取網(wǎng)頁信息。代碼如下:importurllib.requestrequest=urllib.request.Request("")response=urllib.request.urlopen(request)html=response.read()print(html)[例2-9]使用Request()并加上header信息。代碼如下:importurllib.requestheader={"User-Agent":"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/66.0.3359.139Safari/537.36"}request=urllib.request.Request("")response=urllib.request.urlopen(request)html=response.read()print(html)errort模塊urllib.error可以接收有urllib.request產(chǎn)生的異常。urllib.error有兩個方法,URLError和HTTPError。URLError是OSError的一個子類,HTTPError是URLError的一個子類,服務(wù)器上HTTP的響應(yīng)會返回一個狀態(tài)碼,根據(jù)這個HTTP狀態(tài)碼,我們可以知道我們的訪問是否成功。HTTPError是URLError的一個子類,用于處理特殊HTTP錯誤。例如,作為認證請求的時候,包含的屬性code為HTTP的狀態(tài)碼,reason為引發(fā)異常的原因,headers為導(dǎo)致HTTPError的特定HTTP請求的HTTP響應(yīng)頭。

[例2-10]URLError。代碼如下:fromurllibimportrequest,error#一個不存在的網(wǎng)址鏈接url=""req=request.Request(url)try:response=request.urlopen(req)print('狀態(tài)碼:'+str(response.getcode()))html=response.read().decode('utf-8')print(html)excepterror.URLErrorase:print('錯誤:',e.reason)該例運行結(jié)果如下所示。錯誤:[Errno11004]getaddrinfofailedgetaddrinfo表示獲取地址信息失敗。parse模塊parse模塊提供了很多解析和組建URL的函數(shù)。其中urlparse()函數(shù)可以將URL解析成ParseResult對象,實現(xiàn)url的識別和分段;而urlencode()與unquote()則可以用于編碼和解碼。[例2-12]urlparse解析URL。代碼如下:fromurllib.parseimporturlparseurl=''parsed_result=urlparse(url)print('parsed_result的數(shù)據(jù)類型:',type(parsed_result))print('parsed_result包含了:',len(parsed_result),'個元素')print(parsed_result)print('scheme:',parsed_result.scheme)print('netloc:',parsed_loc)print('path:',parsed_result.path)print('params:',parsed_result.params)print('query:',parsed_result.query)print('fragment:',parsed_result.fragment)print('hostname:',parsed_result.hostname)[例2-13]urlencode編碼。代碼如下:fromurllibimportparse#調(diào)用parse模塊的urlencode()進行編碼query_string={'wd':'大數(shù)據(jù)'}result=parse.urlencode(query_string)#format函數(shù)格式化字符串,進行url拼接url='/s?{}'.format(result)print(url)requests是用Python語言編寫,基于urllib,采用Apache2Licensed開源協(xié)議的HTTP庫。它比urllib更加方便,可以節(jié)約開發(fā)者大量的工作,完全滿足HTTP測試需求。Requests實現(xiàn)了HTTP協(xié)議中絕大部分功能,它提供的功能包括Keep-Alive、連接池、Cookie持久化、內(nèi)容自動解壓、HTTP代理、SSL認證、連接超時、Session等很多特性,更重要的是它同時兼容Python2和Python3。2.2requests庫

[例2-16]使用GET基本方式爬取網(wǎng)頁。代碼如下:importrequestsurl='/'response=requests.get(url)print(response.text)[例2-17]使用GET參數(shù)方式爬取網(wǎng)頁。代碼如下:importrequestsurl='/get'data={'name':'messi','age':'35'}response=requests.get(url,params=data)print(response.url)print(response.text)[例2-19]使用GET方式獲取JSON數(shù)據(jù)。代碼如下:importrequestsr=requests.get('/get?name=zhengyan&age=20&sex=female&major=bigdata')r.encoding='utf-8'print(r.json()['args']['age'],r.json()['args']['name'])

該例運行結(jié)果如下。20zhengyan[例2-20]使用GET方式獲取網(wǎng)頁圖像并保存。代碼如下:importrequestsr3=requests.get("/feed/a1ec08fa513d26977ec9e1f4201608f34216d873.jpeg?token=ccfab3d1e2305a91be3a1100b46cbfc1")withopen('fl.png','wb')asf:f.write(r3.content)該例可將網(wǎng)頁圖像保存到本地,fl.png為保存后的命名。使用POST方式抓取網(wǎng)頁數(shù)據(jù)通過POST把數(shù)據(jù)提交到url地址,等同于以一個字典的形式提交form表單里面的數(shù)據(jù)。Reqeusts支持以form表單形式發(fā)送post請求,只需要將請求的參數(shù)構(gòu)造成一個字典,然后傳給requests.post()的data參數(shù)即可。[例2-22]使用POST參數(shù)方式爬取網(wǎng)頁。代碼如下:importrequestsurl='/post'data={'name':'owen','age':'23'}response=requests.post(url,data=data)print(response.text)運行結(jié)果如下所示。{"args":{},"data":"","files":{},"form":{"age":"23","name":"owen"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip,deflate","Content-Length":"16","Content-Type":"application/x-www-form-urlencoded","Host":"","User-Agent":"python-requests/2.19.1","X-Amzn-Trace-Id":"Root=1-63dc8473-45b9ff7a64804e7344517f0a"},"json":null,"origin":"32","url":"/post"}

[例2-25]使用requests生成完整的HTTP請求。代碼如下:importrequests#設(shè)置urlurl='/'#設(shè)置請求頭headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/76.0.3809.100Safari/537.36"}#生成GET請求,并設(shè)置延時為3rqg=requests.get(url,headers=headers,timeout=3)#查看狀態(tài)碼print("狀態(tài)碼",rqg.status_code)#檢測編碼(查看編碼)print('編碼',rqg.encoding)#查看響應(yīng)頭print('響應(yīng)頭:',rqg.headers)#查看網(wǎng)頁內(nèi)容print(rqg.text)正則表達式又稱為“規(guī)則表達式”,是對字符串操作的一種邏輯公式。其特點是用事先定義好的一些特定字符及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。2.3正則表達式

正則表達式

說明\d“\d”代表一個數(shù)字*“*”代表任意的字符[]“[]”內(nèi)的字符只能取其一{}“{}”指定字符的個數(shù)+“+”表示前一個字符至少出現(xiàn)一次—“—”表示一個范圍?“?”表示前一個字符可出現(xiàn)0次或1次.匹配除換行符以外的任意字符|分支結(jié)構(gòu),匹配符號之前的字符或后面的字符\轉(zhuǎn)義符^匹配行的開始$匹配行的結(jié)束正則表達式的特點如下:(1)靈活性、邏輯性和功能性非常強;(2)可以迅速地用簡單的方式達到字符串的復(fù)雜控制。在Python3中,可以通過自帶的re模塊來實現(xiàn)正則表達式的功能。函數(shù)名稱含義re.match從字符串的起始位置匹配一個模式,如果匹配不成功則返回Nonere.search在字符串內(nèi)查找模式匹配,找到第一個匹配然后返回,如果字符串沒有匹配成功則返回Nonere.sub用于替換字符串中的匹配項re.split分割字符串re.findall在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果沒有找到匹配的子串,則返回空列表re.finditer和findall類似,在字符串中找到正則表達式所匹配的所有子串,并把它們作為一個迭代器返回pile把正則表達式編譯成一個正則表達式對象re.pattern將正則表達式pattern編譯成pattern對象,并返回該對象[例2-29]使用search匹配普通字符串。代碼如下:importrea="student"str1="teacherandstudent"ret=re.search(a,str1)print(ret)[例2-30]使用通用字符串匹配字符。代碼如下:importrea="\d{2}st"str1="teacherand12345student"ret=re.search(a,str1)print(ret)[例2-31]使用re.match進行匹配。代碼如下:importreprint(re.match('xyz',''))#在起始位置匹配

print(re.match('xyz',''))#不在起始位置匹配BeautifulSoup

提供一些簡單的、Python式的函數(shù)來處理導(dǎo)航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數(shù)據(jù),因為簡單,所以不需要多少代碼就可以寫出一個完整的應(yīng)用程序。2.4BeautifulSoup

BeautifulSoup將復(fù)雜的HTML文檔轉(zhuǎn)換為一個樹形結(jié)構(gòu)來讀取,其中樹形結(jié)構(gòu)中的每個節(jié)點都是Python對象,并且所有對象都可以歸納為Tag、NavigableString、BeautifulSoup以及Comment等4種。對象含義Tag表示HTML中的一個標簽NavigableString表示獲取標簽內(nèi)部的文字BeautifulSoup表示一個文檔的全部內(nèi)容Comment表示一個特殊類型的NavigableString對象在Python3中,BeautifulSoup庫的導(dǎo)入語句如下:frombs4importBeautifulSoup1個HTML標簽被用來定義各種類型的內(nèi)容。BeautifulSoup中的一個標簽對象對應(yīng)于實際頁面或文檔中的一個HTML或XML標簽。標簽包含很多屬性和方法,標簽的兩個重要特征是名稱和屬性。每個標簽都包含一個名稱,可以通過".name"作為后綴進行訪問,將返回它的標簽類型。[例2-38]Tag對象實例class[例2-40]BeautifulSoup對象獲取文檔內(nèi)容[例2-41]BeautifulSoup遍歷HTML文檔XML路徑語言(Xpath)用于定位XML文檔中的數(shù)據(jù)信息,它是一種專門用來在XML文檔中查找信息的語言,目前主要用來對XML文檔中的元素和屬性進行遍歷,以便讀取相應(yīng)的數(shù)據(jù)。但是嚴格來說,Xpath并不是一種完整意義上的編程語言,它被設(shè)計為內(nèi)嵌語言,以便被其他語言所使用。2.5Xpath

在Xpath中有7種類型的節(jié)點:元素、屬性、文本、命名空間、處理指令、注釋及文檔節(jié)點。XML文檔被當(dāng)做節(jié)點數(shù)來對待,樹根被稱為文檔節(jié)點或者根節(jié)點。在Xpath的文檔節(jié)點樹中,包含的節(jié)點按照一定的順序進行排列,這就是文檔順序。在讀取節(jié)點時,所排列的順序從上到下,從左到右。lxml是一個Xpath格式解析模塊,安裝方便,直接pipinstalllxml或者easy_installlxml即可。在Python3中導(dǎo)入此包:from

lxml

import

etree[例2-44]使用Xpath獲取網(wǎng)頁信息該例中語句“html=etree.HTML(data)”可以將字符串解析為html文檔,語句“result=etree.tostring(html)”可以將字符串序列化為html,如果使用lxml來提取數(shù)據(jù),應(yīng)以lxml.etree.tostring的返回結(jié)果作為提取數(shù)據(jù)的依據(jù)。PyQuery是Python的第3方庫,是一個非常強大又靈活的網(wǎng)頁解析庫,它提供了和JQuery類似的語法來解析HTML文檔,并且支持CSS選擇器,使用非常方便。和Xpath、BeautifulSoup相比,PyQuery更加靈活,它提供增加節(jié)點的class信息,移除某個節(jié)點,提取文本信息等功能。2.6PyQuery

[例2-46]使用PyQuery提取HTML數(shù)據(jù)正如Xpath之于XML文檔一樣,JsonPath為Json文檔提供了解析能力。通過使用JsonPath,人們可以方便的查找節(jié)點、獲取想要的數(shù)據(jù),JsonPath是Json版的Xpath。JsonPath安裝命令如下:pipinstalljsonpath2.7JsonPath

符號描述$根節(jié)點@當(dāng)前節(jié)點*匹配所有節(jié)點...不管在任何位置,選取符合條件的節(jié)點[,]支持迭代器中做多選?()支持過濾操作()支持表達式操作.or[]取子節(jié)點[start:end]數(shù)組區(qū)間,不包含end符號描述$.store.book[*].author所有book的author節(jié)點$..author所有author節(jié)點$.store.*store下的所有節(jié)點$.store..pricestore下的所有price節(jié)點$..book[0]匹配第1個book節(jié)點$..*遞歸匹配所有子節(jié)點$..book[0,1]匹配前2個book節(jié)點[例2-54-1]使用JsonPath獲取符合條件的節(jié)點。代碼如下:importjsonpathresult={ "store":{ "book":[{ "category":"reference", "author":"NigelRees", "title":"SayingsoftheCentury", "price":8.95 },{ "category":"fiction", "author":"EvelynWaugh", "title":"SwordofHonour"

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論