天天看點

爬蟲庫(Requests-HTML)Requests-HTML簡述Requests-HTML安裝請求方式資料清洗

爬蟲庫(Requests-HTML

  • Requests-HTML簡述
  • Requests-HTML安裝
  • 請求方式
  • 資料清洗

Requests-HTML簡述

Requests-HTML是在Requests的基礎上進一步封裝,兩者都是由同一個開發者開發。Requests-HTML除了包含Requests的所有功能之外,還新增了資料清洗和Ajax資料動态渲染。

資料清洗是由lxml和PyQuery子產品實作,這兩個子產品分别支援XPath Selectors和CSS Selectors定位,通過XPath或CSS定位,可以精準地提取網頁裡的資料。

Ajax資料動态渲染是将網頁的動态資料加載到網頁上再抓取。網頁資料可以使用Ajax向伺服器發送HTTP請求,再由JavaScript完成資料渲染,如果直接向網頁的URL位址發送HTTP請求,并且網頁的部分資料是來自Ajax,那麼,得到的網頁資訊就會有所缺失。而Requests-HTML可以将Ajax動态資料加載到網頁資訊,無需爬蟲開發者分析Ajax的請求資訊。

Requests-HTML安裝

windows系統下,cmd指令行:pip install requests-html

溫馨提示:僅支援python3.6以上版本

驗收是否安裝成功:

爬蟲庫(Requests-HTML)Requests-HTML簡述Requests-HTML安裝請求方式資料清洗

請求方式

Requests-HTML向網站發送請求的方法是來自Requests子產品,但是Requests-HTML隻能使用Requests的Session模式,該模式是将請求會話實作持久化,使這個請求保持連接配接狀态。Session模式好比我們在打電話的時候,隻要雙方沒有挂斷電話,就會一直保持一種會話(連接配接)狀态。Session模式對HTTP的GET和POST請求也是由get()和post()方法實作,具體的使用方法如下:

from requests_html import HTMLSession

# 定義會話Session
session = HTMLSession()
url = 'https://movie.douban.com/'
# 發送GET請求
r = session.get(url)
# 發送POST請求
r = session.post(url, data={})
# 輸出網頁的url位址
print(r.html)
           

執行結果:

爬蟲庫(Requests-HTML)Requests-HTML簡述Requests-HTML安裝請求方式資料清洗

上述代碼分别對同一個URL使用get()和post()方法,由于get()和post()方法都來自Requests子產品,是以還可以對這兩個方法設定相關的參數,如請求參數、請求頭、Cookies、代理IP以及證書驗證等。

Requests-HTML在請求過程中還做了優化處理,如果沒有設定請求頭,Requests-HTML就會預設使用源碼裡所定義的請求頭以及編碼格式。在Python的安裝目錄下打開Requests-HTML的源碼檔案(\Lib\site-packages\requests_html.py),定義了屬性DEFAULT_ENCODING和DEFAULT_USER_AGENT,分别對應編碼格式和HTTP的請求頭

資料清洗

Requests-HTML不僅優化了請求過程,還提供了資料清洗的功能,而Requests子產品隻提供請求方法,并不提供資料清洗,這也展現了Requests-HTML的一大優點。使用Requests開發的爬蟲,資料清洗需要調用其他子產品實作,而Requests-HTML則将兩者結合在一起。Requests-HTML提供了各種各樣的資料清洗方法,比如網頁裡的URL位址、HTML源碼内容、文本資訊等,使用方法如下所示:

from requests_html import HTMLSession

# 定義會話Session
session = HTMLSession()
url = 'https://movie.douban.com/'
# 發送GET請求
r = session.get(url)
# 輸出網頁的url位址
print(r.html)

# 輸出網頁裡全部的url位址
print(r.html.links)

# 輸出網頁裡精準的url位址
print(r.html.absolute_links)

# 輸出網頁的HTML資訊
print(r.text)

# 輸出網頁的文本資訊,即去除HTML代碼
print(r.html.text)



           

上述代碼隻是提取了網站的基本資訊,如果想要精準地提取某個資料,可以使用find()、xpath()、search()和search_all()方法實作。首先了解這4種方法的定義及相關的參數說明:

爬蟲庫(Requests-HTML)Requests-HTML簡述Requests-HTML安裝請求方式資料清洗

執行個體:

以豆瓣

爬蟲庫(Requests-HTML)Requests-HTML簡述Requests-HTML安裝請求方式資料清洗

電影名在标簽〈li class=“title”〉裡,評分在标簽〈li class=“rating”〉裡,是以上述4種定位方法的使用如下所示:

from requests_html import HTMLSession

# 定義會話Session
session = HTMLSession()

url = "https://movie.douban.com/"
# 發送GET請求
r = session.get(url)

# 通過CSS Selector定義li元素,".title"代表class屬性
# first=True代表擷取第一個元素
print(r.html.find('li.title', first=True).text)
# 輸出目前标簽的屬性值
print(r.html.find('li.title', first=True).attrs)

print("________分割線________")
# 查找特定文本元素
# 如果元素所在的HTML裡含有containing的屬性值即可提取
for name in r.html.find('li.title', containing="多力特的奇幻"):
    # 輸出電影名
    print(name.text)
print("________分割線________")

# 查找全部電影名
for name in r.html.find("li.title"):
    # 輸出電影名
    print(name.text)
    # 輸出電影名所在标簽的屬性值
    print(name.attrs)
print("________分割線________")

# 通過Xpath Selector定位ul标簽
x = r.html.xpath('//*[@id="screening"]/div[2]/ul/li[6]/ul')
for name in x:
    print(name.text)
print("________分割線________")
# search()通過關鍵字查找内容
# 一個{}代表一個内容,内容可為中文或英文等
print(r.html.search("多力特的奇幻..."))
print("________分割線________")
# search_all()通過關鍵字查詢整個網頁符合的内容
print(r.html.search_all("大話西遊{}{}"))