数据获取_Pyppeteer基本使用(规避webdriver检测)

pyppeteer背景介绍

Chromium 是谷歌为了研发 Chrome 而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。
Pyppeteer 就是依赖于 Chromium 这个浏览器来运行的。那么有了 Pyppeteer 之后,我们就可以免去那些繁琐的环境配置等问题。如果第一次运行的时候,Chromium 浏览器没有安装,那么程序会帮我们自动安装和配置,就免去了繁琐的环境配置等工作。
另外 Pyppeteer 是基于 Python 的新特性 async 实现的,所以它的一些执行也支持异步操作,效率相对于 Selenium 来说也提高了。

环境安装

Pyppeteer 采用了 Python 的 async 机制,故运行要求的 Python 版本为 3.5 及以上
pip install pyppeteer

Demo展示

爬取http://quotes.toscrape.com/js/ 全部页面数据

import asyncio
from pyppeteer import launch
from lxml import etree
 
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://quotes.toscrape.com/js/')
page_text = await page.content()
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@class="quote"]')
print(len(div_list))
await browser.close()
 
asyncio.get_event_loop().run_until_complete(main())

详细用法

调用 launch 方法相关参数介绍
ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的错误,默认是 False。
headless (bool): 是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。
executablePath (str): 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。
args (List[str]): 在执行过程中可以传入的额外参数。
devtools (bool): 是否为每一个页面自动开启调试工具,默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。
关闭提示条:”Chrome 正受到自动测试软件的控制”,这个提示条有点烦,那咋关闭呢?这时候就需要用到 args 参数了,禁用操作如下:

设置显示页面的长宽像素

import asyncio
from pyppeteer import launch
width, height = 1366, 768
async def main():
	browser = await launch(headless=False)
	page = await browser.newPage()
	await page.setViewport({'width': width, 'height': height})
	await page.goto('https://www.taobao.com')
	await asyncio.sleep(3)
asyncio.get_event_loop().run_until_complete(main())

执行js程序:拖动滚轮,调用evaluate方法

import asyncio
from pyppeteer import launch
width, height = 1366, 768
async def main():
	browser = await launch(headless=False)
	page = await browser.newPage()
	await page.setViewport({'width': width, 'height': height})
	await page.goto('https://movie.douban.com/typerank?	type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=')
	await asyncio.sleep(3)
	#evaluate可以返回js程序的返回值
	dimensions = await page.evaluate('window.scrollTo(0,document.body.scrollHeight)')
	await asyncio.sleep(3)
	print(dimensions)
	await browser.close()
asyncio.get_event_loop().run_until_complete(main())

关闭测试提示

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

规避webdriver检测

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(10)
asyncio.get_event_loop().run_until_complete(main())

设置UA伪装:

await page.setUserAgent('xxx')

设置无头模式

import asyncio
from pyppeteer import launch
async def main():
browser = await launch(
headless=True
)
page = await browser.newPage()

设置页面视图大小

await page.setViewport(viewport={'width': 1280, 'height': 800})
await page.goto('https://www.baidu.com/')

实现cs节点交互

await page.type('#kw','周杰伦',{'delay': 1000})
await asyncio.sleep(3)
await page.click('#su')
await asyncio.sleep(3)

#使用选择器选中标签进行点击
alist = await page.querySelectorAll('.s_tab_inner > a')
a = alist[3]
await a.click()
await asyncio.sleep(3)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())

键盘操作

await page.waitForSelector("select#BirthYear > option:nth-child(7)", {'timeout': 1000 * 30})
await page.keyboard.press(**{'keyCode': 40, 'code': 'ArrowDown', 'key': 'ArrowDown'},)
await page.keyboard.press(**{'keyCode': 40, 'code': 'ArrowDown', 'key': 'ArrowDown'},)
await page.keyboard.press(**{'keyCode': 40, 'code': 'ArrowDown', 'key': 'ArrowDown'},)
await page.keyboard.press(**{'keyCode': 13, 'code': 'Enter', 'key': 'Enter', 'text': '\r'},)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值