【Day 08】- 有着资料清洗功能的 Requests-HTML

前情提要

前一篇文章带大家看了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 08 JavaScript/Rails XHR、fetch、axios、Rails.ajax 比较

>>:  #08 实作篇 — 使用 Next.js 的各种 Data Fetching 方式实作小专案 ft. Github API

Python产生QRCode图片 - Python练习题一

Python练习题一 import qrcode import sys import os # 需要...

My experience with AWSome Day (Certification)

October 29, 2020 I’ve practiced the principle of M...

[DAY30]完赛篇-期待成为更好的自己

时间过得很快,记得去年这个时候刚报名前端工程师的养成班,内心充满着不安与前途未知。由於本身不是本科相...

DAY20 - line message API 初体验

上一篇,申请好了 line message API 的频道,这一篇就来实际玩转 line mess...

JavaScript - 做个录音录影功能ㄅ

大家好!今天这篇主要是实作浏览器上的录音与录影功能,这边先列出几个会做到的目标 显示视讯画面与声音 ...