Python程序設計語言(第二版)(微課版)課件 11 網絡爬蟲技術_第1頁
Python程序設計語言(第二版)(微課版)課件 11 網絡爬蟲技術_第2頁
Python程序設計語言(第二版)(微課版)課件 11 網絡爬蟲技術_第3頁
Python程序設計語言(第二版)(微課版)課件 11 網絡爬蟲技術_第4頁
Python程序設計語言(第二版)(微課版)課件 11 網絡爬蟲技術_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第十一章網絡爬蟲技術一、學習目標:了解一些網絡知識及相關的爬蟲技術,學會分析

簡單HTML文檔,利用Python提供的第三方庫提

取相應網頁中的有價值的信息。

二、學習重點:requests、BeautifulSoup庫的使用。

三、學習難點:分析HTML源碼信息。11.1計算機網絡基礎知識11.1.1網絡層次劃分計算機網絡協議同我們的語言一樣,多種多樣。而ARPA公司與1977年到1979年推出了一種名為ARPANET的網絡協議受到了廣泛的熱捧,其中最主要的原因就是它推出了人盡皆知的TCP/IP標準網絡協議。目前TCP/IP協議已經成為Internet中的"通用語言",使用協議A的網絡使用協議B的網絡TCP/IP為了使不同計算機廠家生產的計算機能夠相互通信,以便在更大的范圍內建立計算機網絡,國際標準化組織(ISO)在1978年提出了"開放系統互聯參考模型",即著名的OSI/RM模型(OpenSystemInterconnection/ReferenceModel)。它將計算機網絡體系結構的通信協議劃分為七層,自下而上依次為:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層。其中第四層完成數據傳送服務,上面三層面向用戶。11.1.2超文本標記語言HTML超文本標記語言(英語:HyperTextMarkupLanguage,簡稱:HTML)是一種用于創建網頁的標準標記語言。您可以使用HTML來建立自己的WEB站點,HTML運行在瀏覽器上,由瀏覽器來解析。超文本是一種組織信息的方式,它通過超級鏈接方法將文本中的文字、圖表與其他信息媒體相關聯。這些相互關聯的信息媒體可能在同一文本中,也可能是其他文件,或是地理位置相距遙遠的某臺計算機上的文件。這種組織信息方式將分布在不同位置的信息資源用隨機方式進行連接,為人們查找,檢索信息提供方便。HTML,超文本標記語言.簡單理解為某些字句加上標志的語言,從而實現預期的特定效果。網頁正是由這種HTML語言所編寫出來的。作為一套標記語言,基本上只要明白各種標記的用法就算學會了HTML。HTML的語法格式分為嵌套與非嵌套兩類,嵌套格式為<標記>...</標記>,非嵌套只為<標記>。此外,根據標記的不同,有的標記附帶有屬性參數,則表示為<標記屬性="參數值">,根據個人需要,可添加或去掉相應的屬性標記。1.基本框架如同人一樣,網頁也包括了“頭部”和“身體”。<head>標記內包含著諸如網頁標題、語言編碼、網頁描述等基本信息,而平時我們真正見到的網頁內容均放在<body>標記內?,F在先介紹一下<head>里的基本信息。2.組成要素無論網頁如何千變萬化,構成一個網頁內容的最基本要素大體只有五種,即文字、圖片、表格、超鏈接和表單控件。11.2網絡爬蟲網絡爬蟲又名“網絡蜘蛛”,是通過網頁的鏈接地址來尋找網頁,從網站某一個頁面開始,讀取網頁的內容,找到在網頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網頁,這樣一直循環下去,直到按照某種策略把互聯網上所有的網頁都抓取完為止的技術。11.2.1網絡爬蟲分類及工作原理網絡爬蟲按照系統結構和實現技術,大致可以分為以下幾種類型:通用網絡爬蟲主題網絡爬蟲深層網絡爬蟲。11.2.2使用Python訪問互聯網,編寫爬蟲代碼。Pythonurllib庫用于操作網頁URL,并對網頁的內容進行抓取處理。urllib包含四個模塊:urllib.request-打開和讀取URL。urllib.error-包含urllib.request拋出的異常。urllib.parse-解析URL。urllib.robotparser-解析robots.txt文件。importurllib.requestresponse=urllib.request.urlopen("/uploads\/images/20180816/1534409817557391.jpg")logo_img=response.read()withopen("1.jpg","wb")asf:f.write(logo_img)11.3requests庫的使用requests是用Python語言編寫,基于urllib,采用Apache2Licensed開源協議的HTTP庫,它比urllib更加方便,可以節約我們大量的工作,完全滿足HTTP測試需求,建議爬蟲使用requests庫。11.3.1requests請求方式importrequestsrequests.get(url)requests.post(url)requests.put(url)requests.delete(url)requests.head(url)requests.options(url)1.get請求核心代碼是requests.get(url),具體例子如下:>>>importrequests>>>r=requests.get("/")>>>print(r)<Response[200]>2.post請求核心代碼是requests.post(url,data={請求體的字典}),具體例子如下:>>>importrequests>>>url='/post'>>>data={'name':'jack','age':'23'}>>>response=requests.post(url,data=data)>>>print(response.text)運行結果:{"args":{},"data":"","files":{},"form":{"age":"23","name":"jack"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip,deflate","Content-Length":"16","Content-Type":"application/x-www-form-urlencoded","Host":"","User-Agent":"python-requests/2.26.0","X-Amzn-Trace-Id":"Root=1-6119c367-1293f359690965d17aeaca89"},"json":null,"origin":"4","url":"/post"}3.獲取響應信息。通過status_code獲取響應狀態碼。>>>r=requests.get('/get')>>>r.status_code200#requests內置一個狀態碼查詢對象>>>print(r.status_code==requests.codes.ok)True>>>#如果發生了4xx或者5xx的錯誤響應,可以使用raise_for_status()函數來拋出異常>>>bad_r=requests.get('/status/404')>>>bad_r.status_code404>>>bad_r.raise_for_status()Traceback(mostrecentcalllast):File"<pyshell#39>",line1,in<module>bad_r.raise_for_status()File"C:\Users\Administrator\AppData\Local\Programs\Python\Python38\lib\site-packages\requests\models.py",line953,inraise_for_statusraiseHTTPError(http_error_msg,response=self)requests.exceptions.HTTPError:404ClientError:NOTFOUNDforurl:/status/404>>>#如果請求沒有發生錯誤,則raise_for_status()返回None【例11-1】抓取logo.png圖片,抓取的右圖importrequestsimportosroot="e://";url="/images/logo1.png";path=root+url.split("/")[-1]try:ifnotos.path.exists(root):os.mkdir(root);ifnotos.path.exists(path):r=requests.get(url)r.raise_for_statuswithopen(path,'wb')asf:f.write(r.content)f.close()except:print("爬取失敗")11.4BeautifulSoup庫的使用BeautifulSoup是python的一個庫,最主要的功能是從網頁抓取數據。BeautifulSoup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。BeautifulSoup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,BeautifulSoup就不能自動識別編碼方式了。然后,你僅僅需要說明一下原始編碼方式就可以了。BeautifulSoup已成為和lxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。11.4.1HTML文檔解析器解析器使用方法優勢劣勢Python標準庫BeautifulSoup(markup,"html.parser")1、Python的內置標準庫2、執行速度適中3、文檔容錯能力強Python(2.7.3or3.2.2)前的版本中文檔容錯能力差lxmlHTM解析器BeautifulSoup(markup,"lxml")1、速度快2、文檔容錯能力強需要安裝C語言庫lxmlXML解析器BeautifulSoup(markup,["lxml","xml"])BeautifulSoup(markup,"xml")1、速度快2、唯一支持XML的解析器需要安裝C語言庫html5libBeautifulSoup(markup,"html5lib")1、最好的容錯性2、以瀏覽器的方式解析文檔3、生成HTML5格式的文檔速度慢不依賴外部擴展11.4.2BeautifulSoup的四種對象BeautifulSoup將復雜HTML文檔轉換成一個復雜的樹形結構,每個節點都是Python對象,所有對象可以歸納為4種:? Tag? NavigableString? BeautifulSoup? Comment1.Tag,Tag通俗來講就是HTML中的一個個標簽。importrequestsimportlxmlfrombs4importBeautifulSoupr=requests.get('/')r.encoding='utf-8'soup=BeautifulSoup(r.text,'lxml')print(soup.meta)#輸出標簽對象print(type(soup.meta))#輸出對象類型print()#輸出標簽類型print(soup.meta.attrs)#輸出標簽屬性字典print(soup.meta['content'])#輸出標簽content屬性print(soup.meta['http-equiv'])#輸出標簽http-equiv屬性運行結果:<metacontent="IE=9"http-equiv="X-UA-Compatible"/><class'bs4.element.Tag'>meta{'http-equiv':'X-UA-Compatible','content':'IE=9'}IE=9X-UA-Compatible2.NavigableString對象,NavigableString可以遍歷字符串對象,用來操作那些包含在標簽內的字符串。實際上在解析HTML文檔時最關心的是標簽里面碟內容,而不是標簽本身。于是NavigableString就可以提取信息,用.string方法即可。用上面的網頁信息可以用如下語句。soup=BeautifulSoup(r.text,'lxml')print(soup.p.string)print(soup.li.string)print(soup.h1.string)運行結果:歡迎訪問佳木斯大學!首頁校園快訊3.BeautifulSoup對象,它表示一個文檔的整體,可以看做是文檔樹的根或者一個頂節點,文檔中的所有標簽及內容都是它的后代節點。通常情況下,是從它開始向下搜索或遍歷文檔樹的。4.Comment對象,以上三種對象幾乎覆蓋來HTML文檔的所有內容,但是還有一些特殊對象可能出現下文檔中卻不屬于以上三種,那就是文檔的注釋部分。這些注釋可以用Comment對象來處理,由于價值較小并不是很重要。>>>newsoup=BeautifulSoup("<b><!—Thisisacomment--></b><p>Thisisnotacomment</p>",'html.parser')>>>newsoup.b.string'Thisisacomment'>>>type(newsoup.b.string)<class'bs4.element.Comment'>>>>newsoup.p.string'Thisisnotacomment'>>>type(newsoup.p.string)<class'bs4.element.NavigableString'>11.4.3文檔樹的遍歷HTML文檔可以映射為一顆樹,文檔中的標簽可以認為是樹的各個層的節點,對于這種結構,我們就可以對樹進行遍歷訪問了。我們用Tag對象提供的若干屬性對文檔樹進行自上而下、水平方向、自下而上遍歷解析。創建BeautifulSoup對象代碼如下:>>>frombs4importBeautifulSoup>>>html='''<html><head><title>歡迎登陸HTML網站首頁</title></head><body><tableborder="1"align="center"><tralign="center"valign="middle"><tdwidth="150"height="40"><b><fontcolor="red">基礎學習知識</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">學習教程</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">在線書籍閱讀</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">練習基地</font></b></td></tr><tralign="center"valign="middle"><tdwidth="150"height="40"><b><fontcolor="red">代碼大全</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">最新文章</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">視頻教程</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">技術博客</font></b></td></tr> </table> </body></html>'''>>>soup=BeautifulSoup(html,'html.parser')1.通過Tag的名字來獲得Tag>>>print(soup.head)<head><title>歡迎登陸HTML網站首頁</title></head>>>>print(soup.title)<title>歡迎登陸HTML網站首頁</title>>>>soup.find_all("td")[<tdheight="40"width="150"><b><fontcolor="red">基礎學習知識</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">學習教程</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">在線書籍閱讀</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">練習基地</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">代碼大全</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">最新文章</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">視頻教程</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">技術博客</font></b></td>]2.contents屬性:將Tag的子節點通過列表的方式返回>>>soup.tr.contents['\n',<tdheight="40"width="150"><b><fontcolor="red">基礎學習知識</font></b></td>,'\n',<tdheight="40"width="150"><b><fontcolor="red">學習教程</font></b></td>,'\n',<tdheight="40"width="150"><b><fontcolor="red">在線書籍閱讀</font></b></td>,'\n',<tdheight="40"width="150"><b><fontcolor="red">練習基地</font></b></td>,'\n']>>>soup.tr.contents[1]<tdheight="40"width="150"><b><fontcolor="red">基礎學習知識</font></b></td>3.children:通過該屬性對子節點進行循環>>>tr_tag=soup.tr.contents[1]>>>forchildintr_tag.children: print(child)<b><fontcolor="red">基礎學習知識</font></b>4.descendants:不論是contents還是children都是返回直接子節點,而descendants對所有tag的子孫節點進行遞歸循環>>>forchildintr_tag.descendants: print(child)<b><fontcolor="red">基礎學習知識</font></b><fontcolor="red">基礎學習知識</font>基礎學習知識5.parent:獲得某個元素的所有父節點forparentinsoup.td.parents:ifparentisNone:print(parent)else:print()trtablebodyhtml[document]6.兄弟節點>>>print(soup.title.prettify())<title>

歡迎登陸HTML網站首頁</title>>>>soup.head.next_sibling'\n'>>>soup.head.previous_sibling'\n'7.回退與前進>>>soup.title.next_element'歡迎登陸HTML網站首頁'>>>soup.title.previous_element<head><title>歡迎登陸HTML網站首頁</title></head>11.5爬蟲技術應用實例我們都知道天氣變化對我們的工作生活影響很大,我們幾乎每天都要關注天氣。中國天氣網權威發布天氣預報,提供天氣預報查詢一周,天氣預報15天查詢,天氣預報40天查詢,空氣質量,生活指數,旅游出行,交通天氣等查詢服務。我們可以在此網站上查看本地區的天氣情況,了解氣溫變化。接下來我們就用我們所學的爬蟲技術抓取最近7天本地區的最高、最低氣溫。#coding:UTF-8frombs4importBeautifulSoupimportrequestsimportcsvimportrandomimporttimeimportsocketimporthttp.clientdefhtml_get_content(url,data=None):header={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Encoding':'gzip,deflate,sdch','Accept-Language':'zh-CN,zh;q=0.8','Connection':'keep-alive','User-Agent':'Mozilla/5.0(WindowsNT6.3;WOW64)AppleWebKit/537.36(KHTML,\likeGecko)Chrome/43.0.235'}timeout=random.choice(range(80,180))#設定的一個超時時間

whileTrue:try:rep=requests.get(url,headers=header,timeout=timeout)rep.encoding='utf-8'#不改源代碼中中文部分會為亂碼

breakexceptsocket.timeoutase:print('3:',e)time.sleep(random.choice(range(8,15)))exceptsocket.errorase:print('4:',e)time.sleep(random.choice(range(20,60)))excepthttp.client.BadStatusLinease:print('5:',e)time.sleep(random.choice(range(30,80)))excepthttp.client.IncompleteReadase:print('6:',e)time.sleep(random.choice(range(5,15)))returnrep.textdefhtml_get_data(html_text):final=[]bs=BeautifulSoup(html_text,"html.parser")#創建BeautifulSoup對象

body=bs.body#獲取body部分

data=body.find('div',{'id':'7d'})#找到id為7d的divul=data.find('ul')#獲取ul部分

li=ul.find_all('li')#獲取所有的lifordayinli:#對每個li標簽中的內容進行遍歷

temp=[]date=day.find('h1').string#找到日期

temp.append(date)#添加到temp中

inf=day.find_all('p')#找到li中的所有p標簽

temp.append(inf[0].string,)#第一個p標簽中的內容(天氣狀況)加到temp中“””天氣預報可能沒有當天的最高氣溫(到了傍晚,就是這樣),需要加個判斷語句,來輸出最低氣溫”””ifinf[1].find('span')isNone:temperature_highest=Noneelse

溫馨提示

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

評論

0/150

提交評論