《網(wǎng)絡(luò)爬蟲項(xiàng)目實(shí)踐》課件-項(xiàng)目一:網(wǎng)頁數(shù)據(jù)獲取_第1頁
《網(wǎng)絡(luò)爬蟲項(xiàng)目實(shí)踐》課件-項(xiàng)目一:網(wǎng)頁數(shù)據(jù)獲取_第2頁
《網(wǎng)絡(luò)爬蟲項(xiàng)目實(shí)踐》課件-項(xiàng)目一:網(wǎng)頁數(shù)據(jù)獲取_第3頁
《網(wǎng)絡(luò)爬蟲項(xiàng)目實(shí)踐》課件-項(xiàng)目一:網(wǎng)頁數(shù)據(jù)獲取_第4頁
《網(wǎng)絡(luò)爬蟲項(xiàng)目實(shí)踐》課件-項(xiàng)目一:網(wǎng)頁數(shù)據(jù)獲取_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

網(wǎng)絡(luò)爬蟲項(xiàng)目實(shí)戰(zhàn)項(xiàng)目一:網(wǎng)頁數(shù)據(jù)獲取主講人:xxx231任務(wù)1.2今日頭條數(shù)據(jù)爬取

任務(wù)1.1讀書網(wǎng)信息爬取任務(wù)1.3京東動(dòng)態(tài)渲染頁面的信息爬取目錄任務(wù)1.1讀書網(wǎng)信息爬取任務(wù)描述讀書網(wǎng)是中國國內(nèi)優(yōu)秀的讀書平臺(tái),同時(shí)也是集書籍查詢、作者介紹、刊物定價(jià)、出版社、ISBN查詢的公益讀書網(wǎng)站。在網(wǎng)站首頁有一個(gè)“在線讀書”欄目,本任務(wù)的目的是爬取“在線讀書”欄目中圖書的詳情頁鏈接、書名和作者信息,“在線讀書”欄目如圖所示。任務(wù)目標(biāo)要實(shí)現(xiàn)讀書網(wǎng)“在線讀書”欄目中圖書的詳情頁鏈接、書名和作者信息,需要學(xué)習(xí)以下知識(shí):掌握使用正則表達(dá)式爬取數(shù)據(jù)的方法掌握處理爬取數(shù)據(jù)亂碼的方法掌握爬取連接不完整情況處理的方法1.網(wǎng)頁結(jié)構(gòu)分析進(jìn)入讀書網(wǎng)網(wǎng)站首頁,按F12鍵查看網(wǎng)頁源代碼,如圖1-2所示。從源代碼可以看出,整個(gè)在線讀書是用一個(gè)div標(biāo)簽標(biāo)包括起來的,每一本書用一個(gè)li標(biāo)簽表示,本任務(wù)需要爬取的書籍鏈接由a標(biāo)簽的href屬性標(biāo)示,書名由a標(biāo)簽包括起來,作者信息由標(biāo)有class=“bookauthor”的div標(biāo)簽包括。通過源碼分析,會(huì)發(fā)現(xiàn)一個(gè)問題,網(wǎng)頁源碼中的書籍鏈接信息只有一部分,而不是完整鏈接,因此需要進(jìn)行URL補(bǔ)全。任務(wù)實(shí)施2.解決爬蟲中文亂碼通過F12鍵查看網(wǎng)頁源代碼的head部分的編碼,如圖1-8所示,發(fā)現(xiàn)網(wǎng)頁編碼類型為UTF-8。任務(wù)實(shí)施利用requests庫的encoding方法查看默認(rèn)輸出的編碼類型,代碼如下:importrequestsresponse=requests.get('/')print(response.encoding)2.解決爬蟲中文亂碼利用requests庫encoding方法改變輸出結(jié)果的編碼,代碼如下:任務(wù)實(shí)施importrequestsresponse=requests.get('/')response.encoding='utf-8'print(response.encoding)3.網(wǎng)頁數(shù)據(jù)爬取代碼編寫時(shí)將網(wǎng)頁源碼獲取,編碼方式設(shè)置等封裝為一個(gè)方法,代碼如下:任務(wù)實(shí)施defget_html(url):try:response=requests.get(url)response.encoding='utf-8'#改變編碼

