zoukankan      html  css  js  c++  java
  • python之批量打印网页为pdf文件(二)

      小爬之前的博文《python之批量打印网页为pdf文件(一)》中详细讲述了如何利用python+selenium,然后通过在chrome_options.add_experimental_option('prefs', prefs)配置特定的setting参数,将具体的打印设置参数传递给我们浏览器来实现【批量打印网页为PDF文件】。但是遗憾的是,通过该方式,小爬暂时还未能查到传递【页面】参数 的方法,见下图:

       假如您刚好只想打印页面的某几页为PDF文件,那么这就成了一个不大不小的问题。通过翻阅很多资料,我发现chrome浏览器的实验性方法Page.printToPDF 可以有效解决这个问题,它有如下参数可以设置:

       可以看到,这里面几乎有我们想要传递的所有参数,包括页码(pageRanges:Paper ranges to print, e.g., '1-5, 8, 11-13'. Defaults to the empty string, which means print all pages.),我们必须在chrome浏览器的headless模式下来调用该方法(否则会报错),比如我们只想打印web的第一页内容为PDF文件,下面就是一段程序示例,供参考:

     1 from selenium import webdriver
     2 import json, base64,time
     3 from logon_token import userName,passWord
     4 
     5 def send_devtools(driver, cmd, params={}):
     6   resource = "/session/%s/chromium/send_command_and_get_result" % driver.session_id
     7   url = driver.command_executor._url + resource
     8   body = json.dumps({'cmd': cmd, 'params': params})
     9   response = driver.command_executor._request('POST', url, body)
    10   return response.get('value')
    11 
    12 def save_as_pdf(driver, path, options={}):    
    13   result = send_devtools(driver, "Page.printToPDF", options)
    14   with open(path, 'wb') as file:
    15     file.write(base64.b64decode(result['data']))
    16 
    17 if __name__ =="__main__":
    18   options = webdriver.ChromeOptions()
    19   options.add_argument("--headless")
    20   options.add_argument("--disable-gpu")
    21 
    22   driver = webdriver.Chrome(chrome_options=options)
    23 
    24   '''请求URL,进入登录界面,输入对应用户名密码完成登录,拿到用户权限,然后跳转到我们想要的页面'''
    25   driver.get("Your Login web URL")
    26   driver.execute_script(f'''document.querySelector("#username").value="{userName}";document.querySelector("#password").value="{passWord}";''')
    28   driver.find_element_by_xpath('//*[@id="LoginForm"]/div[4]/button').click()
    29 
    30   driver.get("your final requestUrl")
    31 
    32   time.sleep(2) #如果页面复杂,非静态页面,建议适当给延迟,等待页面彻底加载完成
    33 
    34   save_as_pdf(driver, r'Your fileName for the new pdf file', { 'landscape': True,'pageRanges':'1-1','ignore_invalid_page_ranges':True})

      在浏览器的headless模式下,该方法稳定且高效,各位童鞋不妨一试~~

  • 相关阅读:
    安卓开发中Theme.AppCompat.Light的解决方法
    一个监听事件监听多个按钮
    onCreate中的savedInstanceState有何具体作用
    [转]Bundle对象的使用
    【转】Android详细的对话框AlertDialog.Builder使用方法
    实现按两次返回键退出应用(利用安卓按后退键引发的函数)
    [转]解决eclipse连接不到genymotion的问题
    随笔记录九 进程和计划任务任务管理
    linux引导过程和服务控制
    上机作业三 账号管理
  • 原文地址:https://www.cnblogs.com/new-june/p/15347577.html
Copyright © 2011-2022 走看看