電話:15992422229 銷售一、13640293427 銷售二、13660366684 銷售三
郵箱:congseng@hotmail.com
地址:中國廣東省廣州市番禺區(qū)番禺大道北555號(hào)天安科技園總部中心14號(hào)樓二樓
技術(shù)支持:搜浪網(wǎng)絡(luò)
聲明:如果本站有使用不當(dāng)?shù)臉O限詞匯,并非本站之意愿,本站鄭重聲明所有極限詞匯全部作廢
一
掃
關(guān)
注
微
信
文章目錄
上圖已魔法反爬,哈哈哈,想爬就爬唄,不攔著。
認(rèn)識(shí)HTML源代碼
說到解析網(wǎng)頁,那么我們是不是要自己先認(rèn)識(shí)一下這些個(gè)網(wǎng)頁呢?
來看一下這個(gè)網(wǎng)頁:
解析網(wǎng)頁
來,我們就拿這個(gè)網(wǎng)頁來探究一下它的構(gòu)造,后面其他的網(wǎng)頁都是共通的。
首先可以看見在網(wǎng)站的右側(cè),輸入框有樣式。在網(wǎng)頁的左側(cè),也有一段有色彩的代碼,這是如何肥四呢?
這也稱標(biāo)記,或者叫搜索,或者叫映射,愛怎樣叫怎么叫,咱只應(yīng)該了解左右兩個(gè)有形狀的地方是一一對(duì)應(yīng)的。
那,要如何按照頁面元素去搜索它對(duì)應(yīng)的代碼塊兒呢,其實(shí)不難哈。
先點(diǎn)擊我圈起來的地方,再至網(wǎng)站上單擊對(duì)應(yīng)的元素就能。
我們?cè)侔涯抗饩劢乖谟覀?cè)的代碼上,可以看見這些的三角形。稍微思索一下,就明白這些三角形是上下級(jí)的關(guān)系吧。
這些三角形是可以伸縮的。我們把每個(gè)三角形以及它包括的所有內(nèi)容叫做:標(biāo)簽。
(當(dāng)然,有些沒有三角形的也叫標(biāo)簽,比方說)
怎么看標(biāo)簽?zāi)?,?"為標(biāo)簽的結(jié)尾。
這時(shí)候就會(huì)有同級(jí)標(biāo)簽跟上下級(jí)標(biāo)簽的區(qū)別了,我習(xí)慣把他們之間的關(guān)系稱謂為:父標(biāo)簽、子標(biāo)簽、兄弟標(biāo)簽或者祖標(biāo)簽。
這些概念在上面講Xpath標(biāo)簽提取的之后會(huì)很重要,都長點(diǎn)記性哈。
認(rèn)識(shí)Xpath
XPath 是一種將 XML 文檔的層次結(jié)構(gòu)表述為關(guān)系的方法。因?yàn)?HTML 是 由 XML 元素構(gòu)成的,因此我們可以使用 XPath 從 HTML 文檔中定位跟選擇元素。
要說從網(wǎng)站源碼中提取出數(shù)據(jù)來,那方法雖然不少的。比方說某些人動(dòng)不動(dòng)就上來一個(gè)正則表達(dá)式啊,本系列主干中不提正則表達(dá)式,最多作為“番外篇”加入。怎么簡單怎么來嘛。
也有些人會(huì)用beautifulsoup,我初學(xué)的之后也有學(xué)這個(gè)庫的,后來看到有很多的不便性,于是果斷放棄了。
其實(shí)也沒多少不便,就是學(xué)完Xpath之后如何看soup怎么不順眼。
來看一下它們仨兒的性能對(duì)比哈:
抓取方法性能使用難度安裝難度
正則
快
困難
內(nèi)置模塊
beautifulsoup
慢
簡單
簡單(純Python)
lxml
快
簡單
不難
可以看出beautiful為什么慢了吧。在pycharm下,沒有太多的安裝困難啦。
Xpath使用流程
看完Xpath的性能優(yōu)勢(shì)時(shí)候,我們來看一下Xpath是怎樣解析一個(gè)網(wǎng)頁,并獲得到我們所必須的數(shù)據(jù)的。
別急,我來解釋一下這張圖。
1、首先,導(dǎo)入Xpath支持的模塊,位于lxml包里面的etree模塊,如果用pycharm時(shí)出現(xiàn)“報(bào)錯(cuò)”,別管它,能運(yùn)行的,歷史遺留原因。
2、其次,獲取網(wǎng)頁源碼,這里需要使用content方法來對(duì)獲取到的網(wǎng)頁數(shù)據(jù)進(jìn)行轉(zhuǎn)換,不能使用text。
3、接著,對(duì)轉(zhuǎn)換出的數(shù)據(jù)進(jìn)行編解碼。不然會(huì)看到一堆的亂碼。
4、HTML方法,沒什么好說的。
5、xpath方法,這里需要傳入?yún)?shù)為待提取標(biāo)簽的Xpath路徑。關(guān)于這個(gè)路徑,一會(huì)兒會(huì)講。
6、批量提取,關(guān)于這個(gè)批量提取,一會(huì)兒也會(huì)講。
7、沒什么好說的了。
Xpath路徑提取
打開谷歌瀏覽器,在標(biāo)簽上面有源標(biāo)簽,進(jìn)行一次右擊,點(diǎn)擊那些“copy”,選擇上面的“Copy Xpath”,沒啥事兒的話就不要去“Copy Full Xpath”了。
這里我們統(tǒng)一使用谷歌瀏覽器。
這時(shí)候相對(duì)Xpath路徑我們就獲得了。
Xpath基本語法節(jié)選
Xpath的語法很多了,但是我們通常用不到那么多,沒必要死記硬背,我?guī)退麄兲粢恍┏S玫木秃谩?/p>
示例:
還有一個(gè)text()方法注意一下即可有源標(biāo)簽,沒必要弄那么多的花里胡哨的。
Xpath函數(shù)封裝
講到這里Xpath部分也差不多了,我們來封裝一下函數(shù),并做一個(gè)小demo。
如果是應(yīng)提取單個(gè)路徑下的標(biāo)簽,采用下面方式即可:
def get_data(html_data,Xpath_path): '''
這是一個(gè)從網(wǎng)頁源數(shù)據(jù)中抓取所需數(shù)據(jù)的函數(shù)
:param html_data:網(wǎng)頁源數(shù)據(jù) (單條數(shù)據(jù))
:param Xpath_path: Xpath尋址方法
:return: 存儲(chǔ)結(jié)果的列表
''' data = html_data.content
data = data.decode().replace("", "") #刪除數(shù)據(jù)中的注釋
tree = etree.HTML(data) #創(chuàng)建element對(duì)象 el_list = tree.xpath(Xpath_path) return el_list
如果是應(yīng)從多個(gè)Xpath中提取數(shù)據(jù),可以運(yùn)用下面方式:
def get_many_data(html_data,Xpath_path_list): '''
通過多個(gè)Xpath對(duì)數(shù)據(jù)進(jìn)行提取
:param html_data: 原始網(wǎng)頁數(shù)據(jù)
:param Xpath_paths: Xpath尋址列表
:return: 二維列表,一種尋址數(shù)據(jù)一個(gè)列表
'''
el_data = [] data = html_data.content
data = data.decode().replace("", "")
tree = etree.HTML(data) for Xpath_path in Xpath_path_list:
el_list = tree.xpath(Xpath_path)
el_data.append(el_list)
el_list = [] #安全起見就自己清理了吧 return el_data
至于要不要修修補(bǔ)補(bǔ),就看個(gè)人喜好啦。
Xpath實(shí)操爬取小demo
我們來做一個(gè)小demo,獲取
(圖片更換過,不知道為啥就圖片違規(guī))
這里的熱榜文本跟網(wǎng)址,并一一配對(duì)吧。
首先,我們審查以下網(wǎng)站:
學(xué)的快的人斷定兩個(gè)線索,有經(jīng)驗(yàn)的人看出三個(gè)線索:
看到網(wǎng)址和文本是必須的,不過我們應(yīng)一次性全部拿下,就必須查看其他的幾個(gè)標(biāo)簽所在位置,然后,找到我們所必須的所有標(biāo)簽的最小公共祖宗標(biāo)簽。
將標(biāo)簽疊上去,我們很容易的發(fā)覺他們都處在
已標(biāo)記關(guān)鍵詞清除標(biāo)記