「Python」爬蟲-2.xpath解析和cookie,session

語言: CN / TW / HK

theme: cyanosis highlight: atelier-lakeside-light


持續創作,加速成長!這是我參與「掘金日新計劃 · 10 月更文挑戰」的第15天, 點選檢視活動詳情

前言

本文主要介紹爬蟲知識中的xpath解析以及如何處理cookies,將配合兩個案例-影片爬取和b站彈幕爬取分別講解。

如果對爬蟲的整體思維(確定目標網址 -> 請求該網址 ->讀取response -> 處理response -> 寫入檔案/...)不大瞭解的話,可以先閱覽一下的我的上一篇文章~,bs4解析的方式在上一篇有講解。 「Python」爬蟲-1.入門知識簡介 - 掘金 (juejin.cn)

在上一篇爬蟲入門的知識中我們運用了bs4的方法對返回的頁面原始碼進行解析,從而拿到了我們想要的資訊。這裡再接著引出一種更為簡單(~~無腦~~的方法對頁面資訊進行提取---xpath

xpath

xpath是xml文件中搜尋內容一門語言,html是xml的一個子集。所以通過xpath就可以搜尋(/提取)html中有價值的資訊。

什麼是XML?
可擴充套件標記語言,標準通用標記語言的子集,簡稱XML,是一種用於標記電子檔案使其具有結構性的標記語言。——摘自百度百科。

XML是用來傳輸和儲存資料的,不是用來顯示資料的,所以XML文件不包含格式或者佈局資訊,沒有HTML佈局明確。更為詳細的解說請參考 - 認識XML文件(一)什麼是XML文件? - 知乎 (zhihu.com)

使用xpath方法前需要安裝lxml模組

安裝命令如下:

pip install lxml

xpath中最常見的方式就是 text() 拿文字,下面將為你慢慢道來xpath的使用方法~

首先在使用xpath之前需要引包,該語句是 from lxml import etree

這裡以豬八戒網為例,https://beijing.zbj.com/search/f/

可以自己輸入關鍵詞,比如:前端開發,然後就可以看到一個一個的div盒子了,直接大膽猜測每一個商品的佈局都類似。(~~畢竟沒有開發人員會無聊到把結構類似的東西搞的花裡胡哨吧?)~~ image.png

接下來使用開啟開發者工具,F12鍵,這裡以爬取商店的名字為例,使用xpath方法解析。可以利用下面這個小三角定位到商鋪名字上去。

image.png 然後發現名字在一個<div class="shop-info">的盒子裡。整個商鋪資訊和單個商鋪資訊的結構如下: ```

...

```

image.png

然後將滑鼠放到最外面的大盒子中,即<div class="search-result-list-service">上去,然後右鍵->複製->複製xpath。(如果是Google Chrome也是一樣的額,只不過是英文罷了)

image.png

xpath使用前需要例項化一個HTML物件,即etree.HTML(resp.text)

```

解析

html = etree.HTML(resp.text) divs = html.xpath("//*[@id="__layout"]/div/div[3]/div/div[3]/div[4]/div[1]") ```

此時divs裡面就會包含多個子<div>了,再利用個for迴圈,遍歷每一個相同的div,./div[1]/div/a/div[2]/div[1]/div/text(),就可以拿到整個頁面的商鋪名字了。

下面以輸入sass為例,挺久之前寫的程式碼了,思想類似,可以直接照搬過來用。

```python import requests from lxml import etree

url = "https://beijing.zbj.com/search/f/?kw=sass" resp = requests.get(url)

解析

html = etree.HTML(resp.text) divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[5]/div/div")

for div in divs: # 每一個服務商資訊 price = div.xpath("./div/div/a[2]/div[2]/div[1]/span[1]/text()")[0].strip("¥") title = "sass".join(div.xpath("./div/div/a[2]/div[2]/div[2]/p/text()")) com_name = div.xpath("./div/div/a[1]/div[1]/p/text()") # [0]給放到列表裡 print(com_name)

```

關於xpath的相關語法,這裡只羅列一部分。

這個地方的其實要熟悉還是得多練小案例的,可以嘗試著不直接複製網頁中的程式碼,而是自己寫出來提取的程式碼。

```basic // 表示的是後代 [] 謂語、條件 / 往下選擇元素 @ 提取元素 * 任意的節點 ./ 當前結點

xpath的順序是從1開始的

res = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()") # [@xxx=xxx] # 屬性篩選

拿到屬性值 :@屬性

```

session與cookie

在爬取一些頁面的時候往往需要使用者先登入,然後才能看到其網站裡面的資訊。而瀏覽器中有個一個東西可以表示你的登入狀態,這個玩意就是cookie了。

關於cookie的詳解,可以自行查資料瞭解一下~

在這裡只需要知道這個東西可以表示你的登入狀態就行,記錄了cookie就不用頻繁的多次登入了。

cookie的查詢,可以先F12鍵,然後重新整理一下網頁,開啟工具欄中的網路,隨便點選一個請求進去,點選標頭(headers),就可以看到cookie了。

image.png

如果是獲取某個小說網站的書架資訊,往往需要在headers裡面加入cookie資訊。

在看到書架資訊之前需要先登入該網站,這裡扯到到session(會話),就當做是一個使用者向伺服器傳送請求,然後伺服器返回資訊的整個過程吧。

向某一個登入網站的api傳送資料,需要用到session=requests.session(),然後 session.post(url, data=data),就可以實現登入的功能了。

這裡用到的api是https://passport.17k.com/login/

下面登入並獲取書架返回的html程式碼如下: ```python import requests

會話

session = requests.session() data = { "loginName": "xxxxxxxx", "password": "xxxxxxxxx" }

登入

url = "https://passport.17k.com/login/" sp = session.post(url, data=data)

resp = session.get('https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919') print(resp.json()) ``` cookie一般包裝在headers裡面,隨請求一起傳送給伺服器,模板如下:

resp = request.get("https://user.17k.com/ck/author/shelf?page=1&appKey=2406394919",headers={ "Cookie":"abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" })

本次的爬蟲知識就寫到這兒了,後續繼續更新多執行緒以及selenium的知識吖~,如果對你有用的話,就點個贊吧~😋

往期好文推薦🪶

「Python」爬蟲-1.入門知識簡介 - 掘金 (juejin.cn)

「MongoDB」Win10版安裝教程

「Python」數字推盤遊戲

「Python」sklearn第一彈-標準化和非線性轉化

「Python」turtle繪製圖形🎈

「Python」Pandas-DataFrame的相關操作二