iT邦幫忙

2021 iThome 鐵人賽

DAY 8
1

前情提要

前一篇文章帶大家看了Requests 庫的使用,使用它發送了 GET POST 的請求,並且能自訂 headers 及 cookies 等參數。

開始之前

Requests 庫本身不具有資料清洗的功能,需要其他工具來輔助清理,今天要介紹的 Requests-HTML 庫和 Requests 同一個作者,是由 Requests 再封裝的,因此它具有 Requests 的功能,並且支援資料清洗的功能。

Requests-HTML

Requests-HTML 與 Reqests 庫最大的不同是,Requests-HTML 在發送請求前須先宣告 HTMLSession,之後在對這個回傳的物件進行 get post 等操作。

這個 Session 就如同打電話,只要雙方都不掛斷,或出現其他突發因素,通話就會一直持續。

執行以下指令便可下載 Requests-HTML。

pipenv install requests-html

使用方法與 Requests 庫類似,不過要先宣告 HTMLSession。

相同地,其中 session.get session.post也可傳入參數,Requests Headers、Proxy IP 使用、憑證驗證、Timeout、Cookies 傳入... ,詳細使用方法能參考 【Day 07】- 聽說 F12 可以拿來駭入小恐龍? (網頁開發工具分析流量)。

from requests_html import HTMLSession
#宣告 Session
session = HTMLSession()
r = session.get('https://ithelp.ithome.com.tw/users/20134430/ironman/4307')
print(type(r.html))

r = session.post('https://ithelp.ithome.com.tw/users/20134430/ironman/4307', data={})
print(type(r.html))

資料清洗

Requests-HTML 把資料清洗的用法也包入了,下面舉出大略性的清洗用法。

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://ithelp.ithome.com.tw/users/20134430/ironman/4307')
# 輸出網頁的網址
print(r.html.url)
# 輸出網頁內容內的所有網址
print(r.html.links)
# 輸出網頁內容(HTML)
print(r.text)
# 輸出網頁文字內容(除去 HTML)
print(r.html.text)

到目前為止,仍然無法對需求元素進行定位。

Request-HTML 中可以使用 find() xpath() search() search_all() 進行資料的定位,下面進行分開介紹。

find

語法: find(selector, containing, clean, first, _encoding)

  • selector : CSS 選擇器
  • containing : 傳入字串,使定位到的元素包含該字串,預設為 None。
  • clean : 是否清除並忽略 HTML 中 標籤,預設為 False
  • first : 使否只尋找到第一個定位到的元素,預設為 False
  • _encoding : 編碼格式,預設為 None
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://ithelp.ithome.com.tw/users/20134430/ironman/4307')

ele = r.html.find(
    'body > div.container.index-top > div > div > div.board.leftside.profile-main > div.ir-profile-content')

