無所不能的requests-html庫(requests庫的爸爸)


官網介紹

  • 全面支持解析JavaScript!
  • CSS 選擇器 (jQuery風格, 感謝PyQuery).
  • XPath 選擇器, for the faint at heart.
  • 自定義user-agent (就像一個真正的web瀏覽器).
  • 自動追蹤重定向.
  • 連接池與cookie持久化.
  • 令人欣喜的請求體驗,魔法般的解析頁面.
  • 異步支持

GitHub地址

一、安裝

$ pip install requests-html

只支持python3.6及以上

二、使用方法

構造一個訪問python.org的GET請求,從源碼可以知道其實是使用requests的get方法

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://python.org/')

# 響應對象 = session.request(......)

# 響應對象 = session.get(......)

# 響應對象 = session.post(......)
  1. r 的屬性參數
r1 = session.get('https://python.org/')
# 相當於
r2 = requests.get('https://python.org/')

所以,r1和r2屬性參數都是一樣的,都可以使用r.url r.text等屬性方法,跟requests模塊使用方法是一樣的,因為其內部是使用requests模塊的。

2.HTMLSession()的參數


session = HTMLSession(
    browser_args=[
        '--no-sand',   			# 沙箱環境
        '--user-agent=XXXXX'	 # 自定義UA
    ],
    headless=False   # 需要修改源碼才能設置該參數,默認不能啟動瀏覽器模擬,改了之后設置headless=False就可以模擬
)

headless源碼修改:
--->HTMLSession---->BaseSession

在BaseSession的__init__方法添加一個關鍵字參數headless=True,再實例化對象添加多一個參數self.__headless = headless

在BaseSession的browser方法的返回對象self._browser實例化傳入該參數即可

注意:如果想要模擬啟動瀏覽器,必須執行r.html.render()方法

三、r.html對象(HTML類)

r.html事實上就是一個解析后的html對象,是基於HTML類的

from requests_html import HTML

r.html屬性和方法:

頁面上所有可被獲取到的超鏈接,都會被轉成絕對路徑形式。

base_url

頁面的基准URL,支持``標簽(了解更多)。

encoding

用於編碼 從HTML和html響應頭中提取的內容進行編碼的格式

find

find(selector: str = '*', *, containing: Union[str, typing.List[str]] = None, clean: bool = False, first: bool = False,_encoding: str = None) → Union[typing.List[_ForwardRef('Element')], _ForwardRef('Element')]

接收一個css選擇器參數,返回一個Element對象Element對象組成的列表。

*參數說明*

  • selector - css選擇器
  • clean - 對找到的是否進行處理
  • containing - 如果指定,則只會返回包含指定文本的Element對象
  • first - 是否只返回第一個結果
  • _encoding - 編碼格式

CSS選擇器示例:

  • a
  • a.someClass
  • a#someID
  • a[target=_blank]

查看CSS選擇器的更多詳細內容

如果first參數被置為True, 則只返回找到的第一個Element對象

full_text

返回Element對象或HTML中的所有文本(包括鏈接)

html

返回Unicode行式的HTML內容(了解更多)

返回頁面所有鏈接,並保留鏈接的原本形式

lxml

返回lxml行式的HTML內容或lxml對象

pq

返回PyQuery 行式的HTML內容

raw_html