print(response.encoding)html=response.textreturnhtmlexcept:print('請(qǐng)求網(wǎng)址出錯(cuò)')content=get_html('/')3.網(wǎng)頁數(shù)據(jù)爬取通過源碼分析,可以看出每一本書用一個(gè)li標(biāo)簽表示,本任務(wù)需要爬取的書籍鏈接由a標(biāo)簽的href屬性標(biāo)示,書名由a標(biāo)簽包括起來,作者信息由標(biāo)有class=“bookauthor”的div標(biāo)簽包括。而為了進(jìn)行一定的限定,已做到精確匹配,可以在正則表達(dá)式中加上“class="bookname"”、“target="_blank"”和“class="bookauthor"”等關(guān)鍵信息的限定。因此根據(jù)源碼,寫出正則表達(dá)式如下:任務(wù)實(shí)施<li>.*?class="bookname">.*?href="(.*?)".*?target="_blank">(.*?)</a>.*?class="bookauthor">(.*?)</div>.*?</li>3.網(wǎng)頁數(shù)據(jù)爬取將正則字符轉(zhuǎn)換為正則表達(dá)式需要用到re庫中的compile方法。pile:將正則字符串編譯成正則表達(dá)式對(duì)象,以便于復(fù)用該匹配模式。pile一般需要傳入兩個(gè)參數(shù):①第一個(gè)參數(shù):正則字符。②第二個(gè)參數(shù):匹配模式。匹配模式:正則表達(dá)式可以包含一些可選標(biāo)志修飾符來控制匹配模式。常見的修飾符有6中,具體含義如表所示。任務(wù)實(shí)施修飾符描述re.I使匹配對(duì)大小寫不敏感re.L做本地化識(shí)別(locale-aware)匹配re.M多行匹配,影響^和$re.S使*匹配包括換行在內(nèi)的所有字符re.U根據(jù)Unicode字符集解析字符。這個(gè)標(biāo)志影響\w、\W、\b和\Bre.X該標(biāo)志通過給予你更靈活的格式以便你將正則表達(dá)式寫的更易于理解3.網(wǎng)頁數(shù)據(jù)爬取用于查找匹配內(nèi)容的方法采用re庫中的findall方法。findall:搜索字符串,以列表形式返回全部能匹配的子串。一般需要傳入兩個(gè)參數(shù):第一個(gè)參數(shù):正則表達(dá)式。第二個(gè)參數(shù):匹配的內(nèi)容。返回結(jié)果:列表。因此輸入打印返回結(jié)果的需要循環(huán)輸出。任務(wù)實(shí)施3.網(wǎng)頁數(shù)據(jù)爬取通過查看源碼,發(fā)現(xiàn)源碼中a標(biāo)簽屬性href中確實(shí)只有部分URL,但是將鼠標(biāo)移至href鏈接時(shí)會(huì)彈出完整鏈接,完整鏈接如圖所示。對(duì)比爬取結(jié)果,發(fā)現(xiàn)爬取結(jié)果缺少“”段網(wǎng)站,因此在打印時(shí)應(yīng)該補(bǔ)全。任務(wù)實(shí)施完整代碼任務(wù)實(shí)施#讀書網(wǎng)爬蟲任務(wù)importrequestsimportredefget_html(url):

try:

response=requests.get(url)

response.encoding='utf-8'

#改變編碼

print(response.encoding)

html=response.text

returnhtml

except:

print('請(qǐng)求網(wǎng)址出錯(cuò)')content=get_html('/')pattern=pile('<li>.*?class="bookname">.*?href="(.*?)".*?target="_blank">(.*?)</a>.*?class="bookauthor">(.*?)</div>.*?</li>',re.S)results=re.findall(pattern,content)forresultinresults:

url,name,author=result

