精华内容
下载资源
问答
  • Pyppeteer 使用笔记
    2021-06-21 11:41:02

    Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来控制 Chrome 浏览器的一些操作,当然也可以用作网络爬虫上,其 API 极其完善,功能非常强大。 而 Pyppeteer 又是什么呢?它实际上是 Puppeteer 的 Python 版本的实现,但他不是 Google 开发的,是一位来自于日本的工程师依据 Puppeteer 的一些功能开发出来的非官方版本。

    基础用法

    import asyncio
    from pyppeteer import launch

    async 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 namedtuple

    Response = 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 title

    if 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 asyncio

    def screen_size():
    “”“使用tkinter获取屏幕大小”""
    import tkinter
    tk = tkinter.Tk()
    width = tk.winfo_screenwidth()
    height = tk.winfo_screenheight()
    tk.quit()
    return width, height

    async 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, js5

    def screen_size():
    “”“使用tkinter获取屏幕大小”""
    import tkinter
    tk = tkinter.Tk()
    width = tk.winfo_screenwidth()
    height = tk.winfo_screenheight()
    tk.quit()
    return width, height

    async 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.py

    from retrying import retry # 错误自动重试
    import time, asyncio, random

    def 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 asyncio

    async 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 ...
  • selenium爬虫可能会被检测到,此脚本配合pyppeteer等可以完美绕过~
  • pyppeteer防反爬干扰脚本 selenium爬虫可能会被检测到,此脚本配合pyppeteer等可以完美绕过
  • pyppeteer

    2022-02-19 13:52:46
    pyppeteer官方文档 Puppeteer教程 Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Chrome 的 API,通过 JavaScript 代码来操纵 Chrome 完成一些操作,用于网络爬虫、Web 程序自动测试等,其 API 极其完善,功能...

    Puppeteer

    pyppeteer官方文档
    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))
    

    部署

    Linux安装pyppeteer

    安装 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(’…’),
    ])
     
    
    展开全文
  • win7环境使用eclipse+pydev开发调试python,编写pyppeteer和scrapy爬虫项目的环境搭建步骤。
  • 那么本节就介绍另一个类似的替代品,叫做 PyppeteerPyppeteer简介 注意,本节讲解的模块叫做 Pyppeteer,不是 Puppeteer。Puppeteer 是 Google 基于 Node.js 开发的一个工具,有了它我们可以通过 JavaScript 来...
  • 今天就给大家介绍另一款web自动化测试工具Pyppeteer,虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜selenium。 01.Pyppeteer简介 介绍Pyppeteer之前先说一下Puppeteer,Puppeteer是谷歌...
  • 该项目旨在为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-sizeviewport,代码如下:

    #-*- 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库 所属语言: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
  • 主要介绍了详解pyppeteer(python版puppeteer)基本使用 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • pyppeteer的一些使用

    2022-01-26 11:32:34
    import 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()
    

    截图

    1. 整个页面截图
      page.screenshot({'path':'screen.png'})
    2. 某个元素截图
    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'

    未完待续

    没想到还要啥操作,可以评论说说还有啥

    展开全文
  • pypppeteer 最新版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 + 隧道代理 搭配使用 这里不再多介绍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:08
    Pyppeteer常用技巧 绕过检测步骤 第一步 # 在from pyppeteer import launch 导入前,执行下面代码 from pyppeteer import launcher launcher.DEFAULT_ARGS.remove("--enable-automation") from pyppeteer_stealth ...
  • 文章目录1.环境的依赖安装安装chromium,需要外网...与Selenium库相比,Pyppeteer无需繁琐的环境配置,在首次运行时会检测是否按照Chromium,未安装程序会帮我们自动安装和配置。而且Pyppeteer基于Python的新特性async实
  • Pyppeteer API 速查

    千次阅读 2020-05-27 21:24:31
    pyppeteer.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:02
    pyppeteer pyppeteer 是非官方 Python 版本的 Puppeteer 库,浏览器自动化库,由日本工程师开发。 Puppeteer 是 Google 基于 Node.js 开发的工具,调用 Chrome 的 API,通过 JavaScript 代码来操纵 Chrome 完成一些...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,445
精华内容 978
关键字:

pyppeteer

友情链接: przgrakmingogiented.rar