print(ele[0].text)
'''
2021 iThome 鐵人賽
回列表
AI & Data
網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應
對反爬蟲技術 系列
你身為學生常在網路上或同學說網路爬蟲現在很流行,
想知道這到底是甚麼?學習了 requests + beautifulsoup 爬蟲,想了解更多網路爬蟲技巧但缺乏實戰?或是辛
辛苦苦寫了一隻網路爬蟲,但被網頁的反爬蟲技術擋下
?
30 天簡述多種類型網路爬蟲與原理,並佐以基礎知識 
及實戰演練。常見反爬蟲技術及可行應對方案。      
展開 收起
參賽天數 6 天 | 共 6 篇文章 | 5 人訂閱 訂閱系 
列文 RSS系列文 |團隊肝已經,死了
0 Like 0 留言 104 瀏覽
DAY 1
【Day 01】- 前言: 從 0 開始的網路爬蟲
前言 近年人工智慧與大數據十分熱門,其背後需要許 
多有效的資料,先不論 Data Tagging 的部分,網路爬
蟲是個爬取有效資料的好方法,甚至大家常用的 goo...
2021-09-16 ‧ 由 Vincent55 分享
1 Like 0 留言 83 瀏覽
DAY 2
【Day 02】- 網路爬蟲環境設定(Python、pipenv、Vscode)
簡介 各位好,在進入基本 Python 語法與本次鐵人賽 
主題爬蟲之前。第二天的內容將會帶著各位一步一步將
爬蟲的環境設定好,本文將以 Window10 的環境為主...
2021-09-17 ‧ 由 Vincent55 分享
0 Like 0 留言 48 瀏覽
DAY 3
【Day 03】- Python 基礎操作與常見資料型態(整數、
浮點數、布林值、字串、串列、元組、字典)
前情提要 在前一篇文章內容中帶大家建立了 pipenv  
虛擬環境,並在虛擬環境中裝了套件。又安裝了 Vscode ,並透過設定 venv 路徑讓 Vscode...
2021-09-18 ‧ 由 Vincent55 分享
0 Like 0 留言 49 瀏覽
DAY 4
【Day 04】- Python 條件判斷與迴圈
前情提要 在前一篇文章內容中帶大家跑過一次 Python 中的基礎操作與常見的資料型態的使用。也提供了大 
家一些額外的使用方法,若有自信的讀者能再去 Day3 
看...
2021-09-19 ‧ 由 Vincent55 分享
0 Like 0 留言 37 瀏覽
DAY 5
【Day 05】- Python 字串操作(正規表達式 regexes  
前情提要 前一篇文章帶大家看了 Python 中的條件判 
斷以及迴圈等語法,大家要先把這些基本語法用熟,之
後的幾天會比較順利歐。 開始之前 Day 2 有帶給大家
2021-09-20 ‧ 由 Vincent55 分享
0 Like 0 留言 43 瀏覽
DAY 6
【Day 06】- 聽說 F12 可以拿來駭入小恐龍? (網頁開
發工具分析流量)
前情提要 前一篇文章帶大家看了 Python 中字串的原 
生操作以及正規表達式的操作,這兩個對於爬蟲的資料
清洗是很方便的工具,大家熟悉運用後對於各種字串處
理會更得...
2021-09-21 ‧ 由 Vincent55 分享
'''

xpath

語法: xpath(selector, clean, first, _encoding)

  • selector : XPath 選擇器
  • clean : 是否清除並忽略 HTML 中 標籤,預設為 False
  • first : 使否只尋找到第一個定位到的元素,預設為 False
  • _encoding : 編碼格式,預設為 None
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://ithelp.ithome.com.tw/users/20134430/ironman/4307')

ele = r.html.xpath(
    '/html/body/div[2]/div/div/div[2]/div[1]')

print(ele[0].text)
'''
2021 iThome 鐵人賽
回列表
AI & Data
網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應
對反爬蟲技術 系列
你身為學生常在網路上或同學說網路爬蟲現在很流行,
想知道這到底是甚麼?學習了 requests + beautifulsoup 爬蟲,想了解更多網路爬蟲技巧但缺乏實戰?或是辛
辛苦苦寫了一隻網路爬蟲,但被網頁的反爬蟲技術擋下
?
30 天簡述多種類型網路爬蟲與原理,並佐以基礎知識 
及實戰演練。常見反爬蟲技術及可行應對方案。      
展開 收起
參賽天數 6 天 | 共 6 篇文章 | 5 人訂閱 訂閱系 
列文 RSS系列文 |團隊肝已經,死了
0 Like 0 留言 104 瀏覽
DAY 1
【Day 01】- 前言: 從 0 開始的網路爬蟲
前言 近年人工智慧與大數據十分熱門,其背後需要許 
多有效的資料,先不論 Data Tagging 的部分,網路爬
蟲是個爬取有效資料的好方法,甚至大家常用的 goo...
2021-09-16 ‧ 由 Vincent55 分享
1 Like 0 留言 83 瀏覽
DAY 2
【Day 02】- 網路爬蟲環境設定(Python、pipenv、Vscode)
簡介 各位好,在進入基本 Python 語法與本次鐵人賽 
主題爬蟲之前。第二天的內容將會帶著各位一步一步將
爬蟲的環境設定好,本文將以 Window10 的環境為主...
2021-09-17 ‧ 由 Vincent55 分享
0 Like 0 留言 48 瀏覽
DAY 3
【Day 03】- Python 基礎操作與常見資料型態(整數、
浮點數、布林值、字串、串列、元組、字典)
前情提要 在前一篇文章內容中帶大家建立了 pipenv  
虛擬環境,並在虛擬環境中裝了套件。又安裝了 Vscode ,並透過設定 venv 路徑讓 Vscode...
2021-09-18 ‧ 由 Vincent55 分享
0 Like 0 留言 49 瀏覽
DAY 4
【Day 04】- Python 條件判斷與迴圈
前情提要 在前一篇文章內容中帶大家跑過一次 Python 中的基礎操作與常見的資料型態的使用。也提供了大 
家一些額外的使用方法,若有自信的讀者能再去 Day3 
看...
2021-09-19 ‧ 由 Vincent55 分享
0 Like 0 留言 40 瀏覽
DAY 5
【Day 05】- Python 字串操作(正規表達式 regexes  
、原生基本操作)
前情提要 前一篇文章帶大家看了 Python 中的條件判 
斷以及迴圈等語法,大家要先把這些基本語法用熟,之
後的幾天會比較順利歐。 開始之前 Day 2 有帶給大家
...
2021-09-20 ‧ 由 Vincent55 分享
0 Like 0 留言 44 瀏覽
DAY 6
【Day 06】- 聽說 F12 可以拿來駭入小恐龍? (網頁開
發工具分析流量)
前情提要 前一篇文章帶大家看了 Python 中字串的原 
生操作以及正規表達式的操作,這兩個對於爬蟲的資料
清洗是很方便的工具,大家熟悉運用後對於各種字串處
理會更得...
2021-09-21 ‧ 由 Vincent55 分享
'''

