爬取一個網(wǎng)頁共分為兩步:
一是向服務(wù)器提出請求
當(dāng)我們在上網(wǎng)時,每點擊一個新的網(wǎng)頁,其實都是在向服務(wù)器發(fā)送一個請求(Request),服務(wù)器在接到我們的請求之后,會返回一個回信(Response)。在提出請求(Request)的方法中,一共有g(shù)et、post、head、put、options、connect、trace、delete等8種方法,其中最常用的方法是get,用get方法幾乎能爬取90%的網(wǎng)頁。
編寫代碼時,需加載第三方庫requests,代碼寫為import requests。
二是爬取網(wǎng)頁
通過爬蟲獲取數(shù)據(jù)一共分為3步:
①使用BeautifulSoup解析網(wǎng)頁
代碼寫為:soup = BeautifulSoup(html,'lxml'),對這句代碼可以這樣理解:
Beautiful Soup是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫,它能夠通過你喜歡的轉(zhuǎn)換器實現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式。
lxml也是Python庫,將它放入 Beautiful Soup中,作為一種轉(zhuǎn)化工具,去對輸入的網(wǎng)頁進行解析。
課程中,侯爵老師的類比非常生動,如果說soup是我們準備做的一碗湯,那html就是所需的食材,而lxml就是做這碗湯所需的食譜。
②描述要爬取的信息位置
定位要爬取的信息位置代碼為:XXX = soup.select('需爬取信息的位置'),XXX為爬取信息的名稱,select顧名思義,就是去選擇并找到解析出的信息。
以即將爬取的網(wǎng)頁http://bj.xiaozhu.com為例,打開網(wǎng)頁,右鍵點擊檢查,在彈出的窗口中,右鍵點擊需爬取的內(nèi)容代碼,在彈出的窗口內(nèi)注意copy中的兩個選項,一個是Copy selector,另一個是Copy XPath。兩者都是選擇復(fù)制網(wǎng)頁的位置路徑,但略有不同。將兩者復(fù)制進行比較:
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)潘家園(長租特惠)”這個標題,他的第一父級路徑就寫為div.wrap clearfix con_bg,子級路徑寫為:div.con_1,子孫級路徑寫為:div.pho_info,最后找到子孫節(jié)點下的h4標簽下的em標簽,獲取標簽中的信息。最終用【>】將父級、子級、子孫級等全部連接起來,最終路徑寫為:div.wrap.clearfix.con_bg > div.con_l > div.pho_info > h4 > em。(PS:注意在【>】前后都必須有一個空格。)

將路徑寫下來是為了幫助準確定位需要的信息,但路徑并不是越詳細越好,只要能確保所填寫的路徑為唯一對應(yīng)就行。在這個例子中,只輸入“div.pho_info > h4 > em”,通過ctrl+F查找,已經(jīng)能確定只有唯一的一個查找目標,那在填寫路徑時,只填寫“div.pho_info > h4 > em”也同樣能爬取到我們需要的信息。(PS:在復(fù)制出來的路徑中,有時候會包含類似div:nth-child(2)、li:nth-child(1)的信息,這時候需要將div、li等之后的:nth-child(x)刪除。)

③通過方法獲取數(shù)據(jù)
通過抓取以上信息所獲得的數(shù)據(jù)往往很多是多于的部分,因此還需進一步獲取我們想要的信息。例如剛才抓取的標題信息,輸出的內(nèi)容為:[<em>白格美居?xùn)|三環(huán)地鐵國貿(mào)潘家園(長租特惠)</em>],但我們其實只需要【白格美居?xùn)|三環(huán)地鐵國貿(mào)潘家園(長租特惠)】這個內(nèi)容,因此還需把不要的內(nèi)容去掉。

通過調(diào)用BeautifuSoup的方法去獲得信息,例如此例中,用到的方法是get_text()。

在爬蟲中,常用到的方法有:
get_text():返回選擇的標簽文本
get(''):選擇標簽中的屬性 (也就是標簽屬性中=符號的左邊),常用于獲取鏈接和圖片
接下來是課程中的作業(yè),爬取http://bj.xiaozhu.com/中的相關(guān)信息。
代碼如下:

總結(jié):
1.爬取一個網(wǎng)頁共分為兩步,一是向服務(wù)器提出請求,二是對網(wǎng)頁進行解析爬?。?/p>
2.爬取一個網(wǎng)頁需要經(jīng)歷大致3步,一是使用BeautifulSoup解析網(wǎng)頁,二是描述要爬取的信息位置,三是獲取所需數(shù)據(jù)。