request_html模塊(下)
render方法:
1、手動安裝chromium,然后再指定程序里面的executablePath
# 於requests-html源代碼在714行中加入
executablePath=’path/to/the/chromium‘
2、
from requests_html import HTMLSession
url = 'https://httpbin.org/get'
session = HTMLSession()
res = session.get(url = url)
res.html.render()
print(res.html.html)
3、在輸入navigator.userAgent 就可以看到瀏覽器的請求頭,把他復制到--user-agent之后,
注意不要有空格。 --nosand 是以最高權限
url = 'https://httpbin.org/get'
session = HTMLSession(
browser.args = [
'--no-sand',
'--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"'
])
res = session.get(url = url)
res.html.render()
print(res.html.html)
啟動參數:
kwargs = {
'headless': False,
'devtools': False, // 打開開發者工具
'ignoreDefaultArgs': // 忽略默認配置
'userDataDir' :'./userdata', //設置用戶目錄,保存cookie
'args': [
'--disable-extensions',
'--window-size={width},{height}',
'--hide-scrollbars',
'--disable-bundled-ppapi-flash',
'--mute-audio', //頁面靜音
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-gpu',
'--enable-automation',
],
'dumpio': True,
}
render的參數:
- retries 重試次數,默認為8,
- script,JS 腳本,可選參數,默認為None,
str
類型,如果有值,返回JS執行腳本的返回值 - wait 加載頁面前等待的秒數,防止超時,默認0.2秒,可選參數,浮點型
- scrolldown,頁面滾動次數,整數,默認為0,
- sleep, 首次渲染之后暫停的秒數,接收整數,可選類型,默認為0
- reload 默認為
True
,如果為False,如果為False
,就會從內存中加載內容 - keep_page,默認為
False
,如果為True
,就可以通過r.html.page
和頁面進行交互
js注入實例1:
script = """
() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}
"""
from requests_html import HTMLSession
url = 'https://httpbin.org/get'
session = HTMLSession(
browser_args=[
'--no-sand',
'--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"'
]
)
res = session.get(url = url)
r = res.html.render(script=script)
print(r)
js注入實例2 更改navigator.webdriver:
'''() =>{
Object.defineProperties(navigator,{
webdriver:{
get: () => undefined
}
})
}'''
注意修改源碼:
與瀏覽器進行交互
page.screenshot([options])
- options `<object>` 可選配置
- path `<string>` 截圖保存路徑。截圖圖片類型將從文件擴展名推斷出來。如果是相對路徑,則從當前路徑解析。如果沒有指定路徑,圖片將不會保存到硬盤。
- type `<string>` 指定截圖類型, 可以是 jpeg 或者 png。默認 'png'.
- quality `<number>` 圖片質量, 可選值 0-100. png 類型不適用。
- fullPage <boolean> 如果設置為true,則對完整的頁面(需要滾動的部分也包含在內)。默認是false
- clip `<object>` 指定裁剪區域。需要配置:
- x `<number>` 裁剪區域相對於左上角(0, 0)的x坐標
- y `<number>` 裁剪區域相對於左上角(0, 0)的y坐標
- width `<number>` 裁剪的寬度
- height `<number>` 裁剪的高度
- omitBackground <boolean> 隱藏默認的白色背景,背景透明。默認不透明
- encoding `<string>` 圖像的編碼可以是 base64 或 binary 默認為二進制
截圖實例:
import asyncio
from requests_html import HTMLSession
url = 'https://httpbin.org/get'
session = HTMLSession(
browser_args=[
'--no-sand',
'--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"'
]
)
res = session.get(url = url)
script = """
() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}
"""
try:
res.html.render(script=script,sleep = 1,keep_page = True)
async def main():
await res.html.page.screenshot({'path':'1.png'}) # 傳入參數用字典path 代表路徑 值為你要存放的路徑
asyncio.get_event_loop().run_until_complete(main())
finally:
session.close()
page.evaluate(pageFunction[, ...args])
- pagFunction(function/string): 要在頁面實例上文中執行的方法
js1 = '''() =>{
Object.defineProperties(navigator,{
webdriver:{
get: () => undefined
}
})
}'''
js4 = '''() =>{Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en']});
}'''
await page.evaluate(js1) ## 更改webdriver
await page.evaluate(js4) ##更改語言
page.setViewport()
設置頁面大小:
page.setViewport({'width':1336,'height':768})
page.cookie()
如果不指定任何url,此方法返回當前頁面域名的cookie。如果指定了url,只能返回指定的cookie
page.type(selector, text[, options])
selector `<string>` 要輸入內容的元素選擇器。如果有多個匹配的元素,輸入到第一個匹配的元素。
- text `<string>` 要輸入的內容
- options `<object>`
- delay `<number>` 每個字符的延時。單位是毫秒,默認是0
page.click(selector[, options])
selector <string> 要給焦點的元素的選擇器selector。如果有多個匹配的元素,焦點給第一個元素
page.hover(selector)
selector<string>: 要hover的元素的選擇器。如果匹配多個,hover第一個
page.waitFor(selectorOrFunctionOrTimeout[, options[, ...args]])
- selectorOrFunctionOrTimeout <string|number|function> 選擇器, 方法 或者 超時時間
- options `<object>` 可選的等待參數
...args <...Serializable|JSHandle> 傳給 pageFunction 的參數
如果 selectorOrFunctionOrTimeout 是 string, 那么認為是 css 選擇器或者一個xpath, 根據是不是'//'開頭, 這時候此方法是 page.waitForSelector 或 page.waitForXPath的簡寫
如果 selectorOrFunctionOrTimeout 是 function, 那么認為是一個predicate,這時候此方法是page.waitForFunction()的簡寫
如果 selectorOrFunctionOrTimeout 是 number, 那么認為是超時時間,單位是毫秒,返回的是Promise對象,在指定時間后resolve
否則會報錯
鍵盤事件:
鍵盤事件
語法:
res.html.page.keyboard.XXX
keyboard.down(key[, options])
- key
<string>
按下的鍵名, 比如 ArrowLeft. 一個包含所有鍵名的列表見 USKeyboardLayout.- - options
<object>
- text<string>
如果指定,則使用此文本生成輸入事件.
keyboard.up(key)
- key
<string>
要釋放的鍵的鍵名, 例如 ArrowLeft
keyboard.press(key[, options])
- key
<string>
按下的鍵名, 比如 ArrowLeft. - options
<object>
- text<string>
如果指定,則使用此文本生成輸入事件。 - delay<number>
在 keydown 和 keyup 間隔的時間, 以毫秒為單位. 默認為 0。
keyboard.type(text, options)
-
text
<string>
要輸入到焦點元素中的文本。 -
options
<object>
- delay<number>
按鍵間隔的時間, 以毫秒為單位. 默認為 0。page.keyboardtype('喜歡你啊',{‘delay’:100})
鼠標事件
r.html.page.mouse.XXX
mouse.click(x, y, [options])
- x
<number>
- y
<number>
- options
<object>
- button
<string>
left ,right 或 middle,默認是 left。 - clickCount
<number>
默認是 1。見 UIEvent.detail。 - delay
<number>
在毫秒內且在 mousedown 和 mouseup 之間等待的時間。 默認為0。
mouse.down([options])
- options
<object>
- button
<string>
left,right 或 middle,默認是 left。 - clickCount
<number>
默認是 1。
mouse.up([options])
- options
<object>
- button
<string>
left,right,或 middle,默認是 left。 - clickCount
<number>
默認是 1。