




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第十一章網(wǎng)絡(luò)爬蟲技術(shù)一、學(xué)習(xí)目標(biāo):了解一些網(wǎng)絡(luò)知識及相關(guān)的爬蟲技術(shù),學(xué)會分析
簡單HTML文檔,利用Python提供的第三方庫提
取相應(yīng)網(wǎng)頁中的有價值的信息。
二、學(xué)習(xí)重點:requests、BeautifulSoup庫的使用。
三、學(xué)習(xí)難點:分析HTML源碼信息。11.1計算機(jī)網(wǎng)絡(luò)基礎(chǔ)知識11.1.1網(wǎng)絡(luò)層次劃分計算機(jī)網(wǎng)絡(luò)協(xié)議同我們的語言一樣,多種多樣。而ARPA公司與1977年到1979年推出了一種名為ARPANET的網(wǎng)絡(luò)協(xié)議受到了廣泛的熱捧,其中最主要的原因就是它推出了人盡皆知的TCP/IP標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議。目前TCP/IP協(xié)議已經(jīng)成為Internet中的"通用語言",使用協(xié)議A的網(wǎng)絡(luò)使用協(xié)議B的網(wǎng)絡(luò)TCP/IP為了使不同計算機(jī)廠家生產(chǎn)的計算機(jī)能夠相互通信,以便在更大的范圍內(nèi)建立計算機(jī)網(wǎng)絡(luò),國際標(biāo)準(zhǔn)化組織(ISO)在1978年提出了"開放系統(tǒng)互聯(lián)參考模型",即著名的OSI/RM模型(OpenSystemInterconnection/ReferenceModel)。它將計算機(jī)網(wǎng)絡(luò)體系結(jié)構(gòu)的通信協(xié)議劃分為七層,自下而上依次為:物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會話層、表示層、應(yīng)用層。其中第四層完成數(shù)據(jù)傳送服務(wù),上面三層面向用戶。11.1.2超文本標(biāo)記語言HTML超文本標(biāo)記語言(英語:HyperTextMarkupLanguage,簡稱:HTML)是一種用于創(chuàng)建網(wǎng)頁的標(biāo)準(zhǔn)標(biāo)記語言。您可以使用HTML來建立自己的WEB站點,HTML運行在瀏覽器上,由瀏覽器來解析。超文本是一種組織信息的方式,它通過超級鏈接方法將文本中的文字、圖表與其他信息媒體相關(guān)聯(lián)。這些相互關(guān)聯(lián)的信息媒體可能在同一文本中,也可能是其他文件,或是地理位置相距遙遠(yuǎn)的某臺計算機(jī)上的文件。這種組織信息方式將分布在不同位置的信息資源用隨機(jī)方式進(jìn)行連接,為人們查找,檢索信息提供方便。HTML,超文本標(biāo)記語言.簡單理解為某些字句加上標(biāo)志的語言,從而實現(xiàn)預(yù)期的特定效果。網(wǎng)頁正是由這種HTML語言所編寫出來的。作為一套標(biāo)記語言,基本上只要明白各種標(biāo)記的用法就算學(xué)會了HTML。HTML的語法格式分為嵌套與非嵌套兩類,嵌套格式為<標(biāo)記>...</標(biāo)記>,非嵌套只為<標(biāo)記>。此外,根據(jù)標(biāo)記的不同,有的標(biāo)記附帶有屬性參數(shù),則表示為<標(biāo)記屬性="參數(shù)值">,根據(jù)個人需要,可添加或去掉相應(yīng)的屬性標(biāo)記。1.基本框架如同人一樣,網(wǎng)頁也包括了“頭部”和“身體”。<head>標(biāo)記內(nèi)包含著諸如網(wǎng)頁標(biāo)題、語言編碼、網(wǎng)頁描述等基本信息,而平時我們真正見到的網(wǎng)頁內(nèi)容均放在<body>標(biāo)記內(nèi)?,F(xiàn)在先介紹一下<head>里的基本信息。2.組成要素?zé)o論網(wǎng)頁如何千變?nèi)f化,構(gòu)成一個網(wǎng)頁內(nèi)容的最基本要素大體只有五種,即文字、圖片、表格、超鏈接和表單控件。11.2網(wǎng)絡(luò)爬蟲網(wǎng)絡(luò)爬蟲又名“網(wǎng)絡(luò)蜘蛛”,是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁,從網(wǎng)站某一個頁面開始,讀取網(wǎng)頁的內(nèi)容,找到在網(wǎng)頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網(wǎng)頁,這樣一直循環(huán)下去,直到按照某種策略把互聯(lián)網(wǎng)上所有的網(wǎng)頁都抓取完為止的技術(shù)。11.2.1網(wǎng)絡(luò)爬蟲分類及工作原理網(wǎng)絡(luò)爬蟲按照系統(tǒng)結(jié)構(gòu)和實現(xiàn)技術(shù),大致可以分為以下幾種類型:通用網(wǎng)絡(luò)爬蟲主題網(wǎng)絡(luò)爬蟲深層網(wǎng)絡(luò)爬蟲。11.2.2使用Python訪問互聯(lián)網(wǎng),編寫爬蟲代碼。Pythonurllib庫用于操作網(wǎng)頁URL,并對網(wǎng)頁的內(nèi)容進(jìn)行抓取處理。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開源協(xié)議的HTTP庫,它比urllib更加方便,可以節(jié)約我們大量的工作,完全滿足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)運行結(jié)果:{"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.獲取響應(yīng)信息。通過status_code獲取響應(yīng)狀態(tài)碼。>>>r=requests.get('/get')>>>r.status_code200#requests內(nèi)置一個狀態(tài)碼查詢對象>>>print(r.status_code==requests.codes.ok)True>>>#如果發(fā)生了4xx或者5xx的錯誤響應(yīng),可以使用raise_for_status()函數(shù)來拋出異常>>>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>>>#如果請求沒有發(fā)生錯誤,則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的一個庫,最主要的功能是從網(wǎng)頁抓取數(shù)據(jù)。BeautifulSoup提供一些簡單的、python式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數(shù)據(jù),因為簡單,所以不需要多少代碼就可以寫出一個完整的應(yīng)用程序。BeautifulSoup自動將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,BeautifulSoup就不能自動識別編碼方式了。然后,你僅僅需要說明一下原始編碼方式就可以了。BeautifulSoup已成為和lxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策略或強(qiáng)勁的速度。11.4.1HTML文檔解析器解析器使用方法優(yōu)勢劣勢Python標(biāo)準(zhǔn)庫BeautifulSoup(markup,"html.parser")1、Python的內(nèi)置標(biāo)準(zhǔn)庫2、執(zhí)行速度適中3、文檔容錯能力強(qiáng)Python(2.7.3or3.2.2)前的版本中文檔容錯能力差lxmlHTM解析器BeautifulSoup(markup,"lxml")1、速度快2、文檔容錯能力強(qiáng)需要安裝C語言庫lxmlXML解析器BeautifulSoup(markup,["lxml","xml"])BeautifulSoup(markup,"xml")1、速度快2、唯一支持XML的解析器需要安裝C語言庫html5libBeautifulSoup(markup,"html5lib")1、最好的容錯性2、以瀏覽器的方式解析文檔3、生成HTML5格式的文檔速度慢不依賴外部擴(kuò)展11.4.2BeautifulSoup的四種對象BeautifulSoup將復(fù)雜HTML文檔轉(zhuǎn)換成一個復(fù)雜的樹形結(jié)構(gòu),每個節(jié)點都是Python對象,所有對象可以歸納為4種:? Tag? NavigableString? BeautifulSoup? Comment1.Tag,Tag通俗來講就是HTML中的一個個標(biāo)簽。importrequestsimportlxmlfrombs4importBeautifulSoupr=requests.get('/')r.encoding='utf-8'soup=BeautifulSoup(r.text,'lxml')print(soup.meta)#輸出標(biāo)簽對象print(type(soup.meta))#輸出對象類型print()#輸出標(biāo)簽類型print(soup.meta.attrs)#輸出標(biāo)簽屬性字典print(soup.meta['content'])#輸出標(biāo)簽content屬性print(soup.meta['http-equiv'])#輸出標(biāo)簽http-equiv屬性運行結(jié)果:<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可以遍歷字符串對象,用來操作那些包含在標(biāo)簽內(nèi)的字符串。實際上在解析HTML文檔時最關(guān)心的是標(biāo)簽里面碟內(nèi)容,而不是標(biāo)簽本身。于是NavigableString就可以提取信息,用.string方法即可。用上面的網(wǎng)頁信息可以用如下語句。soup=BeautifulSoup(r.text,'lxml')print(soup.p.string)print(soup.li.string)print(soup.h1.string)運行結(jié)果:歡迎訪問佳木斯大學(xué)!首頁校園快訊3.BeautifulSoup對象,它表示一個文檔的整體,可以看做是文檔樹的根或者一個頂節(jié)點,文檔中的所有標(biāo)簽及內(nèi)容都是它的后代節(jié)點。通常情況下,是從它開始向下搜索或遍歷文檔樹的。4.Comment對象,以上三種對象幾乎覆蓋來HTML文檔的所有內(nèi)容,但是還有一些特殊對象可能出現(xiàn)下文檔中卻不屬于以上三種,那就是文檔的注釋部分。這些注釋可以用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文檔可以映射為一顆樹,文檔中的標(biāo)簽可以認(rèn)為是樹的各個層的節(jié)點,對于這種結(jié)構(gòu),我們就可以對樹進(jìn)行遍歷訪問了。我們用Tag對象提供的若干屬性對文檔樹進(jìn)行自上而下、水平方向、自下而上遍歷解析。創(chuàng)建BeautifulSoup對象代碼如下:>>>frombs4importBeautifulSoup>>>html='''<html><head><title>歡迎登陸HTML網(wǎng)站首頁</title></head><body><tableborder="1"align="center"><tralign="center"valign="middle"><tdwidth="150"height="40"><b><fontcolor="red">基礎(chǔ)學(xué)習(xí)知識</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">學(xué)習(xí)教程</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">在線書籍閱讀</font></b></td><tdwidth="150"height="40"><b><fontcolor="red">練習(xí)基地</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">技術(shù)博客</font></b></td></tr> </table> </body></html>'''>>>soup=BeautifulSoup(html,'html.parser')1.通過Tag的名字來獲得Tag>>>print(soup.head)<head><title>歡迎登陸HTML網(wǎng)站首頁</title></head>>>>print(soup.title)<title>歡迎登陸HTML網(wǎng)站首頁</title>>>>soup.find_all("td")[<tdheight="40"width="150"><b><fontcolor="red">基礎(chǔ)學(xué)習(xí)知識</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">學(xué)習(xí)教程</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">在線書籍閱讀</font></b></td>,<tdheight="40"width="150"><b><fontcolor="red">練習(xí)基地</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">技術(shù)博客</font></b></td>]2.contents屬性:將Tag的子節(jié)點通過列表的方式返回>>>soup.tr.contents['\n',<tdheight="40"width="150"><b><fontcolor="red">基礎(chǔ)學(xué)習(xí)知識</font></b></td>,'\n',<tdheight="40"width="150"><b><fontcolor="red">學(xué)習(xí)教程</font></b></td>,'\n',<tdheight="40"width="150"><b><fontcolor="red">在線書籍閱讀</font></b></td>,'\n',<tdheight="40"width="150"><b><fontcolor="red">練習(xí)基地</font></b></td>,'\n']>>>soup.tr.contents[1]<tdheight="40"width="150"><b><fontcolor="red">基礎(chǔ)學(xué)習(xí)知識</font></b></td>3.children:通過該屬性對子節(jié)點進(jìn)行循環(huán)>>>tr_tag=soup.tr.contents[1]>>>forchildintr_tag.children: print(child)<b><fontcolor="red">基礎(chǔ)學(xué)習(xí)知識</font></b>4.descendants:不論是contents還是children都是返回直接子節(jié)點,而descendants對所有tag的子孫節(jié)點進(jìn)行遞歸循環(huán)>>>forchildintr_tag.descendants: print(child)<b><fontcolor="red">基礎(chǔ)學(xué)習(xí)知識</font></b><fontcolor="red">基礎(chǔ)學(xué)習(xí)知識</font>基礎(chǔ)學(xué)習(xí)知識5.parent:獲得某個元素的所有父節(jié)點forparentinsoup.td.parents:ifparentisNone:print(parent)else:print()trtablebodyhtml[document]6.兄弟節(jié)點>>>print(soup.title.prettify())<title>
歡迎登陸HTML網(wǎng)站首頁</title>>>>soup.head.next_sibling'\n'>>>soup.head.previous_sibling'\n'7.回退與前進(jìn)>>>soup.title.next_element'歡迎登陸HTML網(wǎng)站首頁'>>>soup.title.previous_element<head><title>歡迎登陸HTML網(wǎng)站首頁</title></head>11.5爬蟲技術(shù)應(yīng)用實例我們都知道天氣變化對我們的工作生活影響很大,我們幾乎每天都要關(guān)注天氣。中國天氣網(wǎng)權(quán)威發(fā)布天氣預(yù)報,提供天氣預(yù)報查詢一周,天氣預(yù)報15天查詢,天氣預(yù)報40天查詢,空氣質(zhì)量,生活指數(shù),旅游出行,交通天氣等查詢服務(wù)。我們可以在此網(wǎng)站上查看本地區(qū)的天氣情況,了解氣溫變化。接下來我們就用我們所學(xué)的爬蟲技術(shù)抓取最近7天本地區(qū)的最高、最低氣溫。#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))#設(shè)定的一個超時時間
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")#創(chuàng)建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標(biāo)簽中的內(nèi)容進(jìn)行遍歷
temp=[]date=day.find('h1').string#找到日期
temp.append(date)#添加到temp中
inf=day.find_all('p')#找到li中的所有p標(biāo)簽
temp.append(inf[0].string,)#第一個p標(biāo)簽中的內(nèi)容(天氣狀況)加到temp中“””天氣預(yù)報可能沒有當(dāng)天的最高氣溫(到了傍晚,就是這樣),需要加個判斷語句,來輸出最低氣溫”””ifinf[1].find('span')isNone:temperature_highest=Noneelse
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年福建省事業(yè)單位招聘考試綜合類專業(yè)能力測試試卷(建筑類)試題
- 2025年電子商務(wù)師(中級)電子商務(wù)法律法規(guī)與政策案例分析試卷
- 2025年統(tǒng)計學(xué)專業(yè)期末考試:抽樣調(diào)查方法與統(tǒng)計推斷綜合案例分析試題
- 2025年鋼筋工(高級)考試試卷:鋼筋工程施工質(zhì)量事故分析及預(yù)防
- 2025年南京市事業(yè)單位招聘考試教師招聘化學(xué)學(xué)科專業(yè)知識試題(初中)
- 2025年非心源性胸痛診療試題
- 2025年建筑行業(yè)農(nóng)民工權(quán)益保障與用工模式變革下的行業(yè)風(fēng)險管理與創(chuàng)新實踐案例報告
- 2025年國際化教育中跨文化交流能力培養(yǎng)的師資培訓(xùn)策略報告
- 化工工藝安全操作與管理要點測試題
- 綠色建筑材料市場推廣政策與綠色建筑市場需求匹配度分析報告
- 藝術(shù)概論:第八章綜合藝術(shù)
- 管道工廠化預(yù)制推廣應(yīng)用課件
- 云南省臨滄市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細(xì)及行政區(qū)劃代碼
- 海水的淡化精品課件
- DB13T 5519.7-2022 軌道交通AFC系統(tǒng)線網(wǎng)技術(shù)要求 第7部分:數(shù)據(jù)接口
- 河流改道施工方案
- 項目工程移交生產(chǎn)驗收報告
- 清華大學(xué)美術(shù)學(xué)院陶瓷藝術(shù)設(shè)計系研究生導(dǎo)師及研究課題
- 計算機(jī)控制實驗報告初稿(共31頁)
- 抗磷脂抗體與抗磷脂綜合征.ppt
- 光伏發(fā)電項目工程質(zhì)量管理方案計劃策劃書
評論
0/150
提交評論