python 下载道客巴巴文档

环境准备

首先,我们会使用到selenium这个库,直接用pip安装即可,有关于selenium的使用还需要安装浏览器驱动和配置环境变量,在这里就不过多阐述,很多博客中都有教程。

#直接使用pip安装
pip install selenium

其次,我们还需要一个库img2pdf,它可以帮助我们将多张图片合成为pdf,也是直接使用pip安装即可

#直接使用pip安装
pip install img2pdf

案例分析

今天我们的目标是下载道客巴巴中的文档,但是通过网站我们会发现,道客巴巴是通过html5的canvas元素进行各个文档内容的显示,所以,我们没有办法通过获取页面的源代码来进行解析获取图片。


然后我就想到了使用抓包工具抓取后台返回的图片,很可惜,它返回的是加密文件


到这里,我就想放弃了,但是我突然灵机一动,js好像可以将canvas转为图片并下载到本地,再利用python调用js实现自动化,最后将下载到本地的图片合成转为pdf,这样子不就可以把文档保存到本地了嘛,说干就干。

下载代码实现

  1. 我们需要将我们需要的库给导入进来,以便后续调用,代码如下
from selenium import webdriver
import os
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from lxml import etree
  1. 我们需要指定图片的下载地址,这样子才方便后续对图片进行操作,刚好,selenium可以直接实现这样的操作,代码如下
chromeOptions = webdriver.ChromeOptions()
options = Options()
#获取当前的路径,拼接创建一个我们需要指定下载图片的文件夹
path=os.getcwd()+'\data'
#判断文件夹是否存在,不存在创建文件夹
is_exists = os.path.exists(path)
if not is_exists:os.mkdir(path)
#指定浏览器下载文件夹
prefs = {"download.default_directory": path}
options.add_experimental_option("prefs", prefs)
  1. 我们在进入页面时,需要获取当前文档共有多少页数,页码数可以在网页源代码中直接找到
    如图


所以我们直接利用selenium获取当前的网页源代码,使用xpath解析网页源代码获取页码数

#目标网址
url="https://www.doc88.com/p-549550988532.html"
browser.get(url)
#获取网页源代码
text=browser.page_source
html=etree.HTML(text)
#xpath解析源代码,获取总页码数
page_num=html.xpath("//li[@class='text']/text()")[0]
page_num=int(page_num.replace('/ ',''))
print(f'共{page_num}页')
  1. 网站在加载的时候,并不会将所有的图片一次加载完毕,而是会加载一定的页数,然后读者需要点击继续免费阅读全文才可以将剩余的内容加载出来,如图


因此,我们需要利用selenium的点击操作,在按钮加载出来时,就点击按钮

# #等待网页加载
time.sleep(10)
#等待按钮
element=WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@id='continueButton']")))
element.click()
  1. 接下来就是下载图片啦,我们可以利用selenium调用js的功能
js = "return action=document.body.scrollHeight"
# 初始化现在滚动条所在高度为0
height = 0
# 当前窗口总高度
new_height = browser.execute_script(js)
k=0while k<=page_num:for i in range(height, new_height, 3000):k+=1browser.execute_script('window.scrollTo(0, {})'.format(i))#每移动一定高度,停顿一秒,等待加载time.sleep(1)a = f"download({k}, {k})"# 中间需要手动点一下运行下载多个文件browser.execute_script("""function download(from, to) {for (i = from; i <= to; i++) {const pageCanvas = document.getElementById('page_' + i);if (pageCanvas === null) break;pageNo_ = i >= 10 ? ''+i:'0'+i;const pageNo = pageNo_;pageCanvas.toBlob(blob => {const anchor = document.createElement('a');anchor.download = 'page_' + pageNo + '.png';anchor.href = URL.createObjectURL(blob);anchor.click();URL.revokeObjectURL(anchor.href);});}};""" + a)
  1. 完整代码
from selenium import webdriver
import os
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from lxml import etree
chromeOptions = webdriver.ChromeOptions()
path=os.getcwd()+'\data'
options = Options()
#判断文件夹是否存在,不存在创建文件夹
is_exists = os.path.exists(path)
if not is_exists:os.mkdir(path)#指定浏览器下载文件夹
prefs = {"download.default_directory": path}
options.add_experimental_option("prefs", prefs)
browser = webdriver.Chrome(chrome_options=options)
#指定网页链接url='https://www.doc88.com/p-549550988532.html'
# browser.get('https://www.doc88.com/p-5969904068700.html')  #论文
browser.get(url)
#网页源代码text=browser.page_source
html=etree.HTML(text)
page_num=html.xpath("//li[@class='text']/text()")[0]
#获取总页码数
page_num=int(page_num.replace('/ ',''))
print(f'共{page_num}页')
print(EC.visibility_of_element_located((By.XPATH, "//div[@id='continueButton']")))
# #等待网页加载
time.sleep(10)
#等待按钮
element=WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@id='continueButton']")))
element.click()# browser.find_element_by_xpath("//div[@id='continueButton']").click()js = "return action=document.body.scrollHeight"
# 初始化现在滚动条所在高度为0
height = 0
# 当前窗口总高度
new_height = browser.execute_script(js)
k=0while k<=page_num:for i in range(height, new_height, 3000):k+=1browser.execute_script('window.scrollTo(0, {})'.format(i))time.sleep(1)a = f"downloadPages({k}, {k})"# 中间需要手动点一下运行下载多个文件browser.execute_script("""function downloadPages(from, to) {for (i = from; i <= to; i++) {const pageCanvas = document.getElementById('page_' + i);if (pageCanvas === null) break;pageNo_ = i >= 10 ? ''+i:'0'+i;const pageNo = pageNo_;pageCanvas.toBlob(blob => {const anchor = document.createElement('a');anchor.download = 'page_' + pageNo + '.png';anchor.href = URL.createObjectURL(blob);anchor.click();URL.revokeObjectURL(anchor.href);}//, 'image/jpeg' // (*)//, 0.9          // (*));}};""" + a)
  1. 注意
    在运行代码的时候,浏览器会弹出是否允许下载多个文件,我们需要点击允许,才能将所有的图片都下载下来,目前我还没找到可以自动点击的方法,希望各位大佬可以给点建议哈哈