print(""+url,name,author)請(qǐng)將書海網(wǎng)圖書鏈接和書名信息爬取下來課后習(xí)題任務(wù)1.2今日頭條數(shù)據(jù)爬取任務(wù)描述瀏覽網(wǎng)頁的時(shí)候,經(jīng)常會(huì)發(fā)現(xiàn)很多網(wǎng)頁都有下滑查看更多的選項(xiàng)。如圖所示的今日頭條(/)網(wǎng)站,剛剛進(jìn)入后只會(huì)展現(xiàn)有限的新聞,但是隨著網(wǎng)頁的不斷下滑,可以瀏覽更多的新聞。如果遇到這樣的頁面,直接利用requests等庫來抓取原始頁面,是無法獲取到有效數(shù)據(jù)的,這時(shí)需要分析網(wǎng)頁后臺(tái)向接口發(fā)送的AJAX請(qǐng)求,如果可以用requests來模擬AJAX請(qǐng)求,那么就可以成功抓取了。在今日頭條中搜索關(guān)鍵字過濾重定向網(wǎng)頁下載圖片信息保存至本地保存鏈接信息至mongoDB任務(wù)目標(biāo)今日頭條是采用AJAX持續(xù)不斷的請(qǐng)求內(nèi)容,因此在抓取網(wǎng)頁數(shù)據(jù)時(shí)候,需要發(fā)送AJAX請(qǐng)求,而不是普通請(qǐng)求。進(jìn)入今日頭條官網(wǎng)(/),在搜索框中輸入“街拍”,可以進(jìn)入搜索結(jié)果頁面。此時(shí)按F12鍵調(diào)出開發(fā)人員工具,然后刷新頁面。在開發(fā)人員工具中,點(diǎn)擊Network,勾選“Preservelog”和“HidedataURLs”,并點(diǎn)擊All,會(huì)發(fā)現(xiàn)此時(shí)的Preview中的內(nèi)容被隱藏了。如圖1-14所示預(yù)覽內(nèi)容被隱藏,也就是返回?cái)?shù)據(jù)被隱藏起來了。任務(wù)實(shí)施1爬取網(wǎng)頁數(shù)據(jù)切換到“XHR”選項(xiàng),這時(shí)在Preview選項(xiàng)中就可以找到返回來的Json數(shù)據(jù),如圖1-15所示,頁面中的數(shù)據(jù)被以Json返回,并且在Json數(shù)據(jù)中的key為“data”。任務(wù)實(shí)施1爬取網(wǎng)頁數(shù)據(jù)切換到“Headers”選項(xiàng)卡,這是可以看到“RequestURL”中寫的URL是以“/api/search/content/?”開頭的地址,而實(shí)際瀏覽器中的地址是“/search/?keyword=街拍”,可以看出今日頭條網(wǎng)站對(duì)將實(shí)際請(qǐng)求數(shù)據(jù)的網(wǎng)站進(jìn)行了變換,所以我們爬蟲的時(shí)候需要用“RequestURL”中的地址,如圖1-16所示。任務(wù)實(shí)施1爬取網(wǎng)頁數(shù)據(jù)兩個(gè)參數(shù)需要特別注意,一個(gè)是“offset”,這個(gè)參數(shù)代表網(wǎng)頁每次發(fā)送Ajax請(qǐng)求是的偏移量,另外一個(gè)是“count”,這個(gè)參數(shù)代表每次請(qǐng)求返回多少條數(shù)據(jù)。如圖1-18所示,每次請(qǐng)求的offset是遞增,offset開始時(shí)為0,count為20,所以第二次請(qǐng)求的時(shí)候offset的值就為20了,以此類推。任務(wù)實(shí)施1爬取網(wǎng)頁數(shù)據(jù)在Python代碼實(shí)現(xiàn)過程中,可以定義一個(gè)字典表示圖1-16中的參數(shù),具體代碼如下:任務(wù)實(shí)施1爬取網(wǎng)頁數(shù)據(jù)params={'aid':24,'app_name':'web_search','offset':offset,'format':'json','keyword':keyword,'autoload':'true','count':'20','en_qc':1,'cur_tab':'1','from':'search_tab','pd':'synthesis','timestamp':1578048043413}使用urllib庫里urlencode函數(shù),urlencode函數(shù)可以把key-value這樣的鍵值對(duì)轉(zhuǎn)換成我們想要的格式,返回的是a=1&b=2這樣的字符串。如下列代碼的運(yùn)行結(jié)果為“http:/?a=1&b=2”:任務(wù)實(shí)施1爬取網(wǎng)頁數(shù)據(jù)fromurllib.parseimporturlencodedata={"a":1,"b":2}url="http:/?"print(url+urlencode(data))將獲取網(wǎng)頁的代碼封裝成get_page_index方法運(yùn)行上述代碼,會(huì)發(fā)現(xiàn)結(jié)果為空,返回的json數(shù)據(jù)為空的原因是requests的請(qǐng)求對(duì)象沒有加請(qǐng)求頭和cookies,因此加上請(qǐng)求頭和cookies并進(jìn)行相應(yīng)的異常處理。任務(wù)實(shí)施1爬取網(wǎng)頁數(shù)據(jù)在今日頭條網(wǎng)站上,搜索“街拍”,返回的是一條一條的搜索結(jié)果,如果想要查看每一條結(jié)果的詳情,需要點(diǎn)擊每一條結(jié)果,在爬蟲里面是需要從新發(fā)送一條請(qǐng)求,這時(shí)我們需要知道,該結(jié)果的URL地址。要獲得搜索結(jié)果詳情,第一步則需要獲得結(jié)果詳情頁的URL。獲取到搜索結(jié)果的URL后,就可以利用URL獲得搜索結(jié)果詳情頁中的數(shù)據(jù)了。任務(wù)實(shí)施2獲取搜索結(jié)果詳情圖

