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
爬蟲三要素,抓取數據完成瞭,剩餘的分析與存儲就先不說瞭
總結
到此這篇關於Python爬蟲新手入門之初學lxml庫的文章就介紹到這瞭,更多相關Python爬蟲入門之lxml庫內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python urllib.request模塊的使用詳解
- Python數據提取-lxml模塊
- Python xpath,JsonPath,bs4的基本使用
- Python爬蟲之urllib庫詳解
- Python BautifulSoup 節點信息