Python爬蟲入門之初遇lxml庫
1.爬蟲是什么
所謂爬蟲,就是按照一定的規則,自動的從網路中抓取資訊的程式或者腳本,萬維網就像一個巨大的蜘蛛網,我們的爬蟲就是上面的一個蜘蛛,不斷的去抓取我們需要的資訊,
2.爬蟲三要素
- 抓取
- 分析
- 存盤
3.爬蟲的程序分析
當人類去訪問一個網頁時,是如何進行的?
①打開瀏覽器,輸入要訪問的網址,發起請求,
②等待服務器回傳資料,通過瀏覽器加載網頁,
③從網頁中找到自己需要的資料(文本、圖片、檔案等等),
④保存自己需要的資料,
對于爬蟲,也是類似的,它模仿人類請求網頁的程序,但是又稍有不同,
首先,對應于上面的①和②步驟,我們要利用python實作請求一個網頁的功能,
其次,對應于上面的③步驟,我們要利用python實作決議請求到的網頁的功能,
最后,對于上面的④步驟,我們要利用python實作保存資料的功能,
因為是講一個簡單的爬蟲嘛,所以一些其他的復雜操作這里就不說了,下面,針對上面幾個功能,逐一進行分析,
4.如何用python請求一個網頁
作為一門擁有豐富類別庫的編程語言,利用python請求網頁完全不在話下,這里推薦一個非常好用的類別庫urllib.request,
4.1.抓取網頁
- urllib庫使用
import urllib.request
response = urllib.request.urlopen('https://laoniu.blog.csdn.net/')
print(response.read().decode('utf-8'))
這樣就可以抓取csdn我的主頁的html檔案
我們使用爬蟲就是需要在網頁中提取我們需要的資料,接下來我們來學習抓取一下百度搜索頁的熱榜資料

4.2.如何決議網頁呢
使用lxml庫
lxml 是一種使用 Python 撰寫的庫,可以迅速、靈活地處理 XML 和 HTML,
它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且實作了常見的 ElementTree API,
安裝
- windows下安裝
#pip方式安裝
pip3 install lxml
#wheel方式安裝
#下載對應系統版本的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
環境/版本一覽:
- 開發工具: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引數,這樣可以讓服務端認為此次請求是用戶通過瀏覽器發起的正常請求,防止被識別為爬蟲程式請求導致直接拒絕訪問
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檔案
我門需要看一下熱搜排行榜的標簽元素在哪里


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

我們需要了解并使用XPath,XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML檔案中某部分位置的語言,
復制的內容結果是://*[@id="con-ar"]/div[2]/div/div/table/tbody[1]/tr[1]
這xPath字串 表示現在在html定位的位置就是熱點新聞第一行內容
5.XPath常用規則
| 運算式 | 描述 |
| nodename | 選取此節點的所有子節點 |
| / | 從當前節點選取直接子節點 |
| // | 從當前節點選取子孫節點 |
| . | 選取當前節點 |
| .. | 選取當前節點的父節點 |
| @ | 選取屬性 |
| * | 通配符,選擇所有元素節點與元素名 |
| @* | 選取所有屬性 |
| [@attrib] | 選取具有給定屬性的所有元素 |
| [@attrib='value'] | 選取給定屬性具有給定值的所有元素 |
| [tag] | 選取所有具有指定元素的直接子節點 |
| [tag='text'] | 選取所有具有指定元素并且文本內容是text節點 |
6.繼續分析
那么我們要獲取所有的熱點新聞該怎么寫呢
繼續看網頁

可以看到所有的熱榜分別在三個<tbody>之下
修改一下剛才復制的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元素內容
我們繼續看一下tr是不是我們想要的內容,展開一個tr看看

淦~還有一堆,百度你不講武德,,

這該怎么辦,我們需要拿到資料是 【標題】 【訪問鏈接】 【熱度】,現在手里已經拿到的是所有的tr元素
緊接著從tr下手 直接 拿到下面所有<a>標簽的標題與超鏈接
標題的XPath: */a/@title 超鏈接的XPath: */a/@href
*表示匹配tr下的所有元素 /a是在*找到第一個a標簽 @是屬性選擇器 title和href就是要選擇的素屬性了
還剩下個熱度,let‘s me 繼續操作,直接選擇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引數,這樣可以讓服務端認為此次請求是用戶通過瀏覽器發起的正常請求,防止被識別為爬蟲程式請求導致直接拒絕訪問
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}")
點擊運行,程式啪就跑起來了,很快啊,資料全都過來了,我全都接住了,我笑了一下,希望百度耗子為之

到此就完成了lxml xpath的基本使用,更詳細的xpath教程請看 :https://www.w3school.com.cn/xpath/index.asp
爬蟲三要素,抓取資料完成了,剩余的分析與存盤就先不說了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/237654.html
標籤:python
