版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
網(wǎng)絡爬蟲項目實戰(zhàn)項目一:網(wǎng)頁數(shù)據(jù)獲取主講人:xxx231任務1.2今日頭條數(shù)據(jù)爬取
任務1.1讀書網(wǎng)信息爬取任務1.3京東動態(tài)渲染頁面的信息爬取目錄任務1.1讀書網(wǎng)信息爬取任務描述讀書網(wǎng)是中國國內(nèi)優(yōu)秀的讀書平臺,同時也是集書籍查詢、作者介紹、刊物定價、出版社、ISBN查詢的公益讀書網(wǎng)站。在網(wǎng)站首頁有一個“在線讀書”欄目,本任務的目的是爬取“在線讀書”欄目中圖書的詳情頁鏈接、書名和作者信息,“在線讀書”欄目如圖所示。任務目標要實現(xiàn)讀書網(wǎng)“在線讀書”欄目中圖書的詳情頁鏈接、書名和作者信息,需要學習以下知識:掌握使用正則表達式爬取數(shù)據(jù)的方法掌握處理爬取數(shù)據(jù)亂碼的方法掌握爬取連接不完整情況處理的方法1.網(wǎng)頁結(jié)構(gòu)分析進入讀書網(wǎng)網(wǎng)站首頁,按F12鍵查看網(wǎng)頁源代碼,如圖1-2所示。從源代碼可以看出,整個在線讀書是用一個div標簽標包括起來的,每一本書用一個li標簽表示,本任務需要爬取的書籍鏈接由a標簽的href屬性標示,書名由a標簽包括起來,作者信息由標有class=“bookauthor”的div標簽包括。通過源碼分析,會發(fā)現(xiàn)一個問題,網(wǎng)頁源碼中的書籍鏈接信息只有一部分,而不是完整鏈接,因此需要進行URL補全。任務實施2.解決爬蟲中文亂碼通過F12鍵查看網(wǎng)頁源代碼的head部分的編碼,如圖1-8所示,發(fā)現(xiàn)網(wǎng)頁編碼類型為UTF-8。任務實施利用requests庫的encoding方法查看默認輸出的編碼類型,代碼如下:importrequestsresponse=requests.get('/')print(response.encoding)2.解決爬蟲中文亂碼利用requests庫encoding方法改變輸出結(jié)果的編碼,代碼如下:任務實施importrequestsresponse=requests.get('/')response.encoding='utf-8'print(response.encoding)3.網(wǎng)頁數(shù)據(jù)爬取代碼編寫時將網(wǎng)頁源碼獲取,編碼方式設置等封裝為一個方法,代碼如下:任務實施defget_html(url):try:response=requests.get(url)response.encoding='utf-8'#改變編碼
print(response.encoding)html=response.textreturnhtmlexcept:print('請求網(wǎng)址出錯')content=get_html('/')3.網(wǎng)頁數(shù)據(jù)爬取通過源碼分析,可以看出每一本書用一個li標簽表示,本任務需要爬取的書籍鏈接由a標簽的href屬性標示,書名由a標簽包括起來,作者信息由標有class=“bookauthor”的div標簽包括。而為了進行一定的限定,已做到精確匹配,可以在正則表達式中加上“class="bookname"”、“target="_blank"”和“class="bookauthor"”等關鍵信息的限定。因此根據(jù)源碼,寫出正則表達式如下:任務實施<li>.*?class="bookname">.*?href="(.*?)".*?target="_blank">(.*?)</a>.*?class="bookauthor">(.*?)</div>.*?</li>3.網(wǎng)頁數(shù)據(jù)爬取將正則字符轉(zhuǎn)換為正則表達式需要用到re庫中的compile方法。pile:將正則字符串編譯成正則表達式對象,以便于復用該匹配模式。pile一般需要傳入兩個參數(shù):①第一個參數(shù):正則字符。②第二個參數(shù):匹配模式。匹配模式:正則表達式可以包含一些可選標志修飾符來控制匹配模式。常見的修飾符有6中,具體含義如表所示。任務實施修飾符描述re.I使匹配對大小寫不敏感re.L做本地化識別(locale-aware)匹配re.M多行匹配,影響^和$re.S使*匹配包括換行在內(nèi)的所有字符re.U根據(jù)Unicode字符集解析字符。這個標志影響\w、\W、\b和\Bre.X該標志通過給予你更靈活的格式以便你將正則表達式寫的更易于理解3.網(wǎng)頁數(shù)據(jù)爬取用于查找匹配內(nèi)容的方法采用re庫中的findall方法。findall:搜索字符串,以列表形式返回全部能匹配的子串。一般需要傳入兩個參數(shù):第一個參數(shù):正則表達式。第二個參數(shù):匹配的內(nèi)容。返回結(jié)果:列表。因此輸入打印返回結(jié)果的需要循環(huán)輸出。任務實施3.網(wǎng)頁數(shù)據(jù)爬取通過查看源碼,發(fā)現(xiàn)源碼中a標簽屬性href中確實只有部分URL,但是將鼠標移至href鏈接時會彈出完整鏈接,完整鏈接如圖所示。對比爬取結(jié)果,發(fā)現(xiàn)爬取結(jié)果缺少“”段網(wǎng)站,因此在打印時應該補全。任務實施完整代碼任務實施#讀書網(wǎng)爬蟲任務importrequestsimportredefget_html(url):
try:
response=requests.get(url)
response.encoding='utf-8'
#改變編碼
print(response.encoding)
html=response.text
returnhtml
except:
print('請求網(wǎng)址出錯')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)請將書海網(wǎng)圖書鏈接和書名信息爬取下來課后習題任務1.2今日頭條數(shù)據(jù)爬取任務描述瀏覽網(wǎng)頁的時候,經(jīng)常會發(fā)現(xiàn)很多網(wǎng)頁都有下滑查看更多的選項。如圖所示的今日頭條(/)網(wǎng)站,剛剛進入后只會展現(xiàn)有限的新聞,但是隨著網(wǎng)頁的不斷下滑,可以瀏覽更多的新聞。如果遇到這樣的頁面,直接利用requests等庫來抓取原始頁面,是無法獲取到有效數(shù)據(jù)的,這時需要分析網(wǎng)頁后臺向接口發(fā)送的AJAX請求,如果可以用requests來模擬AJAX請求,那么就可以成功抓取了。在今日頭條中搜索關鍵字過濾重定向網(wǎng)頁下載圖片信息保存至本地保存鏈接信息至mongoDB任務目標今日頭條是采用AJAX持續(xù)不斷的請求內(nèi)容,因此在抓取網(wǎng)頁數(shù)據(jù)時候,需要發(fā)送AJAX請求,而不是普通請求。進入今日頭條官網(wǎng)(/),在搜索框中輸入“街拍”,可以進入搜索結(jié)果頁面。此時按F12鍵調(diào)出開發(fā)人員工具,然后刷新頁面。在開發(fā)人員工具中,點擊Network,勾選“Preservelog”和“HidedataURLs”,并點擊All,會發(fā)現(xiàn)此時的Preview中的內(nèi)容被隱藏了。如圖1-14所示預覽內(nèi)容被隱藏,也就是返回數(shù)據(jù)被隱藏起來了。任務實施1爬取網(wǎng)頁數(shù)據(jù)切換到“XHR”選項,這時在Preview選項中就可以找到返回來的Json數(shù)據(jù),如圖1-15所示,頁面中的數(shù)據(jù)被以Json返回,并且在Json數(shù)據(jù)中的key為“data”。任務實施1爬取網(wǎng)頁數(shù)據(jù)切換到“Headers”選項卡,這是可以看到“RequestURL”中寫的URL是以“/api/search/content/?”開頭的地址,而實際瀏覽器中的地址是“/search/?keyword=街拍”,可以看出今日頭條網(wǎng)站對將實際請求數(shù)據(jù)的網(wǎng)站進行了變換,所以我們爬蟲的時候需要用“RequestURL”中的地址,如圖1-16所示。任務實施1爬取網(wǎng)頁數(shù)據(jù)兩個參數(shù)需要特別注意,一個是“offset”,這個參數(shù)代表網(wǎng)頁每次發(fā)送Ajax請求是的偏移量,另外一個是“count”,這個參數(shù)代表每次請求返回多少條數(shù)據(jù)。如圖1-18所示,每次請求的offset是遞增,offset開始時為0,count為20,所以第二次請求的時候offset的值就為20了,以此類推。任務實施1爬取網(wǎng)頁數(shù)據(jù)在Python代碼實現(xiàn)過程中,可以定義一個字典表示圖1-16中的參數(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這樣的鍵值對轉(zhuǎn)換成我們想要的格式,返回的是a=1&b=2這樣的字符串。如下列代碼的運行結(jié)果為“http:/?a=1&b=2”:任務實施1爬取網(wǎng)頁數(shù)據(jù)fromurllib.parseimporturlencodedata={"a":1,"b":2}url="http:/?"print(url+urlencode(data))將獲取網(wǎng)頁的代碼封裝成get_page_index方法運行上述代碼,會發(fā)現(xiàn)結(jié)果為空,返回的json數(shù)據(jù)為空的原因是requests的請求對象沒有加請求頭和cookies,因此加上請求頭和cookies并進行相應的異常處理。任務實施1爬取網(wǎng)頁數(shù)據(jù)在今日頭條網(wǎng)站上,搜索“街拍”,返回的是一條一條的搜索結(jié)果,如果想要查看每一條結(jié)果的詳情,需要點擊每一條結(jié)果,在爬蟲里面是需要從新發(fā)送一條請求,這時我們需要知道,該結(jié)果的URL地址。要獲得搜索結(jié)果詳情,第一步則需要獲得結(jié)果詳情頁的URL。獲取到搜索結(jié)果的URL后,就可以利用URL獲得搜索結(jié)果詳情頁中的數(shù)據(jù)了。任務實施2獲取搜索結(jié)果詳情圖
每一條結(jié)果的詳細JSON數(shù)據(jù)定義方法get_page_url用于獲取詳情頁訪問鏈接,具體代碼如下:任務實施2獲取搜索結(jié)果詳情圖
每一條結(jié)果的詳細JSON數(shù)據(jù)defget_page_url(html):data=json.loads(html)#將json字符串轉(zhuǎn)換為json變量
ifdataand"data"indata.keys():foritemindata.get("data"):#知識點3:字典獲取鍵的值的get方法
if"article_url"initem.keys():url=item.get("article_url")yieldurl獲取到搜索結(jié)果的URL后,就可以利用URL獲得搜索結(jié)果詳情頁中的數(shù)據(jù)了,具體代碼如下:任務實施2獲取搜索結(jié)果詳情圖
每一條結(jié)果的詳細JSON數(shù)據(jù)defget_page_detial(url):try:#知識點4:請求的異常處理方式
response=requests.get(url,headers=headers,cookies=cookies)ifresponse.status_code==200:content=response.content.decode()returncontentreturnNoneexceptRequestException:print("請求出錯")returnNone在上一步已經(jīng)獲取到了詳情頁的數(shù)據(jù),接下來將講述如何獲取詳情頁中的“title”、圖片和視頻數(shù)據(jù)。1、獲取“title”信息2、獲取并下載圖片3、獲取并下載視頻新建一個方法,命名為“parse_page_detial”具體代碼如下:任務實施3解析詳情頁數(shù)據(jù)defparse_page_detial(content,url):"""正則獲取gallery"""soup=BeautifulSoup(content,"lxml")1、獲取“title”信息按F12鍵,選擇Network,點擊Doc,然后選擇Response,在Response可以看到網(wǎng)頁的源代碼,這里的源碼都是顯示成一行,不方便查看,可以將源碼復制到其他軟件格式化后查看。如圖1-21所示詳情頁源碼,可以看到任務要獲取的“title”信息在源碼中用<title>標簽包括住任務實施3解析詳情頁數(shù)據(jù)1、獲取“title”信息這里采用BeautifulSoup的find方法獲取標簽中的信息,在“parse_page_detial”方法中添加如下代碼任務實施3解析詳情頁數(shù)據(jù)if(soup.find("title")!=None):title=soup.find("title").string#知識點5:soup的選擇器使用2、獲取并下載圖片使用相同的方式查看源碼,如圖1-22所示,和title不同的是,圖片的鏈接都在<img>標簽的src屬性中。這里采用正則表達式獲取圖片鏈接,在“parse_page_detial”方法中添加如下代碼:任務實施3解析詳情頁數(shù)據(jù)images_pattern=pile('<img.*?src="(.*?)".*?>',re.S)#知識點6:正則模式re.S模式images=re.findall(images_pattern,content)2、獲取并下載圖片由于網(wǎng)頁詳情頁中可能不止一張圖片,所以需要通過for循環(huán)得到所有圖片鏈接,并進行下載。在“parse_page_detial”方法中添加如下代碼:任務實施3解析詳情頁數(shù)據(jù)forimageinimages:download_image(image)其中“download_image”方法用于下載圖片,具體代碼如下:任務實施3解析詳情頁數(shù)據(jù)defdownload_image(url):print('正在下載圖片',url)try:response=requests.get(url,headers=my_header)ifresponse.status_code==200:#圖片要以二進制的形式保存
save_image(response.content)returnNoneexceptRequestException:print('請求圖片出錯',url)returnNone新建一個方法保存圖片,命名為“save_image”,具體代碼如下:任務實施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>標簽里面的href屬性中,這里采用正則表達式獲取視頻鏈接。任務實施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”方法用于下載圖片,具體代碼如下:任務實施3解析詳情頁數(shù)據(jù)defdownload_movie(url,title):print('正在下載視頻',url)#下載到本地
dl=DownloadMovie()dl.download(url,title)DownloadMovie類實現(xiàn)方法參見書2.3節(jié)本任務從網(wǎng)頁爬取下來的數(shù)據(jù)除了圖片和視頻外,還有“title”、圖片鏈接、視頻鏈接和網(wǎng)站的網(wǎng)址。因此需要將這些信息保存到MongoDB中。本任務將需要存儲的數(shù)據(jù)以字典形式返回,在“parse_page_detial”方法中添加如下代碼:任務實施4數(shù)據(jù)保存return{"title":title,"images":images,"movie":movies,"url":url}將數(shù)據(jù)保存到MongoDB中,需要獲取MongoDB的連接客戶端,具體代碼如下:任務實施4數(shù)據(jù)保存importpymongo#連接mongo數(shù)據(jù)庫False是因為多進程下頻繁的連接會報錯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('存儲成功',result)returnTruereturnFalse以上程序中用到的相關參數(shù)信息如下:任務實施4數(shù)據(jù)保存MONGO_URL='localhost'MONGO_DB='toutiao'MONGO_TABLE='toutiao'以上所有方法編寫完成后,還需要編寫一個主程序方法用于運行程序,具體代碼如下:任務實施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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025中國誠通控股集團有限公司國際業(yè)務部招聘筆試歷年備考題庫附帶答案詳解
- 2025中國水利水電第十二工程局有限公司云南分公司選聘5人筆試參考題庫附帶答案詳解
- 2025中國冶金地質(zhì)總局在京單位擬接收應屆畢業(yè)生情況筆試歷年典型考點題庫附帶答案詳解
- 新員工培訓技巧教學
- 新員工培訓分享會
- 清潔開荒培訓課件
- 新員工入職安全生產(chǎn)培訓
- 清潔與管理培訓
- 新員工住宿培訓
- 2026年黨史知識競賽單選題200題附答案
- 交期縮短計劃控制程序
- 神經(jīng)指南:腦血管造影術操作規(guī)范中國專家共識
- 物理必修一綜合測試題
- 文化區(qū)發(fā)展策略研究-以香港西九龍文化區(qū)和牛棚藝術村為例
- 廣東二甲以上醫(yī)院 共152家
- 電力溫控行業(yè)研究報告
- GB/T 4358-1995重要用途碳素彈簧鋼絲
- GB/T 35263-2017紡織品接觸瞬間涼感性能的檢測和評價
- 2023年1月浙江首考高考英語試卷真題及答案(含聽力原文mp3+作文范文)
- 《其它血型系統(tǒng)簡介》教學課件
- (優(yōu)質(zhì)課件)人教版小學五年級上冊數(shù)學《列方程解應用題》課件3
評論
0/150
提交評論