search

語法: search(template)

傳回第一個符合 template 的字串 {} 的部分

  • template : 字串模板。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://ithelp.ithome.com.tw/users/20134430/ironman/4307')

# print(r.html.text)
ele = r.html.xpath(
    '/html/body/div[2]/div/div/div[2]/div[1]')

print(ele[0].search('【Day {}】'), ele[0].search('【Day {}】').fixed)'''
"""
<Result ('01',) {}> ('01',)
"""

search_all

語法: search_all(template)

傳回符合 template 的字串 {} 的部分

  • template : 字串模板。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://ithelp.ithome.com.tw/users/20134430/ironman/4307')

# print(r.html.text)
ele = r.html.xpath(
    '/html/body/div[2]/div/div/div[2]/div[1]')

print(ele[0].search_all('【Day {}】'))
for day in ele[0].search_all('【Day {}】'):
    print(day.fixed)
"""
[<Result ('01',) {}>, <Result ('02',) {}>, <Result ('03',) {}>, <Result ('04',) {}>, <Result ('05',) {}>, <Result ('06',) {}>]
('01',)
('02',)
('03',)
('04',)
('05',)
('06',)
"""

這邊介紹一個使用 chrome 開發工具取得元素 CssSelector 及 XPath 的好用方法。

首先,先使用開發工具的選取工具選取想要的元素。

▲使用開發工具的選取工具鎖定元素

接下來,在開發工具對該元素點右鍵,之後點選 Copy,如果要複製 CssSelector 點選 Copy selector,如果要複製 XPath 點選 Copy XPath 或 Copy full XPath。

▲使用內建功能複製 CssSelector 或 XPath

結語

今天介紹了與 Requests 相同作者的 Requests-HTML ,多了資料清洗的功能,活用了 request-session 的功能,其他的功能與 Requests 類似。Requests-HTML 還有一些方便的功能,比如說可以很好的支援 JavaScript ,render() 用法等等可以使 Ajax ,想了解更多的讀者可以看補充資料~

明日內容

明天會與各位介紹另一個較多人用的資料清洗工具 BeautifulSoup ,通常會跟 Requests 做搭配使用,也是較為主流的套件組合。

補充資料

Requests-HTML 庫官方文件 : https://docs.python-requests.org/projects/requests-html/en/latest/

requests-html快速入门 : https://segmentfault.com/a/1190000015641160


上一篇
【Day 07】- 第一隻網路爬蟲要用什麼函式庫? (Requests)
下一篇
【Day 09】- 大家都愛的 BeautifulSoup
系列文
網路爬蟲,萬物皆爬 - 30 天搞懂並實戰網路爬蟲及應對反爬蟲技術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
arguskao
iT邦新手 4 級 ‧ 2022-05-15 11:21:07

print(ele[0].search('【Day {}】'), ele[0].search('【Day {}】').fixed)'''

為何結果是

<Result ('01',) {}> ('01',)

Vincent55 iT邦新手 4 級 ‧ 2022-05-26 23:36:10 檢舉

{} 會被解析為想要找尋的字串,可以想像為 regex 的 ()

我要留言

立即登入留言