溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

利用lxml庫怎么實現(xiàn)一個Python爬蟲

發(fā)布時間:2020-12-21 14:43:45 來源:億速云 閱讀:179 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)利用lxml庫怎么實現(xiàn)一個Python爬蟲,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

1.爬蟲是什么

所謂爬蟲,就是按照一定的規(guī)則,自動的從網(wǎng)絡(luò)中抓取信息的程序或者腳本。萬維網(wǎng)就像一個巨大的蜘蛛網(wǎng),我們的爬蟲就是上面的一個蜘蛛,不斷的去抓取我們需要的信息。

2.爬蟲三要素

  • 抓取

  • 分析

  • 存儲

3.爬蟲的過程分析

當(dāng)人類去訪問一個網(wǎng)頁時,是如何進行的?

 ?、俅蜷_瀏覽器,輸入要訪問的網(wǎng)址,發(fā)起請求。

 ?、诘却?a title="服務(wù)器" target="_blank" href="http://www.kemok4.com/">服務(wù)器返回數(shù)據(jù),通過瀏覽器加載網(wǎng)頁。

  ③從網(wǎng)頁中找到自己需要的數(shù)據(jù)(文本、圖片、文件等等)。

  ④保存自己需要的數(shù)據(jù)。

對于爬蟲,也是類似的。它模仿人類請求網(wǎng)頁的過程,但是又稍有不同。

  首先,對應(yīng)于上面的①和②步驟,我們要利用python實現(xiàn)請求一個網(wǎng)頁的功能。

  其次,對應(yīng)于上面的③步驟,我們要利用python實現(xiàn)解析請求到的網(wǎng)頁的功能。

  最后,對于上面的④步驟,我們要利用python實現(xiàn)保存數(shù)據(jù)的功能。

  因為是講一個簡單的爬蟲嘛,所以一些其他的復(fù)雜操作這里就不說了。下面,針對上面幾個功能,逐一進行分析。

4.如何用python請求一個網(wǎng)頁

作為一門擁有豐富類庫的編程語言,利用python請求網(wǎng)頁完全不在話下。這里推薦一個非常好用的類庫urllib.request。

4.1.抓取網(wǎng)頁

urllib庫使用

import urllib.request
 
response = urllib.request.urlopen('https://laoniu.blog.csdn.net/')
print(response.read().decode('utf-8'))

這樣就可以抓取csdn我的主頁的html文檔

我們使用爬蟲就是需要在網(wǎng)頁中提取我們需要的數(shù)據(jù),接下來我們來學(xué)習(xí)抓取一下百度搜索頁的熱榜數(shù)據(jù)

利用lxml庫怎么實現(xiàn)一個Python爬蟲

4.2.如何解析網(wǎng)頁呢

使用lxml庫

lxml 是一種使用 Python 編寫的庫,可以迅速、靈活地處理 XML 和 HTML。

它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且實現(xiàn)了常見的 ElementTree API。

安裝

windows下安裝

#pip方式安裝
pip3 install lxml
 
#wheel方式安裝 
#下載對應(yīng)系統(tǒng)版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl

linux下安裝

yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
 
pip3 install lxml

環(huán)境/版本一覽:

  • 開發(fā)工具:PyCharm 2020.2.3

  • python:3.8.5

4.3.編寫代碼

import urllib.request
from lxml import etree
 
# 獲取百度熱榜
url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
# 我們在請求頭加入User-Agent參數(shù),這樣可以讓服務(wù)端認(rèn)為此次請求是用戶通過瀏覽器發(fā)起的正常請求,防止被識別為爬蟲程序請求導(dǎo)致直接拒絕訪問
req = urllib.request.Request(url=url, headers={
 'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
})
# 發(fā)起請求
html_resp = urllib.request.urlopen(req).read().decode("utf-8")

到這里我們可以順利獲取百度的搜索頁面html文檔

