Python实现网页截图(PyQT5)过程解析

  

<强>方案说明
  

  

功能要求:实现网页加载后将页面截取成长图片
  

  

涉及模块:PyQT5公益诉讼
  

  

<强>逻辑说明:

  

1:完成窗口设置,利用PyQT5 QWebEngineView加载网页地址,待网页加载完成后,调用check_pag;
  

        类主窗口(QMainWindow):   def __init__(自我,父=None):   超级(主窗口,自我). __init__(父)   self.setWindowTitle(“易哈佛”)   自我。temp_height=0   self.setWindowFlag (Qt。WindowMinMaxButtonsHint, False) #禁用最大化,最小化   # self.setWindowFlag (Qt。WindowStaysOnTopHint, True) #窗口顶置   self.setWindowFlag (Qt。FramelessWindowHint, True) #窗口无边框   def urlScreenShot(自我、url):   自我。浏览器=QWebEngineView ()   self.browser.load (QUrl (url))   几何=self.chose_screen ()   self.setGeometry(几何)   self.browser.loadFinished.connect (self.check_page)   self.setCentralWidget (self.browser)   def get_page_size(自我):   .contentsSize大?self.browser.page () ()   自我。set_height=size.height ()   自我。set_width=宽度()   返回的宽度(),size.height ()   def chose_screen(自我):   宽度,高度=750,1370   桌面=QApplication.desktop ()   screen_count=desktop.screenCount ()   因为我在范围(0,screen_count):   矩形=desktop.availableGeometry(我)   rect.height s_width s_height=rect.width () ()   如果s_width比;宽度和s_height祝辞高度:   返回QRect (rect.left (), rect.top(),宽度、高度)   返回QRect(0, 0,宽度、高度)   if __name__==癬_main__”:   应用=QApplication (sys.argv)   赢得=主窗口()   win.show ()   app.exit (app.exec_ ())      

2:收集页面高度,并计算分次截屏的次数和余量高度;实例化图片合并工具,设置定时器,超时信号发出后,执行exe_command;
  

        def check_page(自我):   p_width p_height=self.get_page_size ()   自我。页面中,自我。over_flow_size=divmod (p_height self.height ())   如果自我。==0页:   自我。页面=1   自我。舰导弹=ScreenShotMerge(自我。页面,self.over_flow_size)   自我。计时器=QTimer(自我)   self.timer.timeout.connect (self.exe_command)   self.timer.setInterval (400)   self.timer.start ()      

3: exe_command用来控制截图次数,并在每次截图完成后控制网页向下滑屏幕的高度,所有的页面都已截取时,完成图片合并。
  

        def exe_command(自我):   如果自我。页面比;0:   self.screen_shot ()   self.run_js ()   elif自我。页& lt;0:   self.timer.stop ()   self.ssm.image_merge ()   self.close ()   elif自我。over_flow_size祝辞0:   self.screen_shot ()   自我。页=1   def run_js(自我):   脚本=" "   var滚动=函数(dHeight) {   var t=document.documentElement.scrollTop   var h=document.documentElement.scrollHeight   dHeight=dHeight | | 0   当前=t + dHeight var   如果(目前在h) {   窗口。document.documentElement.clientHeight scrollTo (0)   其他}{   窗口。scrollTo(0,电流)   }   }   ”“”   脚本命令=+ ' \ n滚动({}).format (self.height ())   self.browser.page () .runJavaScript(命令)      

4: screen_shot在每次截图完成后将图片保存,并将图片对象由图片合并根据保存到列表中。
  

        def screen_shot(自我):   屏幕=QApplication.primaryScreen ()   winid=self.browser.winId ()   照片=screen.grabWindow (int (winid))   name=' {}/temp.png ' .format (self.ssm.root_path)   pix.save(名字)   self.ssm.add_im(名字)      

5:截图合并工具,在每次截图完成后将图片对象保存,完成余量截图的重绘和截图的合并。
  

        类ScreenShotMerge ():   def __init__(自我,页面,over_flow_size):   自我。im_list=[]   自我。页面=自我。over_flow_size=over_flow_size   self.get_path ()      def get_path(自我):   自我。root_path=路径(__file__) .parent.joinpath(临时的)   如果不是self.root_path.exists ():   self.root_path.mkdir(父母=True)   自我。save_path=self.root_path.joinpath (“merge.png”)      def add_im(自我、路径):   如果len (self.im_list)==self.page:   我=self.reedit_image(路径)   其他:   我=Image.open(路径)   im.save (“{}/{} . png”.format(自我。root_path, len (self.im_list) + 1))   self.im_list.append (im)      def get_new_size(自我):   max_width=0   total_height=0   #计算合成后图片的宽度(以最宽的为准)和高度   img的self.im_list:   宽度,高度=img.size   如果宽度比;max_width:   max_width=宽度   total_height +=身高   返回max_width total_height      def image_merge(自我):   如果len (self.im_list)比;1:   max_width total_height=self.get_new_size ()   #产生一张空白图   new_img=形象。新(RGB, (total_height max_width - 15日),255年)   x=y=0   img的self.im_list:   宽度,高度=img.size   new_img。粘贴(img (x, y))   y +=身高   new_img.save (self.save_path)   打印(“截图成功:“,self.save_path)   其他:   obj=self.im_list [0]   宽度,高度=obj.size   左、上、右、下=0,0,宽度、高度   盒=(左,上,右,下)   地区=obj.crop(盒)   new_img=形象。新(RGB,(宽度、高度),255)   new_img。粘贴(地区、盒)   new_img.save (self.save_path)   打印(“截图成功:“,self.save_path)      def reedit_image(自我、路径):   obj=Image.open(路径)   宽度,高度=obj.size   左、上、右、下=0,高度——自我。over_flow_size、宽度、高度   盒=(左,上,右,下)   地区=obj.crop(盒)   返回地区

Python实现网页截图(PyQT5)过程解析