今天,我們來(lái)學(xué)習(xí)爬蟲。什么是爬蟲呢?
簡(jiǎn)單來(lái)講,爬蟲是指使用一定的手段自動(dòng)抓取網(wǎng)頁(yè)上的內(nèi)容。它是搜索引擎的核心技術(shù)之一。
爬蟲程序是我們用來(lái)自動(dòng)抓取網(wǎng)頁(yè)內(nèi)容的手段。這里我們將講解如何利用python來(lái)編寫爬蟲程序。
要想抓取網(wǎng)頁(yè)上的內(nèi)容,首先我們要認(rèn)識(shí)網(wǎng)頁(yè)的構(gòu)成。
認(rèn)識(shí)網(wǎng)頁(yè)的構(gòu)成
網(wǎng)頁(yè)通常由三部分構(gòu)成,一個(gè)網(wǎng)頁(yè)就等于一個(gè)HTML文檔:
1. HTML:結(jié)構(gòu)部分,區(qū)分每個(gè)部分具體是做什么用的,比如標(biāo)題、正文等,相當(dāng)于臥室、廚房等
2. CSS:<div class="">,樣式部分,每個(gè)部分長(zhǎng)啥樣,地板什么顏色,墻壁什么顏色
3. JavaScript:<script>:功能部分,房間里的電器。在爬蟲中利用較少

那么,爬取一個(gè)網(wǎng)頁(yè),要做什么?
第一步:獲取網(wǎng)頁(yè)的內(nèi)容
為了獲取網(wǎng)頁(yè)的內(nèi)容,我們就需要知道服務(wù)器與本地的交換機(jī)制。
我們?cè)跒g覽器輸入一個(gè)鏈接實(shí)際上是向網(wǎng)站所在的服務(wù)器發(fā)出一個(gè)請(qǐng)求(request),服務(wù)器在收到這個(gè)請(qǐng)求后就會(huì)把相應(yīng)的內(nèi)容返回(response)給我們。

請(qǐng)求的方法主要有兩種:get和post。我們?cè)邳c(diǎn)擊一個(gè)按鈕或鏈接時(shí)使用的是get,發(fā)微博則是一個(gè)post行為。我們使用一個(gè)爬蟲去抓取網(wǎng)頁(yè)內(nèi)容就是在模擬這些方法去獲取網(wǎng)頁(yè)內(nèi)容。
我們?cè)趓equest時(shí)不僅僅是發(fā)送了url的信息,實(shí)際上包括你使用的設(shè)備等信息也發(fā)送過(guò)去了。我們平時(shí)使用手機(jī)打開網(wǎng)頁(yè)時(shí),服務(wù)器因?yàn)橹牢覀兪褂玫脑O(shè)備而以適合手機(jī)的方式呈現(xiàn)頁(yè)面就是這個(gè)原理。
服務(wù)器以response的形式返回給我們信息。爬蟲就是要解析網(wǎng)頁(yè)返回給我們的response信息(html文件)。
import requests
url="http://www.tripadvisor.cn/Attractions-g294217-Activities-Hong_Kong.html"
wb_data=requests.get(url)
第二步:使用BeautifulSoup解析網(wǎng)頁(yè)
from bs4 import BeautifulSoup
soup=BeautifulSoup(wb_data.text,'lxml')
beautifulsoup有兩個(gè)參數(shù),前面是待解析的文件,后面是解析文件的庫(kù)(按照什么規(guī)則解析)。
第三步:描述元素在網(wǎng)頁(yè)中所處位置
CSS Selector:描述元素在網(wǎng)頁(yè)中所處位置,按照元素的位置和樣式去選取元素
titles=soup.select('div.property_title > a[target="_blank"]')
imgs=soup.select("img[width=160]")
cates=soup.select("div.p13n_reasoning_v2")

第四步:從標(biāo)簽中獲取想要的信息,并將信息裝進(jìn)數(shù)據(jù)容器中,方便查詢
for title, img, cate in zip(titles,imgs,cates):
? ? data={
? ? ? ? ? ? "title":title.get_text(),
? ? ? ? ? ? "img":img.get('src'),
? ? ? ? ? ? "cate":list(cate.stripped_strings)
? ? ?}
運(yùn)行結(jié)果:

深入學(xué)習(xí):
1. 如何爬取多個(gè)網(wǎng)頁(yè)?
2.需要登錄怎么辦?
3. 如何爬取移動(dòng)設(shè)備網(wǎng)頁(yè)內(nèi)容?
參考資料: