目录
1.基本使用
2.理论背景:线程,进程,协程
3.谷歌浏览器的设置与使用(browse closed unexpectedly)
4.一段可以成功运行的代码
5.登陆淘宝
(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,
(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
(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,设置好后。但是以后调用时不能访问手机页面,怎么访问手机页面还不着调。
# 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()))
https://blog.csdn.net/qq_42196922/article/details/85337709
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()
frame = page.iframe[num] # num为所需要的frame在所有iframe中的编号
await frame.type('#J_StandardPwd input', pwd, {'delay':10})
page.evaluate('''js命令''')
JavaScript之查找元素:https://www.cnblogs.com/web-lexi/p/4295206.html
(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'这种中间有空格的是不可以的
模块安装了websockets 7,卸载后重新安装websockets 6.