当前位置: 首页 > 后端技术 > Python

cefpython3调用浏览器示例(qbit)

时间:2023-03-25 21:28:40 Python

介绍ChromiumEmbeddedFramework(CEF)是一个基于GoogleChromium项目的开源Web浏览器控件,支持Windows、Linux、Mac平台。CEFPython为CEF提供Python绑定。cefpython3并没有完全实现CEF的所有接口。CefSharp密切关注CEF的实施。如果您熟悉Python和C#,CefSharp是更好的选择。示例访问并保存网页本节代码主要参考:https://github.com/righthandabacus/stealweb/blob/master/fakechrome.py#encoding:utf-8#author:qbit#date:2020-02-02#summary:使用cefpython访问qbit专栏首页,并将网页保存到source.htmlimportosimportsysimportthreadingimporttimefromloguruimportloggerfromcefpython3importcefpythonascef#发生异常时关闭CEF进程sys.excepthook=cef.ExceptHookclassClientHandler(object):r"""自定义客户端处理程序"""def__init__(self,chromeObject):self.chrome=chromeObjectdefGetViewRect(self,rect_out,**kwargs):r"""渲染界面"""#[x,y,width,height]rect_out.extend([0,0,self.chrome.width,self.chrome.height])returnTruedefOnConsoleMessage(self,browser,message,**kwargs):r"""浏览器控制台界面"""self.chrome.console.append(message)defOnLoadError(self,browser,frame,error_code,failed_url,**_):self.chrome.ready=error_codeself.chrome._getReadyLock.acquire()self.chrome._getReadyLock.notify()self.chrome._getReadyLock.release()defOnLoadingStateChange(self,browser,is_loading,**kwargs):r"""加载接口,当浏览器加载状态变化时调整使用"""ifis_loading:#加载中self.chrome.ready=Falselogger.info('Loading...')else:#加载完成self.chrome.ready=Trueself.chrome._getReadyLock.acquire()self.chrome._getReadyLock.notify()self.chrome._getReadyLock.release()logger.info('Loaded.')classClient(object):def__init__(self,width=1920,height=1080,headless=False):self.width=宽度self.height=高度self.headless=headlessself.console=[]self.browser=Noneself.source=Noneself.domArray=Noneself.windowParams=Noneself.ready=Trueself._getSourceLock=threading.Condition()自我._getDOMLock=threading.Condition()self._getReadyLock=threading.Condition()self._handler=ClientHandler(self)settings={'user_agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)'\'AppleWebKit/537.36(KHTML,likeGecko)'\'Chrome/64.0.3282.140Safari/537.36',#"debug":True,#Debugmode#"log_severity":cef.LOGSEVERITY_INFO,#Logoutputlevel#"log_file":"debug.log",#设置日志文件#"user_agent":"fromstonejianbu0.0.1",}switches={#取消获取媒体流(如音视频数据),必须用空字符串表示否!~~~~#"enable-media-stream":"",#"proxy-server":"socks5://127.0.0.1:10808",#设置代理#"disable-gpu":"",#Set渲染方法CPU或GPU}ifself.headless:settings['windowless_rendering_enabled']=Truecef.Initialize(settings=settings,switches=switches)def__getattr__(self,name):r"""将所有未知的属性和方法传递给CEF浏览器"""returngetattr(self.browser,name)defgetBrowser(self):ifself.browser:returnself.browser#创建浏览器实例如果self.headless:parent_handle=0wininfo=cef.WindowInfo()wininfo.SetAsOffscreen(parent_handle)self.browser=cef.CreateBrowserSync(window_info=wininfo)否则:self.browser=cef.CreateBrowserSync()self.browser.SetClientHandler(self._handler)self.browser.SendFocusEvent(True)self.browser.WasResized()#这个方法应该在headless模式下至少被调用一次returnselfdefLoadUrl(self,url,synchronous=False):r"""Pass浏览器的URL"""logger.info('LoadUrl%s...'%url)self.ready=Falseself.browser.LoadUrl(url)ifsynchronous:#同步方法self._getReadyLock.acquire()if不是self.ready:self._getReadyLock.wait()self._getReadyLock.release()defgetSource(self,synchronous=False):r"""返回主框架的html源码,"""self.source=Noneself.browser.GetMainFrame().GetSource(self)ifsynchronous:self._getSourceLock.acquire()ifnotself.source:#等待Visit函数准备好source的通知self._getSourceLock.wait()self._getSourceLock.release()returnself.sourcedefVisit(self,value):r"StringVisitorinterface"self.source=valueself._getSourceLock.acquire()self._getSourceLock.notify()self._getSourceLock.release()defBrowserThread(browser):r"""线程入口函数"""browser.ready=Falsebrowser.LoadUrl(url,True)#True调用logger.info('Writesourcetosource.html...')withopen('source.html',mode='w',encoding='utf8')assrcfp:source=browser.getSource(True)#同步获取assert(source)srcfp.write(源)browser.CloseBrowser()if__name__=='__main__':url=r'http://sf.gg/blog/qbit'browser=Client(width=640,height=480).getBrowser()browserThread=threading.Thread(target=BrowserThread,args=(browser,))browserThread.start()cef.MessageLoop()browserThread.join()browser=Nonecef.Shutdown()引入jQuery本节代码主要参考:Cefsharpwinforms:Injectjqueryintopage获取本节代码主要参考:PythonGUI:cefpython3禁用图片的简单分析与应用本节代码主要参考:如何在CEF/JCEF中禁用图片加载?保存图片csharp)用CefSharp开发浏览器,可以抓取网站上的任何资源。本文来自qbitsnap