-
2021-06-21 11:41:02
Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大。 而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。
基础用法
import asyncio
from pyppeteer import launchasync def main():
# headless参数设为False,则变成有头模式
# Pyppeteer支持字典和关键字传参,Puppeteer只支持字典传参# 指定引擎路径 # exepath = r'C:\Users\Administrator\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458\chrome-win32/chrome.exe' # browser = await launch({'executablePath': exepath, 'headless': False, 'slowMo': 30}) browser = await launch( # headless=False, {'headless': False} ) page = await browser.newPage() # 设置页面视图大小 await page.setViewport(viewport={'width': 1280, 'height': 800}) # 是否启用JS,enabled设为False,则无渲染效果 await page.setJavaScriptEnabled(enabled=True)
超时间见 1000 毫秒
res = await page.goto('https://www.toutiao.com/', options={'timeout': 1000}) resp_headers = res.headers # 响应头 resp_status = res.status # 响应状态 # 等待 await asyncio.sleep(2) # 第二种方法,在while循环里强行查询某元素进行等待 while not await page.querySelector('.t'): pass # 滚动到页面底部 await page.evaluate('window.scrollBy(0, document.body.scrollHeight)') await asyncio.sleep(2) # 截图 保存图片 await page.screenshot({'path': 'toutiao.png'}) # 打印页面cookies print(await page.cookies()) """ 打印页面文本 """ # 获取所有 html 内容 print(await page.content()) # 在网页上执行js 脚本 dimensions = await page.evaluate(pageFunction='''() => { return { width: document.documentElement.clientWidth, // 页面宽度 height: document.documentElement.clientHeight, // 页面高度 deviceScaleFactor: window.devicePixelRatio, // 像素比 1.0000000149011612 } }''', force_expr=False) # force_expr=False 执行的是函数 print(dimensions) # 只获取文本 执行 js 脚本 force_expr 为 True 则执行的是表达式 content = await page.evaluate(pageFunction='document.body.textContent', force_expr=True) print(content) # 打印当前页标题 print(await page.title()) # 抓取新闻内容 可以使用 xpath 表达式 """ # Pyppeteer 三种解析方式 Page.querySelector() # 选择器 Page.querySelectorAll() Page.xpath() # xpath 表达式 # 简写方式为: Page.J(), Page.JJ(), and Page.Jx() """ element = await page.querySelector(".feed-infinite-wrapper > ul>li") # 纸抓取一个 print(element) # 获取所有文本内容 执行 js content = await page.evaluate('(element) => element.textContent', element) print(content) # elements = await page.xpath('//div[@class="title-box"]/a') elements = await page.querySelectorAll(".title-box a") for item in elements: print(await item.getProperty('textContent')) ## 获取文本 title_str = await (await item.getProperty('textContent')).jsonValue() # 获取链接 title_link = await (await item.getProperty('href')).jsonValue() print(title_str) print(title_link) # 关闭浏览器 await browser.close()
asyncio.get_event_loop().run_until_complete(main())
import asyncio
import pyppeteer
from collections import namedtupleResponse = namedtuple(“rs”, “title url html cookies headers history status”)
async def get_html(url):
browser = await pyppeteer.launch(headless=True, args=[’–no-sandbox’])
page = await browser.newPage()
res = await page.goto(url, options={‘timeout’: 3000})
data = await page.content()
title = await page.title()
resp_cookies = await page.cookies() # cookie
resp_headers = res.headers # 响应头
resp_status = res.status # 响应状态
print(data)
print(title)
print(resp_headers)
print(resp_status)
return titleif name == ‘main’:
url_list = [“https://www.toutiao.com/”,
“http://jandan.net/ooxx/page-8#comments”,
“https://www.12306.cn/index/”
]
task = [get_html(url) for url in url_list]loop = asyncio.get_event_loop() results = loop.run_until_complete(asyncio.gather(*task)) for res in results: print(res)
headers = {‘date’: ‘Sun, 28 Apr 2019 06:50:20 GMT’,
‘server’: ‘Cmcc’,
‘x-frame-options’: ‘SAMEORIGIN\nSAMEORIGIN’,
‘last-modified’: ‘Fri, 26 Apr 2019 09:58:09 GMT’,
‘accept-ranges’: ‘bytes’,
‘cache-control’: ‘max-age=43200’,
‘expires’: ‘Sun, 28 Apr 2019 18:50:20 GMT’,
‘vary’: ‘Accept-Encoding,User-Agent’,
‘content-encoding’: ‘gzip’,
‘content-length’: ‘19823’,
‘content-type’: ‘text/html’,
‘connection’: ‘Keep-alive’,
‘via’: ‘1.1 ID-0314217270751344 uproxy-17’}
模拟输入# 模拟输入 账号密码 {'delay': rand_int()} 为输入时间 await page.type('#TPL_username_1', "sadfasdfasdf") await page.type('#TPL_password_1', "123456789", ) await page.waitFor(1000) await page.click("#J_SubmitStatic")
使用 tkinter 获取页面高度 宽度
def screen_size():
“”“使用tkinter获取屏幕大小”""
import tkinter
tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()
return width, height
爬取京东商城import requests
from bs4 import BeautifulSoup
from pyppeteer import launch
import asynciodef screen_size():
“”“使用tkinter获取屏幕大小”""
import tkinter
tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()
return width, heightasync def main(url):
# browser = await launch({‘headless’: False, ‘args’: [’–no-sandbox’], })
browser = await launch({‘args’: [’–no-sandbox’], })
page = await browser.newPage()
width, height = screen_size()
await page.setViewport(viewport={“width”: width, “height”: height})
await page.setJavaScriptEnabled(enabled=True)
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 page.goto(url)# await asyncio.sleep(2) await page.evaluate('window.scrollBy(0, document.body.scrollHeight)') await asyncio.sleep(1) # content = await page.content() li_list = await page.xpath('//*[@id="J_goodsList"]/ul/li') # print(li_list) item_list = [] for li in li_list: a = await li.xpath('.//div[@class="p-img"]/a') detail_url = await (await a[0].getProperty("href")).jsonValue() promo_words = await (await a[0].getProperty("title")).jsonValue() a_ = await li.xpath('.//div[@class="p-commit"]/strong/a') p_commit = await (await a_[0].getProperty("textContent")).jsonValue() i = await li.xpath('./div/div[3]/strong/i') price = await (await i[0].getProperty("textContent")).jsonValue() em = await li.xpath('./div/div[4]/a/em') title = await (await em[0].getProperty("textContent")).jsonValue() item = { "title": title, "detail_url": detail_url, "promo_words": promo_words, 'p_commit': p_commit, 'price': price } item_list.append(item) # print(item) # break # print(content) await page_close(browser) return item_list
async def page_close(browser):
for _page in await browser.pages():
await _page.close()
await browser.close()msg = “手机”
url = “https://search.jd.com/Search?keyword={}&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq={}&cid2=653&cid3=655&page={}”task_list = []
for i in range(1, 6):
page = i * 2 - 1
url = url.format(msg, msg, page)
task_list.append(main(url))loop = asyncio.get_event_loop()
results = loop.run_until_complete(asyncio.gather(*task_list))
#print(results, len(results))
for i in results:
print(i, len(i))#soup = BeautifulSoup(content, ‘lxml’)
#div = soup.find(‘div’, id=‘J_goodsList’)
#for i, li in enumerate(div.find_all(‘li’, class_=‘gl-item’)):
#if li.select(’.p-img a’):
#print(li.select(’.p-img a’)[0][‘href’], i)
#print(li.select(’.p-price i’)[0].get_text(), i)
#print(li.select(’.p-name em’)[0].text, i)
#else:
#print("#" * 200)
#print(li)
爬取淘宝网taobao.py
import asyncio
import time
from pyppeteer.launcher import launch
from alifunc import mouse_slide, input_time_random
from exe_js import js1, js3, js4, js5def screen_size():
“”“使用tkinter获取屏幕大小”""
import tkinter
tk = tkinter.Tk()
width = tk.winfo_screenwidth()
height = tk.winfo_screenheight()
tk.quit()
return width, heightasync def main(username, pwd, url):
browser = await launch({‘headless’: False, ‘args’: [’–no-sandbox’], }, userDataDir=’./userdata’,
args=[’–window-size=1366,768’])
page = await browser.newPage()
width, height = screen_size()
await page.setViewport(viewport={“width”: width, “height”: height})
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 page.goto(url) await page.evaluate(js1) await page.evaluate(js3) await page.evaluate(js4) await page.evaluate(js5) pwd_login = await page.querySelector('.J_Quick2Static') # print(await (await pwd_login.getProperty('textContent')).jsonValue()) await pwd_login.click() await page.type('#TPL_username_1', username, {'delay': input_time_random() - 50}) await page.type('#TPL_password_1', pwd, {'delay': input_time_random()}) await page.screenshot({'path': './headless-test-result.png'}) time.sleep(2) slider = await page.Jeval('#nocaptcha', 'node => node.style') # 是否有滑块 if slider: print('出现滑块情况判定') await page.screenshot({'path': './headless-login-slide.png'}) flag = await mouse_slide(page=page) if flag: print(page.url) await page.keyboard.press('Enter') await get_cookie(page) else: await page.keyboard.press('Enter') await page.waitFor(20) await page.waitForNavigation() try: global error error = await page.Jeval('.error', 'node => node.textContent') except Exception as e: error = None print(e, "错啦") finally: if error: print('确保账户安全重新入输入') else: print(page.url) # 可继续网页跳转 已经携带 cookie # await get_search(page) await get_cookie(page) await page_close(browser)
async def page_close(browser):
for _page in await browser.pages():
await _page.close()
await browser.close()async def get_search(page):
# https://s.taobao.com/search?q={查询的条件}&p4ppushleft=1%2C48&s={每页 44 条 第一页 0 第二页 44}&sort=sale-desc
await page.goto(“https://s.taobao.com/search?q=气球”)await asyncio.sleep(5) # print(await page.content())
获取登录后cookie
async def get_cookie(page):
res = await page.content()
cookies_list = await page.cookies()
cookies = ‘’
for cookie in cookies_list:
str_cookie = ‘{0}={1};’
str_cookie = str_cookie.format(cookie.get(‘name’), cookie.get(‘value’))
cookies += str_cookie
print(cookies)
# 将cookie 放入 cookie 池 以便多次请求 封账号 利用cookie 对搜索内容进行爬取return cookies
if name == ‘main’:
username = ‘username’
pwd = ‘password’
url = “https://login.taobao.com/member/login.jhtml?spm=a21bo.2017.754894437.1.5af911d9qqVAb1&f=top&redirectURL=https%3A%2F%2Fwww.taobao.com%2F”loop = asyncio.get_event_loop() loop.run_until_complete(main(username, pwd, url))
exe_js.py
js1 = ‘’’() =>{
Object.defineProperties(navigator,{
webdriver:{
get: () => false
}
})
}’’’js2 = ‘’’() => {
alert (
window.navigator.webdriver
)
}’’’js3 = ‘’’() => {
window.navigator.chrome = {
runtime: {},
// etc.
};
}’’’js4 = ‘’’() =>{
Object.defineProperty(navigator, ‘languages’, {
get: () => [‘en-US’, ‘en’]
});
}’’’js5 = ‘’’() =>{
Object.defineProperty(navigator, ‘plugins’, {
get: () => [1, 2, 3, 4, 5,6],
});
}’’’
alifunc.pyfrom retrying import retry # 错误自动重试
import time, asyncio, randomdef retry_if_result_none(result):
return result is None@retry(retry_on_result=retry_if_result_none, )
async def mouse_slide(page=None):
await asyncio.sleep(3)
try:
await page.hover(’#nc_1_n1z’)
await page.mouse.down()
await page.mouse.move(2000, 0, {‘delay’: random.randint(1000, 2000)})
await page.mouse.up()except Exception as e: print(e, ' :slide login False') return None else: await asyncio.sleep(3) slider_again = await page.Jeval('.nc-lang-cnt', 'node => node.textContent') if slider_again != '验证通过': return None else: await page.screenshot({'path': './headless-slide-result.png'}) print('验证通过') return 1
def input_time_random():
return random.randint(100, 151)
利用获取到的cookie 爬取搜索内容import json
import requests
import re设置 cookie 池 随机发送请求 通过 pyppeteer 获取 cookie
cookie = ‘tb_token=edd7e354dee53;t=fed8f4ca1946ca1e73223cfae04bc589;sg=20f;cna=2uJSFdQGmDMCAbfFWXWAC4Jv;cookie2=1db6cd63ad358170ea13319f7a862c33;l_g=Ug%3D%3D;v=0;unb=3150916610;skt=49cbfd5e01d1b550;cookie1=BxVRmD3sh19TaAU6lH88bHw5oq%2BgcAGcRe229Hj5DTA%3D;csg=cf45a9e2;uc3=vt3=F8dByEazRMnQZDe%2F9qI%3D&id2=UNGTqfZ61Z3rsA%3D%3D&nk2=oicxO%2BHX4Pg%3D&lg2=U%2BGCWk%2F75gdr5Q%3D%3D;existShop=MTU1Njg3MDM3MA%3D%3D;tracknick=%5Cu7433150322;lgc=%5Cu7433150322;cc=V32FPkk%2Fhw%3D%3D;mt=ci=86_1;dnk=%5Cu7433150322;nk=%5Cu7433150322;cookie17=UNGTqfZ61Z3rsA%3D%3D;tg=0;enc=tThHs6Sn3BAl8v1fu3J4tMpgzA1n%2BLzxjib0vDAtGsXJCb4hqQZ7Z9fHIzsN0WghdcKEsoeKz6mBwPUpyzLOZw%3D%3D;JSESSIONID=B3F383B3467EC60F8CA425935232D395;l=bBMspAhrveV5732DBOCanurza77OSIRYYuPzaNbMi_5pm6T_G4QOlC03xF96VjfRswYBqh6Mygv9-etuZ;hng=CN%7Czh-CN%7CCNY%7C156;isg=BLi41Q8PENDal3xUVsA-aPbfiWaKiRzB6vcTu_IpBPOmDVj3mjHsO86vxUQYW9SD;uc1=cookie16=W5iHLLyFPlMGbLDwA%2BdvAGZqLg%3D%3D&cookie21=W5iHLLyFeYZ1WM9hVnmS&cookie15=UIHiLt3xD8xYTw%3D%3D&existShop=false&pas=0&cookie14=UoTZ4ttqLhxJww%3D%3D&tag=8&lng=zh_CN;thw=cn;x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0;swfstore=34617;’
headers = {
‘cookie’: cookie,
“user-agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36”
}rep = requests.get('https://s.taobao.com/search?q=手机&p4ppushleft=1%2C48&s=0&sort=sale-desc ', headers=headers)
rep.encoding = ‘utf-8’
res = rep.text
print(res)r = re.compile(r’g_page_config = (.*?)g_srp_loadCss’, re.S)
res = r.findall(res)data = res[0].strip().rstrip(’;’)
dic_data = json.loads(data)
auctions = dic_data.get(‘mods’)[‘itemlist’][‘data’][‘auctions’]#print(auctions,len(auctions))
for item in auctions[1:]:
print(item)
break
针对iframe 的操作
page.frames 获取所有的 iframe 列表 需要判断操作的是哪一个 iframe 跟操作 page 一样操作
from pyppeteer import launch
import asyncioasync def main(url):
w = await launch({‘headless’: False, ‘args’: [’–no-sandbox’], })page = await w.newPage() await page.setViewport({"width": 1366, 'height': 800}) await page.goto(url) try: await asyncio.sleep(1) frame = page.frames print(frame) # 需要找到是哪一个 frame title = await frame[1].title() print(title) await asyncio.sleep(1) login = await frame[1].querySelector('#switcher_plogin') print(login) await login.click() await asyncio.sleep(20) except Exception as e: print(e, "EEEEEEEEE") for _page in await w.pages(): await _page.close() await w.close()
asyncio.get_event_loop().run_until_complete(main(“https://i.qq.com/?rd=1”))
#asyncio.get_event_loop().run_until_complete(main(“https://www.gushici.com/”))更多相关内容 -
pyppeteer_stealth
2021-05-07 14:37:18$ pip install pyppeteer_stealth 用法 import asyncio from pyppeteer import launch from pyppeteer_stealth import stealth async def main (): browser = await launch ( headless = True ) page = await ... -
pyppeteer防反爬干扰脚本
2019-09-09 11:35:26selenium爬虫可能会被检测到,此脚本配合pyppeteer等可以完美绕过~ -
可配合pyppeteer防反爬干扰脚本完美
2019-12-11 10:38:06pyppeteer防反爬干扰脚本 selenium爬虫可能会被检测到,此脚本配合pyppeteer等可以完美绕过 -
pyppeteer
2022-02-19 13:52:46pyppeteer官方文档 Puppeteer教程 Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Chrome 的 API,通过 JavaScript 代码来操纵 Chrome 完成一些操作,用于网络爬虫、Web 程序自动测试等,其 API 极其完善,功能...Puppeteer
Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Chrome 的 API,通过 JavaScript 代码来操纵 Chrome 完成一些操作,用于网络爬虫、Web 程序自动测试等,其 API 极其完善,功能非常强大。
pyppeteer 介绍
Pyppeteer 是一款非常高效的 web 自动化测试工具,是 Puppeteer 的 Python 版本。
pyppeteer 使用了 Python 异步协程库 asyncio,可整合 Scrapy 进行分布式爬虫。
优点
- 安装配置的便利性和运行效率方面都要远胜 selenium
- 支持 asyncio 异步协程,对于并发比较友好
缺点
- 编程语言只能用javascript
- 支持的浏览器比较单一,只能用chromium
- 是第三方的,好久没有更新了,bug 也不少,Pyppeteer 所依赖的 Puppeteer 的原生 JS 版本,本身就很不稳定
pyppeteer使用
下载安装
python3 -m pip install pyppeteer
launch常用配置
执行脚本
dimensions = await page.evaluate('''() => { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, deviceScaleFactor: window.devicePixelRatio, } }''')
使用自定义路径来存储cookie和缓存之类的数据
const browser = await puppeteer.launch({ userDataDir: './data', })
防止webdriver检测到
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,' '{ webdriver:{ get: () => false } }) }')
await page.evaluate('''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
实践
import pyppeteer # 在导入 launch 之前 把 --enable-automation 禁用 防止监测webdriver pyppeteer.launcher.DEFAULT_ARGS.remove("--enable-automation") async def main(key_word, start_page, is_last_key_word): # launch 方法会新建一个 Browser 对象,其执行后最终会得到一个 Browser 对象,然后赋值给 browser。这一步就相当于启动了浏览器。 browser = await pyppeteer.launch(headless=False, # 网站可能设置了无头/自动化测试工具嗅探 # devtools = True, # slowMo=100, # userDataDir='./pyppeteer_data', defaultViewport={"width": 1280, "height": 720}, fullPage=True, dumpio=True, # chromium浏览器多开页面卡死问题 args=['--disable-infobars', '--window-size=1920,1080', '--disable-features=TranslateUI', # '--proxy-server="socks5://127.0.0.1:1080"', # '--proxy-bypass-list=*', "--disable-infobars", "--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", ]) # 1.新建页面跳转到主页 # context = await browser.createIncognitoBrowserContext()无痕模式 index_page = await browser.newPage() await index_page.goto(index_url) await index_page.screenshot( {'path': './PYPPETEER_crawl_screenshot.png', 'type': 'png', 'fullPage': True}) print(index_page.target.url) page_text = await index_page.content() # print(page_text) # 2.点击关闭主页提示 index_close_button_selector = '' await index_page.waitForSelector(index_close_button_selector) await index_page.click(index_close_button_selector, options={'delay': delay_time}) input_selector = '' # 3.输入关键字 并搜索 await index_page.type(input_selector, key_word) search_bnt_selector = '' await index_page.click(search_bnt_selector, options={'delay': delay_time}) page_text = await index_page.content() await index_page.close()#关闭当前tab await browser.close()# 关闭浏览器 asyncio.get_event_loop().run_until_complete( main(key_word, start_page,is_last_key_word))
部署
安装 pyppeteer
pip3 install pyppeteer
安装 Chromium
在线
pyppeteer-install
离线
https://download-chromium.appspot.com/?platform=Linux_x64&type=snapshots常见错误
https://www.jianshu.com/p/ef86d9963009 https://www.jianshu.com/p/f1a8fb7037d7
Execution context was destroyed, most likely because of a navigation.
// 在登录页跳转之后添加 await page.waitForNavigation(); // 等待页面跳转
pyppeteer.errors.TimeoutError: Navigation Timeout Exceeded: 30000 ms exceeded
由于点击事件执行很快已跳转到新的页面,导致程序运行到导航等待的时候,一直处于新的页面等待触发,直到30秒超时报错,所以,正确的做法应该是把点击和导航等待视为一个整体进行操作
参考:https://blog.csdn.net/qq_29570381/article/details/89735639##写法一: await asyncio.gather( page.waitForNavigation(), page.click(’…’), ) ## 写法二: await asyncio.wait([ page.waitForNavigation(), page.click(’…’), ])
-
1.pyppeteer+scrapy开发环境搭建
2018-11-19 17:42:41win7环境使用eclipse+pydev开发调试python,编写pyppeteer和scrapy爬虫项目的环境搭建步骤。 -
python爬虫 Pyppeteer使用方法解析
2020-12-31 02:56:27那么本节就介绍另一个类似的替代品,叫做 Pyppeteer。 Pyppeteer简介 注意,本节讲解的模块叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来... -
python爬虫神器Pyppeteer入门及使用
2021-01-01 15:35:00今天就给大家介绍另一款web自动化测试工具Pyppeteer,虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜selenium。 01.Pyppeteer简介 介绍Pyppeteer之前先说一下Puppeteer,Puppeteer是谷歌... -
pyppeteer_hub:将asyncio服务器包装在pyppeteer周围,并允许使用多个浏览器和选项卡进行页面呈现,从而实现...
2021-05-08 15:55:37该项目旨在为Puppeteer(pyppeteer)的Python端口提供包装。 该服务器提供许多用于呈现的端点,以及提供用于交互和使用一致会话的端点。 服务器可以管理具有多个选项卡的多个浏览器,从而允许(理论上)高请求吞吐量... -
Pyppeteer
2020-03-24 10:16:00一、简介 Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们... 而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Pupp...一、简介
Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大。 而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。
在 Pyppetter 中,实际上它背后也是有一个类似 Chrome 浏览器的 Chromium 浏览器在执行一些动作进行网页渲染,首先说下 Chrome 浏览器和 Chromium 浏览器的渊源。
Chromium 是谷歌为了研发 Chrome 而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。
总的来说,两款浏览器的内核是一样的,实现方式也是一样的,可以认为是开发版和正式版的区别,功能上基本是没有太大区别的。
Pyppeteer 就是依赖于 Chromium 这个浏览器来运行的。那么有了 Pyppeteer 之后,我们就可以免去那些繁琐的环境配置等问题。如果第一次运行的时候,Chromium 浏览器没有安全,那么程序会帮我们自动安装和配置,就免去了繁琐的环境配置等工作。另外 Pyppeteer 是基于 Python 的新特性 async 实现的,所以它的一些执行也支持异步操作,效率相对于 Selenium 来说也提高了。
二、安装
由于 Pyppeteer 采用了 Python 的 async 机制,所以其运行要求的 Python 版本为 3.5 及以上。
pip3 install pyppeteer
如果没有报错,那么就证明安装成功了。
三、快速上手
1、接下来我们测试下基本的页面渲染操作,这里我们选用的网址为:
http://quotes.toscrape.com/js/
,这个页面是 JavaScript 渲染而成的,用基本的 requests 库请求得到的 HTML 结果里面是不包含页面中所见的条目内容的。为了证明 requests 无法完成正常的抓取,我们可以先用如下代码来测试一下:
#-*- coding:utf-8 -*- import requests from pyquery import PyQuery as pq url = 'http://quotes.toscrape.com/js/' response = requests.get(url) doc = pq(response.text) print('Quotes:', doc('.quote').length)
这里首先使用 requests 来请求网页内容,然后使用 pyquery 来解析页面中的每一个条目。观察源码之后我们发现每个条目的 class 名为 quote,所以这里选用了 .quote 这个 CSS 选择器来选择,最后输出条目数量。
运行结果:
Quotes: 0
结果是 0,这就证明使用 requests 是无法正常抓取到相关数据的。因为什么?因为这个页面是 JavaScript 渲染而成的,我们所看到的内容都是网页加载后又执行了 JavaScript 之后才呈现出来的,因此这些条目数据并不存在于原始 HTML 代码中,而 requests 仅仅抓取的是原始 HTML 代码。
2、所以遇到这种类型的网站我们应该怎么办呢?其实答案有很多:
①分析网页源代码数据,如果数据是隐藏在 HTML 中的其他地方,以 JavaScript 变量的形式存在,直接提取就好了。
②分析 Ajax,很多数据可能是经过 Ajax 请求时候获取的,所以可以分析其接口。
③模拟 JavaScript 渲染过程,直接抓取渲染后的结果。而 Pyppeteer 和 Selenium 就是用的第三种方法,下面我们再用 Pyppeteer 来试试,如果用 Pyppeteer 实现如上页面的抓取的话,代码就可以写为如下形式:
#-*- coding:utf-8 -*- 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()) 运行结果: Quotes: 10
看运行结果,这说明我们就成功匹配出来了 class 为 quote 的条目,总数为 10 条,具体的内容可以进一步使用 pyquery 解析查看。
3、那么这里面的过程发生了什么?
实际上,Pyppeteer 整个流程就完成了浏览器的开启、新建页面、页面加载等操作。另外 Pyppeteer 里面进行了异步操作,所以需要配合async/await
关键词来实现。
首先, launch 方法会新建一个 Browser 对象,然后赋值给browser
,然后调用newPage
方法相当于浏览器中新建了一个选项卡,同时新建了一个 Page 对象。
然后 Page 对象调用了goto
方法就相当于在浏览器中输入了这个 URL,浏览器跳转到了对应的页面进行加载,加载完成之后再调用 content 方法,返回当前浏览器页面的源代码。
然后进一步地,我们用 pyquery 进行同样地解析,就可以得到 JavaScript 渲染的结果了。
另外其他的一些方法如调用 asyncio 的get_event_loop
等方法的相关操作则属于 Python 异步 async 相关的内容了,大家如果不熟悉可以了解下 Python 的async/await
的相关知识。
通过上面的代码,我们就可以完成 JavaScript 渲染页面的爬取了。在这个过程中,我们没有配置 Chrome 浏览器,没有配置浏览器驱动,免去了一些繁琐的步骤,同样达到了 Selenium 的效果,还实现了异步抓取!
接下来我们再看看另外一个例子,这个例子可以模拟网页截图,保存 PDF,另外还可以执行自定义的 JavaScript 获得特定的内容,代码如下:
#-*- coding:utf-8 -*- import asyncio from pyppeteer import launch async def main(): browser = await launch() page = await browser.newPage() await page.goto('http://quotes.toscrape.com/js/') await page.screenshot(path='example.png') await page.pdf(path='example.pdf') dimensions = await page.evaluate('''() => { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, deviceScaleFactor: window.devicePixelRatio, } }''') print(dimensions) # >>> {'width': 800, 'height': 600, 'deviceScaleFactor': 1} await browser.close() asyncio.get_event_loop().run_until_complete(main())
这里我们又用到了几个新的 API,完成了网页截图保存、网页导出 PDF 保存、执行 JavaScript 并返回对应数据。
首先 screenshot 方法可以传入保存的图片路径,另外还可以指定保存格式 type、清晰度 quality、是否全屏 fullPage、裁切 clip 等各个参数实现截图。
截图的样例如下:
可以看到它返回的就是 JavaScript 渲染后的页面。
pdf 方法也是类似的,只不过页面保存格式不一样,最后得到一个多页的 pdf 文件,样例如下:
可见其内容也是 JavaScript 渲染后的内容,另外这个方法还可以指定放缩大小 scale、页码范围 pageRanges、宽高 width 和 height、方向 landscape 等等参数,导出定制化的 pdf 用这个方法就十分方便。
最后我们又调用了 evaluate 方法执行了一些 JavaScript,JavaScript 传入的是一个函数,使用 return 方法返回了网页的宽高、像素大小比率三个值,最后得到的是一个 JSON 格式的对象,内容如下:{'width': 800, 'height': 600, 'deviceScaleFactor': 1}
OK,实例就先感受到这里,还有太多太多的功能还没提及。
总之利用 Pyppeteer 我们可以控制浏览器执行几乎所有动作,想要的操作和功能基本都可以实现,用它来自由地控制爬虫当然就不在话下了。四、详细用法
了解了基本的实例之后,我们再来梳理一下 Pyppeteer 的一些基本和常用操作。Pyppeteer 的几乎所有功能都能在其官方文档的 API Reference 里面找到,链接为:
https://miyakogi.github.io/pyppeteer/reference.html
,用到哪个方法就来这里查询就好了,参数不必死记硬背,即用即查就好。五、开启浏览器
使用 Pyppeteer 的第一步便是启动浏览器,首先我们看下怎样启动一个浏览器,其实就相当于我们点击桌面上的浏览器图标一样,把它开起来。用 Pyppeteer 完成同样的操作,只需要调用 launch 方法即可。
我们先看下 launch 方法的 API,链接为:https://miyakogi.github.io/pyppeteer/reference.html#pyppeteer.launcher.launch
,其方法定义如下:pyppeteer.launcher.launch(options: dict = None, **kwargs) → pyppeteer.browser.Browser
,可以看到它处于 launcher 模块中,参数没有在声明中特别指定,返回类型是 browser 模块中的 Browser 对象,另外观察源码发现这是一个async
修饰的方法,所以调用它的时候需要使用await
。接下来看看它的参数:
ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的错误,默认是 False。 headless (bool): 是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。 executablePath (str): 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。 slowMo (int|float): 通过传入指定的时间,可以减缓 Pyppeteer 的一些模拟操作。 args (List[str]): 在执行过程中可以传入的额外参数。 ignoreDefaultArgs (bool): 不使用 Pyppeteer 的默认参数,如果使用了这个参数,那么最好通过 args 参数来设定一些参数,否则可能会出现一些意想不到的问题。这个参数相对比较危险,慎用。 handleSIGINT (bool): 是否响应 SIGINT 信号,也就是可以使用 Ctrl + C 来终止浏览器程序,默认是 True。 handleSIGTERM (bool): 是否响应 SIGTERM 信号,一般是 kill 命令,默认是 True。 handleSIGHUP (bool): 是否响应 SIGHUP 信号,即挂起信号,比如终端退出操作,默认是 True。 dumpio (bool): 是否将 Pyppeteer 的输出内容传给 process.stdout 和 process.stderr 对象,默认是 False。 userDataDir (str): 即用户数据文件夹,即可以保留一些个性化配置和操作记录。 env (dict): 环境变量,可以通过字典形式传入。 devtools (bool): 是否为每一个页面自动开启调试工具,默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。 logLevel (int|str): 日志级别,默认和 root logger 对象的级别相同。 autoClose (bool): 当一些命令执行完之后,是否自动关闭浏览器,默认是 True。 loop (asyncio.AbstractEventLoop): 时间循环对象。
1、headless 模式
首先可以试用下最常用的参数 headless,如果我们将它设置为 True 或者默认不设置它,在启动的时候我们是看不到任何界面的,如果把它设置为 False,那么在启动的时候就可以看到界面了,一般我们在调试的时候会把它设置为 False,在生产环境上就可以设置为 True,我们先尝试一下关闭 headless 模式:#-*- coding:utf-8 -*- import asyncio from pyppeteer import launch async def main(): await launch(headless=False) await asyncio.sleep(100) asyncio.get_event_loop().run_until_complete(main())
运行之后看不到任何控制台输出,但是这时候就会出现一个 Chromium 界面了:
查看一下相关信息:
看到了,这就是 Chromium,上面还写了开发者内部版本,可以认为是开发版的 Chrome 浏览器就好。
2、调试模式
在写爬虫的时候会经常需要分析网页结构还有网络请求,所以开启调试工具还是很有必要的,我们可以将 devtools 参数设置为 True,这样每开启一个界面就会弹出一个调试窗口,非常方便,示例如下:#-*- coding:utf-8 -*- import asyncio from pyppeteer import launch async def main(): browser = await launch(devtools=True) page = await browser.newPage() await page.goto('https://www.baidu.com') await asyncio.sleep(100) asyncio.get_event_loop().run_until_complete(main())
刚才说过 devtools 这个参数如果设置为了 True,那么 headless 就会被关闭了,界面始终会显现出来。在这里我们新建了一个页面,打开了百度,界面运行效果如下:
这时候我们可以看到上面的一条提示:“Chrome 正受到自动测试软件的控制”,这个提示条有点烦,那咋关闭呢?这时候就需要用到 args 参数了,禁用操作如下:browser = await launch(headless=False, args=['--disable-infobars'])
这里就不再写完整代码了,就是在 launch 方法中,args 参数通过 list 形式传入即可,这里使用的是
--disable-infobars
的参数。这里只是把提示关闭了,有些网站还是会检测到是 webdriver 吧,比如淘宝检测到是 webdriver 就会禁止登录了,我们可以试试:
#-*- coding:utf-8 -*- import asyncio from pyppeteer import launch async def main(): browser = await launch(headless=False) page = await browser.newPage() await page.goto('https://www.taobao.com') await asyncio.sleep(100) asyncio.get_event_loop().run_until_complete(main())
运行时候进行一下登录,然后就会弹出滑块,自己手动拖动一下,然后就报错了,界面如下:
爬虫的时候看到这界面是很让人崩溃的吧,而且这时候我们还发现了页面的 bug,整个浏览器窗口比显示的内容窗口要大,这个是某些页面会出现的情况,让人看起来很不爽。
我们可以先解决一下这个显示的 bug,需要设置下window-size
和viewport
,代码如下:#-*- coding:utf-8 -*- import asyncio from pyppeteer import launch width, height = 1366, 768 async def main(): browser = await launch(headless=False, args=[f'--window-size={width},{height}']) page = await browser.newPage() await page.setViewport({'width': width, 'height': height}) await page.goto('https://www.taobao.com') await asyncio.sleep(100) asyncio.get_event_loop().run_until_complete(main())
这样整个界面就正常了
3、webdriver 检测问题
淘宝主要通过window.navigator.webdriver
来对 webdriver 进行检测,所以我们只需要使用 JavaScript 将它设置为 false 即可,代码如下:#-*- coding:utf-8 -*- 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())
这里没加输入用户名密码的代码,当然后面可以自行添加,下面打开之后,我们点击输入用户名密码,然后这时候会出现一个滑动条,这里滑动的话,就可以通过了,如图所示:
OK,这样的话我们就成功规避了 webdriver 的检测,使用鼠标拖动模拟就可以完成淘宝的登录了。还有另一种方法可以进一步免去淘宝登录的烦恼,那就是设置用户目录。平时我们已经注意到,当我们登录淘宝之后,如果下次再次打开浏览器发现还是登录的状态。这是因为淘宝的一些关键 Cookies 已经保存到本地了,下次登录的时候可以直接读取并保持登录状态。
那么这些信息保存在哪里了呢?其实就是保存在用户目录下了,里面不仅包含了浏览器的基本配置信息,还有一些 Cache、Cookies 等各种信息都在里面,如果我们能在浏览器启动的时候读取这些信息,那么启动的时候就可以恢复一些历史记录甚至一些登录状态信息了。
这也就解决了一个问题:很多朋友在每次启动 Selenium 或 Pyppeteer 的时候总是是一个全新的浏览器,那就是没有设置用户目录,如果设置了它,每次打开就不再是一个全新的浏览器了,它可以恢复之前的历史记录,也可以恢复很多网站的登录信息。
那么这个怎么来做呢?很简单,在启动的时候设置 userDataDir 就好了,示例如下:
#-*- coding:utf-8 -*- 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())
这里就是加了一个 userDataDir 的属性,值为 userdata,即当前目录的 userdata 文件夹。我们可以首先运行一下,然后登录一次淘宝,这时候我们同时可以观察到在当前运行目录下又多了一个 userdata 的文件夹,里面的结构是这样子的:
具体的介绍可以看官方的一些说明,如:https://chromium.googlesource.com/chromium/src/+/master/docs/user_data_dir.md
,这里面介绍了 userdatadir 的相关内容。再次运行上面的代码,这时候可以发现现在就已经是登录状态了,不需要再次登录了,这样就成功跳过了登录的流程。当然可能时间太久了,Cookies 都过期了,那还是需要登录的。
-
Python库 | pyppeteer_fork-0.0.26-py2.py3-none-any.whl
2022-04-02 18:09:06资源分类:Python库 所属语言:Python 资源全名:pyppeteer_fork-0.0.26-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059 -
Python库 | gerapy_pyppeteer-0.0.1-py2.py3-none-any.whl
2022-02-16 11:02:29python库,解压后可用。 资源全名:gerapy_pyppeteer-0.0.1-py2.py3-none-any.whl -
详解pyppeteer(python版puppeteer)基本使用
2020-09-19 07:45:33主要介绍了详解pyppeteer(python版puppeteer)基本使用 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
pyppeteer的一些使用
2022-01-26 11:32:34import pyppeteer print('默认版本是:', pyppeteer.__chromium_revision__) print('可执行文件默认路径:', pyppeteer.chromium_downloader.chromiumExecutable) print('win64平台下载链接为:', pyppeteer....一些默认属性
import pyppeteer print('默认版本是:', pyppeteer.__chromium_revision__) print('可执行文件默认路径:', pyppeteer.chromium_downloader.chromiumExecutable) print('win64平台下载链接为:', pyppeteer.chromium_downloader.downloadURLs) print('chrome启动的默认参数:', pyppeteer.defaultArgs()) print('chrome的安装路径:', pyppeteer.executablePath())
简单使用
import asyncio from pyppeteer.launcher import launch async def main(): browser = await launch(headless=False) # 取当前标签页 page = (await browser.pages())[0] # 新建标签页 # page = await browser.newPage() await page.waitFor(200) await page.goto('https://www.baidu.com/') if __name__ == "__main__": loop = asyncio.get_event_loop() loop.run_until_complete(main())
忽略默认参数
不使用默认参数启动浏览器
await launch(headless=False, ignoreDefaultArgs=True)
不使用默认参数中的–enable-automation启动浏览器
await launch(headless=False, ignoreDefaultArgs=["--enable-automation"])
使用自己安装的谷歌浏览器
await launch(headless=False, executablePath="C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe")
设置页面分辨率
await page.setViewport({'width':1440, 'height':900})
启动浏览器时设置默认的:
await launch(headless=False, defaultViewport={"width":1280, "height": 900})
设置UserAgent
await page.setUserAgent("Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Mobile Safari/537.36")
设置浏览器不自动关闭
autoClose=False
async def main(): browser = await launch(headless=False, autoClose=False) page = (await browser.pages())[0] print(browser.wsEndpoint) await page.waitFor(1000) await page.goto('https://www.baidu.com/') await browser.disconnect()
重新连接已经存在的浏览器
browser.wsEndpoint
from pyppeteer import connect async def main(): # 就是上面的browser.wsEndpoint得到的 wsEndpoint = 'ws://127.0.0.1:4344/devtools/browser/16d6ccc9-d1ee-4c2a-ac03-f662c7ece04f' browser = await connect(browserWSEndpoint=wsEndpoint) page = (await browser.pages())[0] await page.waitFor(200) await page.goto('https://www.weibo.com') await browser.disconnect()
截图
- 整个页面截图
page.screenshot({'path':'screen.png'})
- 某个元素截图
bgImgie = await page.J(".new-box94") await bgImgie.screenshot({'path': "1.png"})
元素截图不准的情况(这篇文章看到的):
注:如果通过 element.screenshot() 元素截图有偏差,这是跟电脑分辨率设置有关。
解决:在显示设置 - 将电脑缩放改为100%执行JavaScript
dimensions = await page.evaluate('''() => { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight, deviceScaleFactor: window.devicePixelRatio, } }''') print(dimensions)
获取标签文本和属性
# 获取id="bgImgie"的标签中src属性的值 # //img[@id="bgImgie"]/@src src = await page.Jeval('img#bgImgie', "node => node.getAttribute('src')") # //*[@class="question"]/text() textContent = await page.Jeval('.question', "node => node.textContent")
获取cookies
cookies = await page.cookies()
设置cookies
await page.setCookie(*cookies) # 刷新网页 await page.reload()
如果是浏览器直接复制的cookie字符串,需转为列表
for i in cookies_str.split(';'): tmp = i.split('=') cookie = {"name": tmp[0].strip(), "value": tmp[1].strip()} cookies.append(cookie)
cookies还有一些其他的值,比如domain、path等,但是只放name和value也是可以用的,需要先访问网站再设置cookie后刷新
鼠标键盘操作
点击标签
await page.click('a#cccccc')
双击
await page.click('a#cccccc', {"clickCount":2})
右键点击
await page.click('a#cccccc',{"button": "right"})
点击坐标
box = await (await page.J('#bgImgie')).boundingBox()
await page.mouse.click(box['x']+box["width"]//2, box['y']+box["height"]//2)
输入文本
page.type('#username', "12345678", {'delay': 50})
鼠标在标签上悬停
await frame.hover('#username')
鼠标按下拖动后松开(可以先悬停)await page.mouse.down() await page.mouse.move(2000, 0, {'delay': 100}) await page.mouse.up()
浏览器启动时访问某个url
async def main(): browser = await launch(headless=False, args=["https://www.baidu.com"]) # 取当前标签页 page = (await browser.pages())[0] await page.waitFor(3000)
使用代理
http代理
browser = await launch(headless=False, args=["--proxy-server=127.0.0.1:10809"])
或者
browser = await launch(headless=False, args=["--proxy-server=http://127.0.0.1:10809"])
socks代理
browser = await launch(headless=False, args=["--proxy-server=socks5://127.0.0.1:10808"])
有密码的代理
async def main(): browser = await launch(headless=False, args=["--proxy-server=http://127.0.0.1:10809"]) # 取当前标签页 page = (await browser.pages())[0] await page.waitFor(500) await page.authenticate({'username': 'python', 'password': '123456'}) await page.waitFor(500) await page.goto("https://www.httpbin.org/ip")
使用带密码的socks5代理会报错
Traceback (most recent call last): File "d:/3.py", line 29, in <module> loop.run_until_complete(main()) File "C:\Anaconda\envs\test\lib\asyncio\base_events.py", line 608, in run_until_complete return future.result() File "d:/3.py", line 16, in main await page.goto("https://www.httpbin.org/ip") File "C:\Anaconda\envs\test\lib\site-packages\pyppeteer\page.py", line 879, in goto raise PageError(result) pyppeteer.errors.PageError: net::ERR_SOCKS_CONNECTION_FAILED at https://www.httpbin.org/ip
已经用requests验证了这个代理是能正常使用, 谷歌搜了一下确实不支持带验证的socks5代理:https://github.com/puppeteer/puppeteer/issues/4170
如果真要使用带验证的socks5代理,可以利用其它工具转成http代理。介绍一下我比较喜欢的一个工具:gost
使用很简单,下载对应的可执行文件,比如Windows就下载 gost-windows-amd64-2.11.1.zip , 在cmd中执行:
gost.exe -L :8686 -F socks5://python:123456@127.0.0.1:12345
,就将socks5://python:123456@127.0.0.1:12345
这个代理转发到了本地的8686端口,如果-L
没有指定http和socks类型,两个都可以使用。
browser = await launch(headless=False, args=["--proxy-server=http://127.0.0.1:8686"])
自动化的话可以用Python执行这个命令,不想要内容输出终端的话可以重定向到文件
清理垃圾
pyppeteer会在
C:\Users\Administrator\AppData\Local\pyppeteer\pyppeteer\.dev_profile
目录生成一些随机名称的文件夹,时间长了占用很大的空间,建议定期删除。这个目录是--user-data-dir
指定的目录,也可以在启动参数里加--user-data-dir=目录
来指定,这样就不会在dev_profile生成一个随机的目录其他系统的目录:
pyppeteer.__pyppeteer_home__ + os.sep + '.dev_profile'
未完待续
没想到还要啥操作,可以评论说说还有啥
- 整个页面截图
-
最新pyppeteer chrome win64位版下载 更新时时间2020-05-18
2020-06-11 11:59:27pypppeteer 最新版chrome浏览器win64位下载 软件更新时间:2020-05-18T11:53:52.335Z -
pyppeteer 滑块验证
2022-03-04 16:17:40#!/usr/bin/python3.9 # -*- coding: UTF-8 -*- ...from pyppeteer import launch import asyncio import cv2 class CrackSlider(object): def __init__(self, username, password, login_url): self.chrome -
pyppeteer + 隧道代理 搭配使用
2022-01-25 17:26:05pyppeteer + 隧道代理 搭配使用 这里不再多介绍pyppeteer的有点和使用方法,直接介绍pyppeteer + 隧道代理 的使用方法 首先定义一个代理函数: def Proxies(): proxyHost = ‘dynamic.xingsudaili.com’ proxyPort =... -
python使用pyppeteer详细教程
2020-04-05 20:29:54文章目录介绍环境部署pip ...注意,讲解的模块叫做 Pyppeteer,不是 Puppeteer。 Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用... -
Pyppeteer 的基本使用方法
2021-01-29 14:55:18要想知道什么是 Pyppeteer,首先应该先了解一下 Puppeteer: Puppeteer 是 Google 基于 Node.js 开发的一个工具,拥有 Puppeteer 即可通过 JavaScript 来控制 Chrome 浏览器的一些操作,也可以用于网络爬虫上,其 ... -
Pyppeteer常用技巧
2021-12-18 21:58:08Pyppeteer常用技巧 绕过检测步骤 第一步 # 在from pyppeteer import launch 导入前,执行下面代码 from pyppeteer import launcher launcher.DEFAULT_ARGS.remove("--enable-automation") from pyppeteer_stealth ... -
Pyppeteer浏览器,从入门到放弃
2021-11-28 16:11:48文章目录1.环境的依赖安装安装chromium,需要外网...与Selenium库相比,Pyppeteer无需繁琐的环境配置,在首次运行时会检测是否按照Chromium,未安装程序会帮我们自动安装和配置。而且Pyppeteer基于Python的新特性async实 -
Pyppeteer API 速查
2020-05-27 21:24:31pyppeteer.launcher.launch(options: dict = None, **kwargs) Launcher(options, **kwargs).launch() pyppeteer.launcher.connect(options: dict = None, **kwargs) Browser Class browserContexts coroutine ... -
Pyppeteer 的简单使用
2019-04-17 09:03:55而 Pyppeteer 和 Selenium 就是用的第三种方法,下面我们再用 Pyppeteer 来试试,如果用 Pyppeteer 实现如上页面的抓取的话,代码就可以写为如下形式: import asyncio from pyppeteer import launch ... -
python爬虫之pyppeteer库
2021-06-12 16:14:02pyppeteer pyppeteer 是非官方 Python 版本的 Puppeteer 库,浏览器自动化库,由日本工程师开发。 Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Chrome 的 API,通过 JavaScript 代码来操纵 Chrome 完成一些...