每一條結(jié)果的詳細(xì)JSON數(shù)據(jù)定義方法get_page_url用于獲取詳情頁訪問鏈接,具體代碼如下:任務(wù)實(shí)施2獲取搜索結(jié)果詳情圖

每一條結(jié)果的詳細(xì)JSON數(shù)據(jù)defget_page_url(html):data=json.loads(html)#將json字符串轉(zhuǎn)換為json變量

ifdataand"data"indata.keys():foritemindata.get("data"):#知識(shí)點(diǎn)3:字典獲取鍵的值的get方法

if"article_url"initem.keys():url=item.get("article_url")yieldurl獲取到搜索結(jié)果的URL后,就可以利用URL獲得搜索結(jié)果詳情頁中的數(shù)據(jù)了,具體代碼如下:任務(wù)實(shí)施2獲取搜索結(jié)果詳情圖

每一條結(jié)果的詳細(xì)JSON數(shù)據(jù)defget_page_detial(url):try:#知識(shí)點(diǎn)4:請(qǐng)求的異常處理方式

response=requests.get(url,headers=headers,cookies=cookies)ifresponse.status_code==200:content=response.content.decode()returncontentreturnNoneexceptRequestException:print("請(qǐng)求出錯(cuò)")returnNone在上一步已經(jīng)獲取到了詳情頁的數(shù)據(jù),接下來將講述如何獲取詳情頁中的“title”、圖片和視頻數(shù)據(jù)。1、獲取“title”信息2、獲取并下載圖片3、獲取并下載視頻新建一個(gè)方法,命名為“parse_page_detial”具體代碼如下:任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)defparse_page_detial(content,url):"""正則獲取gallery"""soup=BeautifulSoup(content,"lxml")1、獲取“title”信息按F12鍵,選擇Network,點(diǎn)擊Doc,然后選擇Response,在Response可以看到網(wǎng)頁的源代碼,這里的源碼都是顯示成一行,不方便查看,可以將源碼復(fù)制到其他軟件格式化后查看。如圖1-21所示詳情頁源碼,可以看到任務(wù)要獲取的“title”信息在源碼中用<title>標(biāo)簽包括住任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)1、獲取“title”信息這里采用BeautifulSoup的find方法獲取標(biāo)簽中的信息,在“parse_page_detial”方法中添加如下代碼任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)if(soup.find("title")!=None):title=soup.find("title").string#知識(shí)點(diǎn)5:soup的選擇器使用2、獲取并下載圖片使用相同的方式查看源碼,如圖1-22所示,和title不同的是,圖片的鏈接都在<img>標(biāo)簽的src屬性中。這里采用正則表達(dá)式獲取圖片鏈接,在“parse_page_detial”方法中添加如下代碼:任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)images_pattern=pile('<img.*?src="(.*?)".*?>',re.S)#知識(shí)點(diǎn)6:正則模式re.S模式images=re.findall(images_pattern,content)2、獲取并下載圖片由于網(wǎng)頁詳情頁中可能不止一張圖片,所以需要通過for循環(huán)得到所有圖片鏈接,并進(jìn)行下載。在“parse_page_detial”方法中添加如下代碼:任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)forimageinimages:download_image(image)其中“download_image”方法用于下載圖片,具體代碼如下:任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)defdownload_image(url):print('正在下載圖片',url)try:response=requests.get(url,headers=my_header)ifresponse.status_code==200:#圖片要以二進(jìn)制的形式保存

