requests-html模块(下)
render方法
我们先理一下关系requests和的作者是同一个人,pyppeteer是nodejs中puppeteer的非官方实现
requests-html调用的pyppeteer与浏览器进行交互,
puppeteer的中文文档 点这里传送
pyppeteer的文档  博文参考
调用render 方法启动pyppeteer
使用之前要先下载chromium 下载地址
你懂的,天朝网络环境很复杂,如果要用pyppeteer自己绑定的chromium,半天都下载不下来,所以我们要手动安装,然后在程序里面指定executablePath
对于requests-html源代码在714行中加入
executablePath=’path/to/the/chromium‘
from requests_html import HTMLSession
url  = 'https://httpbin.org/get'
session = HTMLSession()
res = session.get(url = url)
res.html.render()
print(res.html.html)

可以看到如上图中我用红色的圈出来的地方,标示的是无头浏览器HeadlessChrome,这个是明显不是正常的人类用户,会被反扒网站所识别
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)
在正常使用的浏览器的控制台中键入navigator.userAgent就可以看到浏览器的请求头把他复制到--user-agent之后,注意千万不能有空格,--nosand 是以最高权限运行
启动参数
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,
    }
请求网站可以看到我们进行设置的UA头生效了
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和页面进行交互 
"""Reloads the response in Chromium, and replaces HTML content
        with an updated version, with JavaScript executed.
        :param retries: The number of times to retry loading the page in Chromium.
        :param script: JavaScript to execute upon page load (optional).
        :param wait: The number of seconds to wait before loading the page, preventing timeouts (optional).
        :param scrolldown: Integer, if provided, of how many times to page down.
        :param sleep: Integer, if provided, of how many long to sleep after initial render.
        :param reload: If ``False``, content will not be loaded from the browser, but will be provided from memory.
        :param keep_page: If ``True`` will allow you to interact with the browser page through ``r.html.page``.
如果sleep和scrolldown一起用,表示翻一夜,停几秒
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)
输出结果为
{'width': 800, 'height': 600, 'deviceScaleFactor': 1}
JS 注入实例2 更改navigator.webdriver
'''() =>{
           Object.defineProperties(navigator,{
             webdriver:{
               get: () => undefined
             }
           })
        }'''
scrolldown
这个我们先改一下源码


与浏览器进行交互
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()
#  指定截图位置,截图从哪个坐标开始
screenshot({'path':'1.png','clip':'{'x':200,'y':'300','weith':400,'height':'600'}'})
page.evaluate(pageFunction[, ...args])
- pageFunction <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': 1366, 'height': 768})
page.cookies()
如果不指定任何 url,此方法返回当前页面域名的 cookie。 如果指定了 url,只返回指定的 url 下的 cookie。
page.type(selector, text[, options])
- selector `<string>` 要输入内容的元素选择器。如果有多个匹配的元素,输入到第一个匹配的元素。
- text `<string>` 要输入的内容
- options `<object>`
    - delay `<number>` 每个字符输入的延迟,单位是毫秒。默认是 0。
page.click(selector[, options])
- selector `<string>` 要点击的元素的选择器。 如果有多个匹配的元素, 点击第一个。
- options `<object>`
    - button `<string>` left, right, 或者 middle, 默认是 left。
    - clickCount `<number>` 默认是 1. 查看 UIEvent.detail。
    - delay `<number>` mousedown 和 mouseup 之间停留的时间,单位是毫秒。默认是0
page.focus(selector)
- 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 - 否则会报错
 
page.emulate
模拟手机
await page.emulate(iPhone);
键盘事件
语法:
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。 
项目代码
puppeteer项目参考 传送门
模拟登陆Gmail
import asyncio
import time
from pyppeteer import launch
async def gmailLogin(username, password, url):
    #'headless': False如果想要浏览器隐藏更改False为True
    # 127.0.0.1:1080为代理ip和端口,这个根据自己的本地代理进行更改,如果是vps里或者全局模式可以删除掉'--proxy-server=127.0.0.1:1080'
    browser = await launch({'headless': False, 'args': ['--no-sandbox', '--proxy-server=127.0.0.1:1080']})
    page = await browser.newPage()
    await page.setUserAgent(
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')
    await page.goto(url)
    # 输入Gmail
    await page.type('#identifierId', username)
    # 点击下一步
    await page.click('#identifierNext > content')
    page.mouse  # 模拟真实点击
    time.sleep(10)
    # 输入password
    await page.type('#password input', password)
    # 点击下一步
    await page.click('#passwordNext > content > span')
    page.mouse  # 模拟真实点击
    time.sleep(10)
    # 点击安全检测页面的DONE
    # await page.click('div > content > span')#如果本机之前登录过,并且page.setUserAgent设置为之前登录成功的浏览器user-agent了,
    # 就不会出现安全检测页面,这里如果有需要的自己根据需求进行更改,但是还是推荐先用常用浏览器登录成功后再用python程序进行登录。
    # 登录成功截图
    await page.screenshot({'path': './gmail-login.png', 'quality': 100, 'fullPage': True})
    #打开谷歌全家桶跳转,以Youtube为例
    await page.goto('https://www.youtube.com')
    time.sleep(10)
if __name__ == '__main__':
    username = '你的gmail包含@gmail.com'
    password = r'你的gmail密码'
    url = 'https://gmail.com'
    loop = asyncio.get_event_loop()
    loop.run_until_complete(gmailLogin(username, password, url))
# 代码由三分醉编写,网址www.sanfenzui.com,参考如下文章:
# https://blog.csdn.net/Chen_chong__/article/details/82950968
												
											requests-html模块(下)的更多相关文章
- Python-Windows下安装BeautifulSoup和requests第三方模块
		
http://blog.csdn.net/yannanxiu/article/details/50432498 首先给出官网地址: 1.Request官网 2.BeautifulSoup官网 我下载的 ...
 - [py]requests+json模块处理api数据,flask前台展示
		
需要处理接口json数据,过滤字段,处理字段等. 一大波json数据来了 参考: https://stedolan.github.io/jq/tutorial/ https://api.github. ...
 - python接口测试中安装whl格式的requests第三方模块
		
下载 安装 requests第三方模块 下载:http://docs.python-requests.org/en/latest/user/install/#install 我下载是 https:// ...
 - Flex4分模块下样式动态加载步骤及相关问题的解决
		
1. 给应用程序编写CSS文件 (1)在项目下创建CSS文件(任意路径,可以多个).本例在src下创建了5个样式文件 (2)Flex支持的CSS文件定义如下: a) type selector(类 ...
 - thinkphp6.0 多应用模块下提示控制器不存在
		
thinkphp6.0 多应用模块下提示控制器不存在 在项目根目录下使用Composer composer require topthink/think-multi-app 参考链接
 - re模块下的的常用方法
		
引入模块: import re 1.查找findall 匹配所有,每一项都是列表中的一个元素 ret=re.findall("\d+","sjkhk172按实际花费9 ...
 - 包+time+datetime+random+hashlibhmac+typing+requests+re模块(day17整理)
		
目录 昨日内容 os模块 sys模块 json模块 pickle模块 logging模块 今日内容 包 相对导入 绝对导入 time模块 sleep 时间戳 time 格式化时间 strtime 结构 ...
 - python 跨语言数据交互、json、pickle(序列化)、urllib、requests(爬虫模块)、XML。
		
Python中用于序列化的两个模块 json 用于[字符串]和 [python基本数据类型] 间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进 ...
 - python学习笔记五 模块下(基础篇)
		
shevle 模块 扩展pickle模块... 1.潜在的陷进 >>> import shelve>>> s = shelve.open("nb" ...
 - phpcms v9 源码解析(4)content模块下的index.php文件的init()方法解析
		
在了解index.php中的init函数的时候,让我们先看看最开始的几行代码 1-5 第二行, defined('IN_PHPCMS') or exit('Nopermission resource ...
 
随机推荐
- pytorch visdom可视化工具学习—3-命令行操作使用经验
			
在使用过程中一直以为要在哪个指定的environment下(即参数env)绘制内容,就必须在使用时声明 比如如果不声明,默认的就是在'main'环境下,端口为8097: viz = visdom.Vi ...
 - [LeetCode] 256. Paint House 粉刷房子
			
There are a row of n houses, each house can be painted with one of the three colors: red, blue or gr ...
 - [LeetCode] 88. Merge Sorted Array 合并有序数组
			
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ...
 - soapUI使用-调用post方法
			
前言 soapUI的安装请查看此链接:https://www.cnblogs.com/linxiu-0925/p/10138771.html 使用步骤 1打开soapUI 2新建一个项目:New SO ...
 - python jieba 词云
			
#!/usr/bin/python # coding:utf-8 # 绘制一个<三体>全集词云 # pip install jieba # pip install matplotlib # ...
 - Influx Sql系列教程一:database 数据库
			
对于influxdb而言,database和我们更熟悉的mysql中的dababse没有什么特别的区别,可以将数据库简单理解为一堆表(measurement)的集合,接下来我们将看一下在influxd ...
 - Qt5 QtQuick系列----QtQuick的Secne Graph剖析(2)--自定义QML类型 (继承QQuickItem)
			
"当下即永恒" --- 佚名 Qt用户可以方便地使用QML中的Rectangle等基本类型,但是当不够用时,或,需要开发更高级的界面时,可以自己定义QML类型. 自定义QML类型 ...
 - 【vim小小记】vim的复制粘贴(包括系统剪贴板)
			
1.vim常用复制粘贴命令 Vim的复制粘贴命令无疑是y (yank),p(paster),加上yy,P PS: vim有个很有意思的约定(我觉得是一种约定),就是某个命令的大小写都是实现某种功能,只 ...
 - 《TCP/IP - OSI和TCP/IP分层模型》
			
一:分层模型 - - OSI 更强调:通信协议必要的功能是什么 - TCP/IP 更强调:在计算机上实现协议应该开发哪种程序 二:为什么会产生协议标准化 (分层模型的产生)? - 由于各个厂商生产 ...
 - input和while循环——Python编程从入门到实践
			
input( ) input()函数:让程序运行暂停,等待用户输入. message = input('Tell me something, and I will repeat it back to ...