官網介紹
- 全面支持解析JavaScript!
- CSS 選擇器 (jQuery風格, 感謝PyQuery).
- XPath 選擇器, for the faint at heart.
- 自定義user-agent (就像一個真正的web瀏覽器).
- 自動追蹤重定向.
- 連接池與cookie持久化.
- 令人欣喜的請求體驗,魔法般的解析頁面.
- 異步支持
一、安裝
$ 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(......)
- 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屬性和方法:
absolute_links
頁面上所有可被獲取到的超鏈接,都會被轉成絕對路徑形式。
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內容(了解更多)
links
返回頁面所有鏈接,並保留鏈接的原本形式
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
與瀏覽器頁面交互
如果scrolldown
和sleep
都指定,那么程序會在暫停相應時間后,再往后翻頁面(如: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
**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對象方法及屬性
absolute_links
頁面上所有可被獲取到的超鏈接,都會被轉成絕對路徑形式。
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內容(了解更多)
links
返回頁面所有鏈接,並保留鏈接的原本形式
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