Pyppeteer

目录

1.基本使用

2.理论背景:线程,进程,协程

3.谷歌浏览器的设置与使用(browse closed unexpectedly)

4.一段可以成功运行的代码

5.登陆淘宝

6.cookie设置


1.基本使用

(1)pyppeteer的github官网:https://miyakogi.github.io/pyppeteer/

源代码学习的一点小收获

a)打开chrome的命令结构:subprocess.Popen([谷歌路径,参数],**{'env':None}, shell=True)

b)Popen.poll()检查子进程是否已结束,设置并返回returncode属性。

Popen.poll() is None说明浏览器未关闭或已正常打开,否则说明浏览器异常关闭或没有正常打开

(2)这个帖子讲的很好:http://www.r9it.com/20171106/puppeteer.html

(3)法可以参照puppeteer的github官网,二者用法基本相似:

https://github.com/GoogleChrome/puppeteer/blob/v1.14.0/docs/api.md#

(4)一些问题的解决:http://www.cnblogs.com/baihuitestsoftware/p/10531462.html

(5)有一些不错的操作:https://cloud.tencent.com/developer/article/1388037

(6)忽略https错误

    //如果是访问https页面 此属性会忽略https错误
    ignoreHTTPSErrors: true,

 

2.理论背景:线程,进程,协程

(1)在def前加入async声明,就可以定义一个协程函数
(2)一个协程函数不能直接调用运行,只能把协程加入到事件循环loop中。asyncio.get_event_loop方法可以创建一个事件循环,然后使用run_until_complete将协程注册到事件循环,并启动事件循环。

(3)一些文档

python中yield的用法详解——最简单,最清晰的解释:https://blog.csdn.net/mieleizhi0522/article/details/82142856

Python Async/Await入门指南:http://www.cnblogs.com/dhcn/p/9032461.html
Python黑魔法 --- 异步IO( asyncio) 协程:https://www.jianshu.com/p/b5e347b3a17c

3.谷歌浏览器的设置与使用(browse closed unexpectedly)

(1)下载符合要求的浏览器版本

浏览器好像没有自动下载,暂时没搞清楚,按下面的方法设置的了一下,调用一定要指出路径
puppetter安装就踩坑-解决篇:https://juejin.im/post/5b99c9ece51d450e51625630
浏览器下载后还需设置兼容性和管理员运行,并取消打开确认http://www.xitonghe.com/jiaocheng/Windows10-7809.html
pyppetter调用时要指出路径。通过按照源代码要求设置默认路径后可以直接调用chromium,繁琐麻烦没必要了。

pathtochrome = r'D:\software\chrome-win32\chrome.exe'
browser = await launch({'headless': False, 'args': ['--no-sandbox'], 'executablePath': pathtochrome})

(2)subprocess.Popen(["cat test.txt"])运行报错,subprocess.Popen(["cat test.txt"],shell=True)正确。pyppeteer源代码表述需要修改。launcher.py中找到如下代码

self.proc = subprocess.Popen(  # type: ignore
    self.cmd,
    **options,
)

在里面加一行

self.proc = subprocess.Popen(  # type: ignore
    self.cmd,
    **options,
    shell=True,
)

 (3)将目录下的浏览器打开后安装user agent switcher,设置好后。但是以后调用时不能访问手机页面,怎么访问手机页面还不着调。

4.一段可以成功运行的代码

# coding = uft-8
import asyncio
from pyppeteer import launch

async def main():
    # browser = await launch()
    pathtochrome = r'D:\software\chrome-win32\chrome.exe'
    browser = await launch({'headless':False, 'executablePath':pathtochrome})

    page = await browser.newPage()
    await page.goto('http://example.com')
    await page.screenshot({'path': 'example.png'})
    await browser.close()

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

5.登陆淘宝

https://blog.csdn.net/qq_42196922/article/details/85337709

 

6.cookie设置

async def main(username,pwd,url):
    pathtochrome = r'D:\software\chrome-win32\chrome.exe'
    # await self.page.setViewport({'width': 1080, 'height': 960})
    browser = await launch({'headless': False, 'executablePath': pathtochrome, 'deviceName': 'Nexus 5'})
    page = await browser.newPage()
    await page.setUserAgent(
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36')
    # 读取cookie
    for f in open('taobao.txt', 'r'):
        cookies = json.loads(f)
        await page.setCookie(cookies)
    await page.goto(url)
    time.sleep(20)
    await browser.close()

7.iframe

frame = page.iframe[num]  # num为所需要的frame在所有iframe中的编号

await frame.type('#J_StandardPwd input', pwd, {'delay':10})

8.page.evaluate

8.1  格式

page.evaluate('''js命令''')

JavaScript之查找元素:https://www.cnblogs.com/web-lexi/p/4295206.html

8.2  JS基础

(1)selector:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors

(2)==$0表示当前正在查看的内容,鼠标在F12Element中点到哪一行,后面就会有这个

(3):before和:after是CSS中定义的伪元素,配合content属性,可以在元素的前面或后面插入新元素,content即插入元素的值,

这些添加不会出现在DOM中,不会改变文档内容,不可复制,仅仅是在css渲染层加入。所以不要用:before或:after展示有实际意义的内容,尽量使用它们显示修饰性内容,例如图标。https://blog.csdn.net/weixin_39181833/article/details/79774078

:before和:after的内容没有实际意义

遇到这种情况,直接找到点击后的下一页url,page.goto()该url

(4)定位并点击

await page.evaluate('''() => document.getElementsByClassName("text")[0].click()''')
await page.click(".search-button > button")  # 找到class为search-button的element,并找到其下的button标签执行点击
注:查找的classname 'submit icon-btn-search'这种中间有空格的是不可以的

 

 

 

 

9.pyppeteer.errors.NetworkError: Protocol error Runtime.callFunctionOn: Target closed.

模块安装了websockets 7,卸载后重新安装websockets 6.

 

 

 

 

 

 

 



 

你可能感兴趣的:(python&爬虫)