合成pdf

合成pdf的代码比较简单,直接看注释就好啦

import  img2pdf
import os
# 列出文件夹里面的所有文件名和路径
filepath=os.getcwd()+'\data'
files = os.listdir(filepath)
print(files)
# 排序,防止合并后文件页面乱序
filedict = {int(i.split('.')[0].split('_')[1]):i for i in files}
print(filedict)
files = [filedict[i] for i in sorted(filedict)]
# # 文件名+路径
files = ['./data/'+i for i in files]
print(files)
# # 把所有图片拼接为pdf
with open('./testpdf1.pdf', mode='wb') as f:f.write( img2pdf.convert(files) )

总结

目前,代码基本实现了将图片下载下来并转为pdf的操作,但还存在效率较差,只能是图片转为pdf,实现不了复制等操作,在代码运行中还需要进行点击操作等问题。

python 下载道客巴巴文档相关推荐

  1. 如何免费下载道客巴巴文档

    1.下载安装 稻壳阅读器 http://www.daokeyuedu.com/ 2.找到需要下载的文档,选择用 稻壳阅读器 打开对应文档. 3.点击左上角的"打印",弹出打印对话框 ...

  2. 道客巴巴 文档下载方法

    稻壳阅读器打印下载 稻壳阅读器是一个面向文库的阅读软件,在电脑上安装之后,直接打开,将文库链接复制进去就能快速阅读. 想要保存文档的话,如果是免费文档,直接点击下载按钮,然后就可以直接将文档下载到本地 ...

  3. python 爬取道客巴巴文档_Python常用的几个高效率的爬虫框架

    1.Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.用这个框架可以轻松爬下来如亚马逊商品信息之类的数 ...

  4. 道客巴巴文档下载方案

    1         使用webbrowser控件,打开指定文件. 2         屏幕截取每一页的内容,生成图象. 3         使用iTextSharp,将生成的图象转换为PDF文件. 最 ...

  5. 小试牛刀,自动化操作截屏方式下载道客巴巴文章

    #!/usr/bin/env python # -*- coding: UTF-8 -*- #小试牛刀,自动化操作截屏方式下载道客巴巴文章(基本思路:鼠标点击下一页,然后截屏一次,直到全部页面点完成. ...

  6. python有道自动翻译_python文档自动翻译

    关键方法 提取文档内容 读取TXT文档 txt文档的读取很简单,直接用python自带的open()方法就好,代码如下所示: # 读取TXT文档 def read_txt(path): '''实现TX ...

  7. python下载某网站收费文档(一)——配合fiddler半自动版

    [背景] 一朋友颇感中年危机,今年抓紧时间充电,各种恶补,但是发现很多网站上的资料都是收费的,问我能不能下载下载.本着能帮朋友解决问题,同时练习技术的目的,就答应尝试写下. [目标] 下载http:/ ...

  8. 学习笔记100—强制免费下载 百度文库等网站上文档 以及客道巴巴文档 教程

    一.百度文库,豆丁.丁香.畅享.MBALib.Book118等文库文档下载 用冰点软件,将自己想要下载的链接复制到冰点软件中,即可下载,软件下载链接:http://www.bingdian001.co ...

  9. 2023 最新一键下载百度网盘/阿里云盘/百度文库/道客巴巴/原创力文档

    苏生不惑第415 篇原创文章,将本公众号设为星标,第一时间看最新文章. 之前分享过录制了个视频:2022年11月一键下载百度网盘/百度文库/豆丁/道客巴巴/原创力文档 ,2023年再更新下 . 爱奇艺 ...

最新文章

  1. Django学习笔记(5)---ForeignKey
  2. python爬取app中的音频_Python爬取抖音APP,只需要十行代码
  3. python 复制文件_python 复制文件
  4. python 代理服务器_Python实现HTTP代理服务器
  5. 2020年上半年美团夜宵指数发展报告
  6. JEECG社区第六期架构培训班报名
  7. #react 之ant design Pro 学习研究#----启动项目
  8. virtual关键字
  9. 陶哲轩实分析 定理 13.4.6
  10. Dubbo分析之Registry层
  11. bootdo增加验证码登陆
  12. 世界品牌新500强揭晓 中国移动央视海尔入前百名
  13. 计算机u盘装系统,教你u盘装系统教程
  14. python调用photoshop_Python和Photoshop
  15. html仿写网易云音乐人页面,vue模仿网易云音乐的单页面应用
  16. Python常用开发软件有哪些?
  17. 使用国内的镜像源搭建 kubernetes(k8s)集群
  18. 如何预防网站的DDos攻击?
  19. MySQL创建无符号整数(int)及取值范围
  20. 如何查杀stopped进程

热门文章

  1. 云码课堂的Java帮到了我,更感谢我自己
  2. MATLAB---csape斜率拟合
  3. MathJax基础教程笔记
  4. ssm+JSP计算机毕业设计尤文图斯足球俱乐部网上商城系统05hc1【源码、程序、数据库、部署】
  5. Arduino版简单的DS1307程序
  6. 移动Web(rem less Vw/Vh/bootstra)
  7. DS1307驱动代码
  8. HFSS-API入门第二弹:基本形状和操作
  9. 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档 的处理方法...
  10. 如何修改rk3399 ddr初始化代码的波特率