爬取一個(gè)網(wǎng)頁共分為兩步:
一是向服務(wù)器提出請求
當(dāng)我們在上網(wǎng)時(shí),每點(diǎn)擊一個(gè)新的網(wǎng)頁册舞,其實(shí)都是在向服務(wù)器發(fā)送一個(gè)請求(Request)匹表,服務(wù)器在接到我們的請求之后偶翅,會返回一個(gè)回信(Response)辜腺。在提出請求(Request)的方法中休建,一共有g(shù)et、post评疗、head测砂、put、options百匆、connect砌些、trace、delete等8種方法胧华,其中最常用的方法是get寄症,用get方法幾乎能爬取90%的網(wǎng)頁宙彪。
編寫代碼時(shí)矩动,需加載第三方庫requests,代碼寫為import requests释漆。
二是爬取網(wǎng)頁
通過爬蟲獲取數(shù)據(jù)一共分為3步:
①使用BeautifulSoup解析網(wǎng)頁
代碼寫為:soup = BeautifulSoup(html,'lxml')悲没,對這句代碼可以這樣理解:
Beautiful Soup是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫,它能夠通過你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式男图。
lxml也是Python庫示姿,將它放入 Beautiful Soup中,作為一種轉(zhuǎn)化工具逊笆,去對輸入的網(wǎng)頁進(jìn)行解析栈戳。
課程中,侯爵老師的類比非常生動难裆,如果說soup是我們準(zhǔn)備做的一碗湯子檀,那html就是所需的食材镊掖,而lxml就是做這碗湯所需的食譜。
②描述要爬取的信息位置
定位要爬取的信息位置代碼為:XXX = soup.select('需爬取信息的位置')褂痰,XXX為爬取信息的名稱亩进,select顧名思義,就是去選擇并找到解析出的信息缩歪。
以即將爬取的網(wǎng)頁http://bj.xiaozhu.com為例归薛,打開網(wǎng)頁,右鍵點(diǎn)擊檢查匪蝙,在彈出的窗口中主籍,右鍵點(diǎn)擊需爬取的內(nèi)容代碼,在彈出的窗口內(nèi)注意copy中的兩個(gè)選項(xiàng)逛球,一個(gè)是Copy selector崇猫,另一個(gè)是Copy XPath。兩者都是選擇復(fù)制網(wǎng)頁的位置路徑需忿,但略有不同诅炉。將兩者復(fù)制進(jìn)行比較:
Copy selector:
body > div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em
Copy XPath:
/html/body/div[3]/div[1]/div[1]/h4/em
在目前的爬蟲中,主要是使用Copy selector屋厘,具體介紹一下Copy selector涕烧。在Copy selector的路徑結(jié)構(gòu)中,【>】表示了父子級的關(guān)系汗洒,【.】表示的是class屬性议纯。
例如我去定位“白格美居?xùn)|三環(huán)地鐵國貿(mào)潘家園(長租特惠)”這個(gè)標(biāo)題,他的第一父級路徑就寫為div.wrap clearfix con_bg溢谤,子級路徑寫為:div.con_1瞻凤,子孫級路徑寫為:div.pho_info,最后找到子孫節(jié)點(diǎn)下的h4標(biāo)簽下的em標(biāo)簽世杀,獲取標(biāo)簽中的信息阀参。最終用【>】將父級、子級瞻坝、子孫級等全部連接起來蛛壳,最終路徑寫為:div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em。(PS:注意在【>】前后都必須有一個(gè)空格所刀。)
將路徑寫下來是為了幫助準(zhǔn)確定位需要的信息衙荐,但路徑并不是越詳細(xì)越好,只要能確保所填寫的路徑為唯一對應(yīng)就行浮创。在這個(gè)例子中忧吟,只輸入“div.pho_info > h4 > em”,通過ctrl+F查找斩披,已經(jīng)能確定只有唯一的一個(gè)查找目標(biāo)溜族,那在填寫路徑時(shí)胸嘴,只填寫“div.pho_info > h4 > em”也同樣能爬取到我們需要的信息。(PS:在復(fù)制出來的路徑中斩祭,有時(shí)候會包含類似div:nth-child(2)劣像、li:nth-child(1)的信息,這時(shí)候需要將div摧玫、li等之后的:nth-child(x)刪除耳奕。)
③通過方法獲取數(shù)據(jù)
通過抓取以上信息所獲得的數(shù)據(jù)往往很多是多于的部分,因此還需進(jìn)一步獲取我們想要的信息诬像。例如剛才抓取的標(biāo)題信息屋群,輸出的內(nèi)容為:[<em>白格美居?xùn)|三環(huán)地鐵國貿(mào)潘家園(長租特惠)</em>],但我們其實(shí)只需要【白格美居?xùn)|三環(huán)地鐵國貿(mào)潘家園(長租特惠)】這個(gè)內(nèi)容坏挠,因此還需把不要的內(nèi)容去掉芍躏。
通過調(diào)用BeautifuSoup的方法去獲得信息,例如此例中降狠,用到的方法是get_text()对竣。
在爬蟲中,常用到的方法有:
get_text():返回選擇的標(biāo)簽文本
get(''):選擇標(biāo)簽中的屬性 (也就是標(biāo)簽屬性中=符號的左邊)榜配,常用于獲取鏈接和圖片
接下來是課程中的作業(yè)否纬,爬取http://bj.xiaozhu.com/中的相關(guān)信息。
代碼如下:
總結(jié):
1.爬取一個(gè)網(wǎng)頁共分為兩步蛋褥,一是向服務(wù)器提出請求临燃,二是對網(wǎng)頁進(jìn)行解析爬取烙心;
2.爬取一個(gè)網(wǎng)頁需要經(jīng)歷大致3步膜廊,一是使用BeautifulSoup解析網(wǎng)頁,二是描述要爬取的信息位置淫茵,三是獲取所需數(shù)據(jù)爪瓜。