• 使用python将网页下载为pdf


    背景:即使用 python 实现网页的打印,将网页下载为pdf

    要求

    安装ChromeDriver,并配置环境遍历,版本需要与chrome版本一致

    下载地址:ChromeDriver - WebDriver for Chrome - Downloads (google.com)icon-default.png?t=N7T8https://sites.google.com/chromium.org/driver/downloads代码:

    1. import os,json,time
    2. from selenium import webdriver
    3. from selenium.webdriver.common.keys import Keys
    4. from selenium.webdriver.common.action_chains import ActionChains
    5. def print_url_to_pdf(url, save_root,
    6. file_name='demo.pdf',
    7. scroll_distance=500,
    8. scroll_interval=0.5,
    9. headless=False):
    10. """
    11. save_root: pdf 保存目录,建议绝对路径
    12. file_name:pdf保存名称
    13. scroll_distance:每次向下滑动距离,模拟浏览页面,获得全部页面元素
    14. scroll_interval:滑动一次后,间隔时间
    15. headless:是否可见窗口,True, 不可见;False,可见,调试时可设为可见
    16. """
    17. chrome_options = webdriver.ChromeOptions()
    18. settings = {
    19. "recentDestinations": [{
    20. "id": "Save as PDF",
    21. "origin": "local",
    22. "account": ""
    23. }],
    24. "selectedDestinationId": "Save as PDF",
    25. "version": 2,
    26. "isHeaderFooterEnabled": False,
    27. # "customMargins": {},
    28. # "marginsType": 2,
    29. # "scaling": 100,
    30. # "scalingType": 3,
    31. # "scalingTypePdf": 3,
    32. "isLandscapeEnabled":False,#landscape横向,portrait 纵向,若不设置该参数,默认纵向
    33. "isCssBackgroundEnabled": True,
    34. "mediaSize": {
    35. "height_microns": 297000,
    36. "name": "ISO_A4",
    37. "width_microns": 210000,
    38. "custom_display_name": "A4 210 x 297 mm"
    39. },
    40. }
    41. chrome_options.add_argument('--enable-print-browser')
    42. if headless:
    43. chrome_options.add_argument('--headless') #headless模式下,浏览器窗口不可见,可提高效率
    44. prefs = {
    45. 'printing.print_preview_sticky_settings.appState': json.dumps(settings),
    46. 'savefile.default_directory': save_root #此处填写你希望文件保存的路径
    47. }
    48. chrome_options.add_argument('--kiosk-printing') #静默打印,无需用户点击打印页面的确定按钮
    49. chrome_options.add_experimental_option('prefs', prefs)
    50. driver = webdriver.Chrome(options=chrome_options)
    51. print('-'*100)
    52. print(f'now: url: {url}')
    53. driver.get(url)
    54. # 获取当前所有窗口的句柄
    55. handles = driver.window_handles
    56. # 切换到最后一个窗口(假设最后一个窗口是要操作的窗口)
    57. driver.switch_to.window(handles[-1])
    58. # 获取当前视口的高度
    59. viewport_height = driver.execute_script("return window.innerHeight;")
    60. # 获取滚动条的位置
    61. current_scroll_position = driver.execute_script("return window.scrollY;")
    62. # 定义滚动的距离和间隔时间
    63. # scroll_distance = 200 # 每次滚动的距离
    64. # scroll_interval = 0.5 # 每次滚动的间隔时间(秒)
    65. # 计算需要滚动的次数
    66. num_scrolls = int((driver.execute_script("return document.body.scrollHeight;") - current_scroll_position) / scroll_distance)
    67. print('scroll pages...')
    68. # 循环滚动页面
    69. for _ in range(num_scrolls):
    70. driver.execute_script(f"window.scrollBy(0, {scroll_distance});")
    71. time.sleep(scroll_interval)
    72. # 执行 JavaScript 代码,将页面滚动到底部
    73. driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    74. # 等待页面加载完成
    75. # 添加适当的等待时间或条件,确保页面已完全加载
    76. time.sleep(5)
    77. driver.maximize_window()
    78. #利用js修改网页的title,该title最终就是PDF文件名,
    79. # 利用js的window.print可以快速调出浏览器打印窗口,避免使用热键ctrl+P
    80. path = os.path.join(save_root, file_name)
    81. print(f'save pdf: {path}')
    82. driver.execute_script(f'document.title="{file_name}";window.print();')
    83. driver.close()
    84. def download_urls(url_list, name_list, save_root):
    85. for url, name in zip(url_list, name_list):
    86. print_url_to_pdf(url, save_root, name)
    87. time.sleep(5)
    88. url_list =[
    89. 'https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%B8%82/126069?fromModule=lemma_search-box&fromtitle=%E5%8C%97%E4%BA%AC&fromid=128981',
    90. 'https://baike.baidu.com/item/%E5%A4%A9%E6%B4%A5%E5%B8%82/213824?fromModule=lemma_search-box&fromtitle=%E5%A4%A9%E6%B4%A5&fromid=132308'
    91. ]
    92. name_list = [
    93. 'beijing.pdf', 'tianjin.pdf'
    94. ]
    95. save_root = 'C:\\data'
    96. download_urls(url_list, name_list, save_root)

    headless True时,即不显示窗口,不会下载为pdf(代码能正常运行),这个问题暂时未解决,稍后解决。

  • 相关阅读:
    【Git】git合并分支指定内容到主分支
    【EI会议征稿】第九届能源资源与环境工程研究进展国际学术会议(ICAESEE 2023)
    项目管理工具软件Maven趣闻
    Linux 提权-Docker 容器
    ffmpeg之avformat_alloc_output_context2
    【前端】政务服务大数据可视化监控平台(源码+html+css+js)
    MySQL数据库事务与索引SQL命令语句操作代码
    Ubuntu 安装 Docker 的详细步骤
    推荐几款MySQL图形化客户端管理工具
    【前端性能】性能优化手段-高频面试题
  • 原文地址:https://blog.csdn.net/bailixuance/article/details/133309395