我門需要看一下熱搜排行榜的標(biāo)簽元素在哪里

利用lxml庫怎么實現(xiàn)一個Python爬蟲

利用lxml庫怎么實現(xiàn)一個Python爬蟲

找到第一條  右鍵復(fù)制 XPath   (后邊說XPath是什么)

利用lxml庫怎么實現(xiàn)一個Python爬蟲

我們需要了解并使用XPath,XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。

復(fù)制的內(nèi)容結(jié)果是: //*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1]

這xPath字符串 表示現(xiàn)在在html定位的位置就是熱點新聞第一行內(nèi)容

5.XPath常用規(guī)則

表達式描述
nodename選取此節(jié)點的所有子節(jié)點
/從當(dāng)前節(jié)點選取直接子節(jié)點
//從當(dāng)前節(jié)點選取子孫節(jié)點
.選取當(dāng)前節(jié)點
..選取當(dāng)前節(jié)點的父節(jié)點
@選取屬性
*通配符,選擇所有元素節(jié)點與元素名
@*選取所有屬性
[@attrib]選取具有給定屬性的所有元素
[@attrib='value']選取給定屬性具有給定值的所有元素
[tag]選取所有具有指定元素的直接子節(jié)點
[tag='text']選取所有具有指定元素并且文本內(nèi)容是text節(jié)點


 

6.繼續(xù)分析

那么我們要獲取所有的熱點新聞該怎么寫呢

繼續(xù)看網(wǎng)頁

利用lxml庫怎么實現(xiàn)一個Python爬蟲

可以看到所有的熱榜分別在三個<tbody>之下

修改一下剛才復(fù)制的XPath

//*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1] 改為  //*[@id="con-ar"]/div[2]/div/div/table/tbody/tr

這樣XPath就會定位到這三個tbody下的所有tr元素內(nèi)容

我們繼續(xù)看一下tr是不是我們想要的內(nèi)容,展開一個tr看看

利用lxml庫怎么實現(xiàn)一個Python爬蟲

淦~還有一堆,,

這該怎么辦。我們需要拿到數(shù)據(jù)是 【標(biāo)題】 【訪問鏈接】 【熱度】,現(xiàn)在手里已經(jīng)拿到的是所有的tr元素

緊接著從tr下手 直接 拿到下面所有<a>標(biāo)簽的標(biāo)題與超鏈接

標(biāo)題的XPath: */a/@title 超鏈接的XPath: */a/@href

*表示匹配tr下的所有元素  /a是在*找到第一個a標(biāo)簽  @是屬性選擇器 title和href就是要選擇的素屬性了

還剩下個熱度,let‘s me 繼續(xù)操作,直接選擇tr下的第二個td  XPath: td[2]

分析完畢,把完整的代碼貼出來

import urllib.request
from lxml import etree
 
# 獲取百度熱榜
 
url = "https://www.baidu.com/s?ie=UTF-8&wd=1"
# 我們在請求頭加入User-Agent參數(shù),這樣可以讓服務(wù)端認(rèn)為此次請求是用戶通過瀏覽器發(fā)起的正常請求,防止被識別為爬蟲程序請求導(dǎo)致直接拒絕訪問
req = urllib.request.Request(url=url, headers={
  'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
 })
html_resp = urllib.request.urlopen(req).read().decode("utf-8")
html = etree.HTML(html_resp)#初始化生成一個XPath解析對象
_list = html.xpath("//*[@id='con-ar']/div[2]/div/div/table/tbody/tr")
print(f"article count : {len(_list)}")
 
for tr in _list:
 title = tr.xpath("*/a/@title")[0]
 href = tr.xpath("*/a/@href")[0]
 hot = tr.xpath("string(td[2])").strip()
 print(f"{hot}\t{title}\thttps://www.baidu.com{href}")

看完上述內(nèi)容,你們對利用lxml庫怎么實現(xiàn)一個Python爬蟲有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI