pyppeteer

 

目录

 

文档

案例:

安装

爬取结构

浏览器截图

保存为 PDF

执行 JavaScript

启动时看到浏览器界面

调试窗口

"Chrome 正受到自动测试软件的控制" 关闭这个提示

浏览器窗口比显示的内容窗口大小调整

防止被检测为自动控制工具

恢复上次登录状态

获取元素

xpath

page.querySelector(。。。)

判断是否有滑块 .Jeval

递交元素

鼠标事件

鼠标悬停到指定元素上方 .hover

鼠标放下,移动,放开

键盘事件

回车

.waitForNavigation()

找到元素点击 .click()

设置请求头

等待事件

await asyncio.sleep(6)

await page.waitForSelector('.code img')

拉到页面最底部

获取网页源代码


文档

https://miyakogi.github.io/pyppeteer/reference.html

 

案例:

https://www.cnblogs.com/zhang-zi-yi/p/10820813.html

 

安装

pip install pyppeteer

第一次运行会自动安装对应的 chromium

 

爬取结构

url:http://quotes.toscrape.com/js/ ,为 JavaScript 渲染的

import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://quotes.toscrape.com/js/')
    doc = pq(await page.content())
    print('Quotes:', doc('.quote').length)
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())
  • Pyppeteer 里面进行了异步操作,所以需要配合 async/await 关键词来实现
  •  launch 方法会新建一个 Browser 对象,然后赋值给 browser
  •  browser 调用 newPage  方法相当于浏览器中新建了一个选项卡,同时新建了一个 Page 对象
  • Page 对象调用了 goto 方法就相当于在浏览器中输入了这个 URL,浏览器跳转到了对应的页面进行加载
  • 加载完成之后再调用 content 方法,返回当前浏览器页面的源代码
  • asyncio 的 get_event_loop 等方法的相关操作则属于 Python 异步 async 相关的内容了,大家如果不熟悉可以了解下 Python 的 async/await 的相关知识

 

浏览器截图

await page.screenshot(path='example.png')

另外还可以指定保存格式 type、清晰度 quality、是否全屏 fullPage、裁切 clip 等各个参数实现截图。

 

保存为 PDF

await page.pdf(path='example.pdf')

 

执行 JavaScript

await page.evaluate('''() => {
        return {
            width: document.documentElement.clientWidth,
            height: document.documentElement.clientHeight,
            deviceScaleFactor: window.devicePixelRatio,
        }
    }''')

括号里面为 JavaScript 语句,返回 json

{'width': 800, 'height': 600, 'deviceScaleFactor': 1}

 

启动时看到浏览器界面

launch 里面设置

broswer = await launch(headless=False)

 

调试窗口

browser = await launch(devtools=True)

写爬虫的时候会经常需要分析网页结构还有网络请求,所以开启调试工具还是很有必要的,我们可以将 devtools 参数设置为 True,这样每开启一个界面就会弹出一个调试窗口,非常方便. devtools 这个参数如果设置为了 True,那么 headless 就会被关闭了,界面始终会显现出来

 

"Chrome 正受到自动测试软件的控制" 关闭这个提示

browser = await launch(headless=False, args=['--disable-infobars'])

 

浏览器窗口比显示的内容窗口大小调整

 browser = await launch(headless=False,
                           args=[f'--window-size={width},{height}'])

 

防止被检测为自动控制工具

淘宝为例

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch(headless=False, args=['--disable-infobars'])
    page = await browser.newPage()
    await page.goto('https://login.taobao.com/member/login.jhtml?redirectURL=https://www.taobao.com/')
    await page.evaluate(
        '''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

 

恢复上次登录状态

在每次启动 Selenium 或 Pyppeteer 的时候总是是一个全新的浏览器,那就是没有设置用户目录,如果设置了它,每次打开就不再是一个全新的浏览器了,它可以恢复之前的历史记录,也可以恢复很多网站的登录信息

设置 userDataDir 就好了

import asyncio
from pyppeteer import launch

async def main():
    browser = await launch(headless=False, userDataDir='./userdata', args=['--disable-infobars'])
    page = await browser.newPage()
    await page.goto('https://www.taobao.com')
    await asyncio.sleep(100)

asyncio.get_event_loop().run_until_complete(main())

 

获取元素

xpath

<span class="title">肖申克的救赎</span>
# 获取其中文本
name = await page.xpath('//span[@class="title"]')
await (await name.getProperty("textContent")).jsonValue()
<div class="p-name p-name-type-2">
    <a target="_blank" title="此商品将于2019-07-27,00点结束闪购特卖,女神价到30期"         
     href="//item.jd.com/7019143.html" 
     onclick="searchlog(1,7019143,1,1,'','flagsClk=1094718088')">
		<em>Apple <font class="skcolor_ljg">iPad</font> 
        平板电脑 2018年新款9.7英寸(128G WLAN版/A10 芯片/Touch ID MRJP2CH/A)金色
        </em>
	    <i class="promo-words" id="J_AD_7019143">
        此商品将于2019-07-27,00点结束闪购特卖,女神价到30期  
        </i>
	</a>
</div>
# 获取 title 对应字段
name  = await num.xpath("./div[@class='p-name p-name-type-2']/a")
name = await (await name.getProperty("title")).jsonValue()

getProperty:为获取标签内的字段的值

 

page.querySelector(。。。)

css 选择方法:https://www.runoob.com/cssref/css-selectors.html

<i class="iconfont static" id="J_Quick2Static" data-spm-anchor-id="a2107.1.0.i4.44d211d9RgKFmD"></i>

获取这个标签,点击

pwd_login = await page.querySelector('#J_Quick2Static')
# print(await (await pwd_login.getProperty('textContent')).jsonValue())
await pwd_login.click()

 

判断是否有滑块 .Jeval

slider = await page.Jeval('#nocaptcha', 'node => node.style')  # 是否有滑块
  • 第一个参数:css 选择
  • 第二个参数:应该是执行的 js 代码获得此标签,.style 获得标签 css 风格;.textContent 获得标签的文本

 

递交元素

await page.type('#TPL_username_1', username, {'delay': input_time_random() - 50})
await page.type('#password-label', pwd, {'delay': input_time_random()})
  • 第一个参数:用 css 方法定位元素
  • 第二个参数:提交字段
  • 第三个参数:delay 延迟的意思,单位毫秒,意思是指定递交需要多少时间

 

鼠标事件

鼠标悬停到指定元素上方 .hover

await page.hover('#nc_1_n1z')
  • 把鼠标选定到指定元素,用 css 选取的

 

鼠标放下,移动,放开

await page.mouse.down()
await page.mouse.move(2000, 0, {'delay': random.randint(1000, 2000)})
await page.mouse.up()

.move():第一个参数向 x,第二个 y,第三个延迟,需要几秒完成

 

键盘事件

回车

await page.keyboard.press('Enter')

 

.waitForNavigation()

当页面重新加载或定向到新的 url,将返回响应

 

找到元素点击 .click()

 

# 点击登陆
btn = await page.querySelector('#J_SubmitStatic')
await btn.click()

 

设置请求头

await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299')

 

等待事件

await asyncio.sleep(6)

休息几秒

 

await page.waitForSelector('.code img')

等待指定元素出现

 

拉到页面最底部

await page.evaluate('window.scrollBy(0, document.body.scrollHeight)')

 

获取网页源代码

html = await page.content()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值