save_image(response.content)returnNoneexceptRequestException:print('請(qǐng)求圖片出錯(cuò)',url)returnNone新建一個(gè)方法保存圖片,命名為“save_image”,具體代碼如下:任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)#保存下載的圖片defsave_image(content):file_path='{0}/{1}.{2}'.format("D://image",md5(content).hexdigest(),'jpg')ifnotos.path.exists(file_path):withopen(file_path,'wb')asf:f.write(content)f.close()3、獲取并下載視頻如果遇到包含視頻的文章,則需要下載視頻,如圖1-23所示,網(wǎng)頁中的視頻鏈接在<link>標(biāo)簽里面的href屬性中,這里采用正則表達(dá)式獲取視頻鏈接。任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)movie_pattern=pile('<link.*?hrefLang="zh-CN".*?href="(.*?)".*?>',re.S)movies=re.findall(movie_pattern,content)formovieinmovies:download_movie(movie,title)在“parse_page_detial”方法中添加如下代碼:其中“download_movie”方法用于下載圖片,具體代碼如下:任務(wù)實(shí)施3解析詳情頁數(shù)據(jù)defdownload_movie(url,title):print('正在下載視頻',url)#下載到本地

dl=DownloadMovie()dl.download(url,title)DownloadMovie類實(shí)現(xiàn)方法參見書2.3節(jié)本任務(wù)從網(wǎng)頁爬取下來的數(shù)據(jù)除了圖片和視頻外,還有“title”、圖片鏈接、視頻鏈接和網(wǎng)站的網(wǎng)址。因此需要將這些信息保存到MongoDB中。本任務(wù)將需要存儲(chǔ)的數(shù)據(jù)以字典形式返回,在“parse_page_detial”方法中添加如下代碼:任務(wù)實(shí)施4數(shù)據(jù)保存return{"title":title,"images":images,"movie":movies,"url":url}將數(shù)據(jù)保存到MongoDB中,需要獲取MongoDB的連接客戶端,具體代碼如下:任務(wù)實(shí)施4數(shù)據(jù)保存importpymongo#連接mongo數(shù)據(jù)庫False是因?yàn)槎噙M(jìn)程下頻繁的連接會(huì)報(bào)錯(cuò)client=pymongo.MongoClient(MONGO_URL,connect=False)db=client[MONGO_DB]然后創(chuàng)建“save_to_mongo”方法用于數(shù)據(jù)保存,并在主程序方法中調(diào)用即可,具體代碼如下:#保存到數(shù)據(jù)庫defsave_to_mongo(result):ifdb[MONGO_TABLE].insert(result):print('存儲(chǔ)成功',result)returnTruereturnFalse以上程序中用到的相關(guān)參數(shù)信息如下:任務(wù)實(shí)施4數(shù)據(jù)保存MONGO_URL='localhost'MONGO_DB='toutiao'MONGO_TABLE='toutiao'以上所有方法編寫完成后,還需要編寫一個(gè)主程序方法用于運(yùn)行程序,具體代碼如下:任務(wù)實(shí)施4數(shù)據(jù)保存frommultiprocessingimportPooldefmain(offset):keyword="街拍"html=get_page_index(offset,keyword)ifhtml:forurlinget_page_url(html):content=get_page_detial(url)ifcontent:result=parse_page_detial(content,url)ifresult:save_to_mongo(r

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論