之前使用selenium的无头浏览器,自从phantomjs2016后慢慢不更新了以后,selenium也开始找下家,这时候谷歌的chrome率先搞出来无头浏览器并开放了各类api,随后firefox也开始作。
如今selenium的测试也都支持这两个浏览器的无头模式了,只须要在引入的时候配置一下就能够了。之因此要采用谷歌chrome官方无头框架puppeteer的python版本pyppeteer,是由于有些网页是能够检测到是不是使用了selenium。而且selenium所谓的保护机制不容许跨域cookies保存以及登陆的时候必须先打开网页而后后加载cookies再刷新的方式很不友好。python
github地址:https://miyakogi.github.io/pyppeteer/git
pyppeteer这个项目是非官方的,是基于谷歌官方puppeteer的python版本。github
注意:原本chrome就问题多多,puppeteer也是各类坑,加上pyppeteer是基于前者的改编python版本,也就是产生了只要前两个有一个有bug,那么pyppeteer就会原封不动的继承下来,原本这没什么,可是如今遇到的问题就是pyppeteer这个项目从18年9月份以后就没更新过了,前二者都在不断的更新迭代,而pyppeteer一直不更新,致使不少bug根本没人修复。web
1)pyppeteer.errors.NetworkError: Protocol error Network.getCookies: Target close
控制访问指定url以后await page.goto(url),会遇到上面的错误,若是这时候使用了sleep之类的延时也会出现这个错误或者相似的time out。
这个问题是puppeteer的bug,可是对方已经修复了,而pyppeteer迟迟没更新,就只能靠本身了,搜了不少人的文章,例如:https://github.com/miyakogi/pyppeteer/issues/171 ,可是我按照这个并无成功。
也有人增长一个函数,但调用这个参数依然没解决问题。chrome
async def scroll_page(page):
cur_dist = 0
height = await page.evaluate("() => document.body.scrollHeight")
while True:
if cur_dist < height:
await page.evaluate("window.scrollBy(0, 500);")
await asyncio.sleep(0.1)
cur_dist += 500
else:
break
能够把python第三方库websockets版本7.0改成6.0就能够了,亲测可用。api
pip uninstall websockets #卸载websockets pip install websockets==6.0 #指定安装6.0版本
2)chromium浏览器多开页面卡死问题
解决这个问题的方法就是浏览器初始化的时候添加’dumpio’:True。跨域
3)浏览器窗口很大,内容显示很小
上面的问题是须要设置浏览器显示大小,默认就是没法正常显示。能够看到页面左侧右侧都是空白,网站内容并无完整铺满chrome.浏览器
browser = await launch({'headless': False,'dumpio':True, 'autoClose':False,'args': ['--no-sandbox', '--window-size=1366,850']}) await page.setViewport({'width':1366,'height':768})
经过上面设置Windows-size和Viewport大小来实现网页完整显示。安全
可是对于那种向下无限加载的长网页这种状况若是浏览器是可见状态会显示不全,针对这种状况的解决方法就是复制当前网页新开一个标签页粘贴进去就正常了websocket
import asyncio from pyppeteer import launch import time async def main():exepath = 'C:/Users/tester02/AppData/Local/Google/Chrome/Application/chrome.exe' browser = await launch({'executablePath': exepath, 'headless': False, 'slowMo': 30}) page = await browser.newPage() await page.setViewport({'width': 1366, 'height': 768}) await page.goto('http://192.168.2.66') await page.type("#Login_Name_Input", "test02") await page.type("#Login_Password_Input", "12345678", ) await page.waitFor(1000) await page.click("#Login_Login_Btn") await page.waitFor(3000) await browser.close() asyncio.get_event_loop().run_until_complete(main())
import asyncio import time from pyppeteer import launch async def gmailLogin(username, password, url): #'headless': False若是想要浏览器隐藏更改False为True # 127.0.0.1:1080为代理ip和端口,这个根据本身的本地代理进行更改,若是是vps里或者全局模式能够删除掉'--proxy-server=127.0.0.1:1080' browser = await launch({'headless': False, 'args': ['--no-sandbox', '--proxy-server=127.0.0.1:1080']}) page = await browser.newPage() await page.setUserAgent( 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36') await page.goto(url) # 输入Gmail await page.type('#identifierId', username) # 点击下一步 await page.click('#identifierNext > content') page.mouse # 模拟真实点击 time.sleep(10) # 输入password await page.type('#password input', password) # 点击下一步 await page.click('#passwordNext > content > span') page.mouse # 模拟真实点击 time.sleep(10) # 点击安全检测页面的DONE # await page.click('div > content > span')#若是本机以前登陆过,而且page.setUserAgent设置为以前登陆成功的浏览器user-agent了, # 就不会出现安全检测页面,这里若是有须要的本身根据需求进行更改,可是仍是推荐先用经常使用浏览器登陆成功后再用python程序进行登陆。 # 登陆成功截图 await page.screenshot({'path': './gmail-login.png', 'quality': 100, 'fullPage': True}) #打开谷歌全家桶跳转,以Youtube为例 await page.goto('https://www.youtube.com') time.sleep(10) if __name__ == '__main__': username = '你的gmail包含@gmail.com' password = r'你的gmail密码' url = 'https://gmail.com' loop = asyncio.get_event_loop() loop.run_until_complete(gmailLogin(username, password, url)) # 代码由三分醉编写,网址www.sanfenzui.com,参考以下文章: # https://blog.csdn.net/Chen_chong__/article/details/82950968