返回字節行式的HTML內容(了解更多

render

render(retries: int = 8, script: str = None, wait: float = 0.2, scrolldown=False, sleep: int = 0, reload: bool = True, timeout: Union[float, int] = 8.0, keep_page: bool = False)

執行JavaScript,在Chromium里重新加載響應,並用最新獲取到的HTML替換掉原來的HTML。

​ r.html.render() 首次執行該方法是,模塊會檢查依賴,並下載chromium,chromium是什么鬼,看起來很像chrome?
搞過selenium的應該知道,這里簡單對比下chrome和chromium:

Chromium是谷歌的開源項目,開發者們可以共同去改進它,然后谷歌會收集改進后的Chromium並發布改進后安裝包。Chrome不是開源項目,谷歌會把Chromium的東西更新到Chrome中。你也可以這么理解Chromium是體驗版,Chrome是正式版;
Chromium不用安裝,下載下來的是壓縮包,解壓后直接就可以使用。Chrome需要安裝;
Chromium功能比Chrome多,因為新功能都是先在Chromium中使用,等完善后才添加到Chrome中。相對的Chrome就要比Chromium穩定很多不容易出錯;
Chromium不開放自動更新功能,所以用戶需手動下載更新,而Chrome則可自動連上Google的服務器更新,但新版的推出很慢。

*參數說明*

  • retries - 在Chromium里加載頁面的重試次數
  • script - 執行頁面上的JavaScript(可選參數)
  • wait - 頁面加載前的等待時間,防止超時(單位:秒,可選參數)
  • scrolldown - 接收整數參數n。如果提供參數n,表示向后翻n頁
  • sleep - 接收整數參數n。如果提供參數n,則在render初始化后,程序會暫停n秒
  • reload - 如果為False,則不會重新從瀏覽器加載內容,而是讀取內存里的內容
  • keep_page - 如果為True,將會允許你通過r.html.page與瀏覽器頁面交互

如果scrolldownsleep都指定,那么程序會在暫停相應時間后,再往后翻頁面(如:scrolldown=10, sleep=1

如果僅指定了sleep,程序會暫停相應時間,再返回數據

如果指定script,他將會在運行時執行提供的JavaScript。如:

script = """
    () => {
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio,
        }
    }
"""

返回一段JavaScript的返回值:

>>> r.html.render(script=script)
{'width': 800, 'height': 600, 'deviceScaleFactor': 1}

*警告*:如果你使用keep_page, 你最好關閉已經使用過的頁面,如果打開過多頁面會造成瀏覽器崩潰。

*警告*:如果你第一次運行這個方法,它將會下載Chromium保存在你的家目錄下。

最后,因為在爬蟲中,我們使用了webdriver,瀏覽器會默認識別到,會去告訴服務器我們是webdriver,會進行反爬措施,所以我們需要,關掉瀏覽器的識別,加入下面這條js代碼即可

繞過網站對webdriver的檢測:
							'''
							() =>{
                                Object.defineProperties(navigator,{
                                webdriver:{
                                    get: () => undefined
                                    }
                                })
                            }
                            '''

**search*(template: str*) → parse.Result

根據傳入的模板參數,查找Element對象

參數說明

  • template - 模板參數

search_all

search_all(template: str) → Union[typing.List[_ForwardRef('Result')], _ForwardRef('Result')]

根據傳入的模板參數,查找所有的Element對象

參數說明

  • template - 模板參數

xpath

xpath(selector: str, *, clean: bool = False, first: bool = False, _encoding: str = None) → Union[typing.List[str], typing.List[_ForwardRef('Element')], str, _ForwardRef('Element')]

傳入一個XPath選擇器參數,返回所有的Element對象

*參數說明*

  • selector - xpath選擇器
  • clean - 對找到的是否進行處理
  • first - 是否只返回第一個結果
  • _encoding - 編碼格式

如果指定了一個子選擇器(如://a/@href),將返回一個簡單的結果列表

查看更多細節Xpath示例

如果first參數被置為True, 則只返回找到的第一個Element對象

四、Element類

class requests_html.Element(*, element, url: str, default_encoding: str = None) → None   源碼

HTML的一個element對象。

*參數說明*

  • element - 根據該參數進行解析
  • url - HTML對應的URL,absolute_links函數會調用該參數
  • default_encoding - 指定字符編碼

Element對象方法及屬性

頁面上所有可被獲取到的超鏈接,都會被轉成絕對路徑形式。

attrs

返回一個字典,該字典包括**Element對象**的所有html屬性。

base_url

頁面的基准URL,支持``標簽(了解更多)。

encoding

用於編碼從HTML和html響應頭中提取的內容

find

**find*(selector: str = '', *, containing: Union[str, typing.List[str]] = None, clean: bool = False, first: bool = False,_encoding: str = None) → Union[typing.List[_ForwardRef('Element')], _ForwardRef('Element')]

接收一個css選擇器參數,返回一個Element對象Element對象組成的列表。

參數說明

  • selector - css選擇器
  • clean - 對找到的是否進行處理
  • containing - 如果指定,則只會返回包含指定文本的Element對象
  • first - 是否只返回第一個結果
  • _encoding - 編碼格式

CSS選擇器示例:

  • a
  • a.someClass
  • a#someID
  • a[target=_blank]

查看CSS選擇器的更多詳細內容

如果first參數被置為True, 則只返回找到的第一個Element對象

full_text

返回Element對象或HTML中的所有文本(包括鏈接)

html

返回Unicode行式的HTML內容(了解更多)

返回頁面所有鏈接,並保留鏈接的原本形式

lxml

返回lxml行式的HTML內容

pq

返回PyQuery 行式的HTML內容

raw_html

返回字節行式的HTML內容(了解更多

search

search(template: str) → parse.Result

根據傳入的模板參數,查找Element對象

*參數說明*

  • template - 模板參數

search_all

search_all(template: str) → Union[typing.List[_ForwardRef('Result')], _ForwardRef('Result')]

根據傳入的模板參數,查找所有的Element對象

*參數說明*

  • template - 模板參數

text

返回Element對象HTML對象的文本內容(不包含html標簽)

xpath

xpath(selector: str, *, clean: bool = False, first: bool = False, _encoding: str = None) → Union[typing.List[str], typing.List[_ForwardRef('Element')], str, _ForwardRef('Element')]

傳入一個XPath選擇器參數,返回所有的Element對象

*參數說明*

  • selector - xpath選擇器
  • clean - 對找到的是否進行處理
  • first - 是否只返回第一個結果
  • _encoding - 編碼格式

如果指定了一個子選擇器(如://a/@href),將返回一個簡單的結果列表

查看更多細節Xpath示例

如果first參數被置為True, 則只返回找到的第一個Element對象

五、比較實用的方法

user_agent

*requests_html.user_agent*(style=None) → str    源碼

返回一個指定風格的合法的用戶代理,默認是Chrome風格的用戶代理

六、HTML Sessions

這些sessions用於構造http請求。

class requests_html.HTMLSession(mock_browser=True)    源碼

它是一個可被銷毀的session,可用於cookie持久化和連接池,以及其他地方。

close()

關閉一個已經被創建的瀏覽器

delete(url, **kwargs)

發送一個DELETE請求,返回一個Response對象

*參數說明*

  • url - 新的請求對象的URL
  • **kwargs - request攜帶的參數(可選)

*返回類型*

requests.Response

get_adapter(url)

返回指定url的一個合適的連接適配器

*返回類型*

requests.adapters.BaseAdapter

get_redirect_target(resp)

接收一個響應,返回重定向后的URL或none

head(url, **kwargs)

發送一個HEAD請求,返回一個Response對象

*參數說明*

  • url - 新的請求對象的URL
  • **kwargs - request攜帶的參數(可選)

*返回類型*

requests.Response

merge_environment_settings(url, proxies, stream, verify, cert)

檢查環境變量並與其他設置合並

*返回類型*:字典

mount(prefix, adapter)

在前綴上注冊連接適配器

適配器根據前綴長度降序排序

options(url, **kwargs)

發送一個OPTIONS請求,返回一個Response對象

*參數說明*

  • url - 新的請求對象的URL
  • **kwargs - request攜帶的參數(可選)

*返回類型*

requests.Response

patch(url, data=None, **kwargs)

發送一個PATCH請求,返回一個Response對象

*參數說明*

  • url - 新的請求對象的URL
  • data - 它被包含在請求對象中,它可以是字典、字節、文件(可選參數)
  • **kwargs - request攜帶的參數(可選)

*返回類型*

requests.Response

post(url, data=None, json=None, **kwargs)

發送一個POST請求,返回一個Response對象

*參數說明*

  • url - 新的請求對象的URL
  • data - 它被包含在請求對象中,它可以是字典、字節、文件(可選參數)
  • json - 它被包含在請求對象中,它是json(可選參數)
  • **kwargs - request攜帶的參數(可選)

*返回類型*

requests.Response

prepare_request(request)

構造一個預請求對象(PreparedRequest)。這個預請求對象的設置來自於已經設置好session的請求實例

*參數說明*

  • request - 已經設置好session的請求實例

*返回類型*

requests.PreparedRequest

put(url, data=None, **kwargs)

發送一個PUT請求,返回一個Response對象

*參數說明*

  • url - 新的請求對象的URL
  • data - 它被包含在請求對象中,它可以是字典、字節、文件(可選參數)
  • **kwargs - request攜帶的參數(可選)

*返回類型*

requests.Response

rebuild_auth(prepared_request, response)

當被重定向的時候,我們可能要從請求對象中去掉認證信息,避免認證信息泄露。 本方法會自動去掉認證信息,並且重新申請授權,來避免認證信息泄露

rebuild_method(prepared_request, response)

當被重定向的時候,我們可能要修改請求的方法,用來請求某個特殊的頁面,或者適應某個 特殊的瀏覽器習慣。

rebuild_proxies(prepared_request, response)

本方法會根據環境變量重新設置代理的配置。如果我們被重定向到一個不需要代理的URL, 我們將去掉代理的配置,否則,我們將給該URL添加缺失的代理配置(防止由於之前重定向去掉了代理而造成的請求錯誤)。

必要時,本方法可以替換Proxy-Authorization頭。     *返回類型*

字典

request(*args, **kwargs)

request(*args, **kwargs) → requests_html.HTMLResponse

使用欺騙性地User–Agent頭,構造一個HTTP請求。返回HTTPResponse類對象。

resolve_redirects

resolve_redirects(resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs)

接收一個響應對象,返回響應對象或請求對象的生成器。

send(request, **kwargs)

發送預請求對象。必要時,本方法可以替換Proxy-Authorization頭。

*返回類型*

requests.Response

七、與瀏覽器進行交互

附:requests-html庫render方法的使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM