免责声明:本次实践不含有商业成分,不存在商业目的。

图片,批量下载,再合成PDF

使用多线程,提速下载,一气呵成

获取PDF,真就如同探囊取物

代码如下:(皮皮用的是Python3)(使用Python2至少需要在多线程部分进行修改)

import requests
import threading
import os
import img2pdf# 脚本爬取的目标是雨课堂的图片,目前只爬取一个PPT的所有图片,然后合成PDF
# 注意运行脚本时,cookie和UA已经替换成有效的,且必需连网
headers = {'Cookie':     '_ga=你的cookie;''sensorsdata2015jssdkcross=你的cookie;''django_language=你的cookie;''JG_fcdf8e635093adde6bef42651_PV=你的cookie;''login_type=你的cookie;''csrftoken=你的cookie;''sessionid=你的cookie','User-Agent': '你的UA伪装'
}
def WinPathToLinuxPath(p):ll = p.split('\\')  # delete the '\' of pathlinux_path = '/'.join(ll)  # add the '/' into path# 判断文件夹结尾判断有没有'/'if linux_path[-1].__eq__('/'):return linux_pathelse:return linux_path+'/'
def downLoad(response, i, path_, path_2_):print('正在下载第'+str(i+1)+'张图片', end='\r', flush=True)pic = requests.get(url=response[i]['cover'], headers=headers).content# 都用三个数字来命名,位数不足的在前面补零。如果不这样做,合成出的pdf可能页面顺序不对if i<9:name = path_+'00'+str(i+1)+'.jpeg'elif i<99:name = path_+'0'+str(i+1)+'.jpeg'else:name = path_+str(i+1)+'.jpeg'with open(name, "wb") as f:f.write(pic)f.close()if response[i]['problem'] is not None:  # 保存那些作为题目发送的PPT页面的答案with open(path_2_+'课堂练习答案.txt', "a") as f:f.write(str(response[i]['index'])+str(response[i]['problem']['content']['answer'])+'\n')f.close()
def get_YuKeTang_pic(path_, path_2_, xhr_url_):url_ = xhr_url_.split('?')[0]param = {'presentation_id': xhr_url_.split('?')[1].split('&')[0].split('=')[1],'lesson_id':       xhr_url_.split('?')[1].split('&')[1].split('=')[1]}response = requests.get(url=url_, params=param, headers=headers).json()with open(path_2_+'课堂练习答案.txt', "a") as f:ppt_name = response['data']['presentation']['title']  # 获取PPT的名称,用作PDF的名称f.write(ppt_name+'\n')f.close()response = response['data']['slides']threads = []  # 使用多线程for i_ in range(len(response)):t = threading.Thread(target=downLoad, args=(response, i_, path_, path_2_))# target参数指向目标函数,args参数传入该函数所需的参数t.start()threads.append(t)for t in threads:  # 等待所有的线程都运行完t.join()return ppt_name
def picToPDF(picPath_,pdfPath_,name_):# 1、生成地址列表photo_list = os.listdir(picPath_)photo_list = [os.path.join(picPath_,i) for i in photo_list]# 2、指定pdf的单页的宽和高,单位'mm'或'px'# 一像素大约等于0.35毫米category = input('指定单位:')width = int(input('指定pdf的单页的宽:'))high = int(input('指定pdf的单页的高:'))if category=='mm':passelif category=='px':width=int(0.35*width)high=int(0.35*high)a4inpt = (img2pdf.mm_to_pt(width), img2pdf.mm_to_pt(high))layout_fun = img2pdf.get_layout_fun(a4inpt)# 3、生成pdf文件with open(pdfPath_+name_+'.pdf', 'wb') as f:f.write(img2pdf.convert(photo_list, layout_fun=layout_fun, rotation=img2pdf.Rotation.ifvalid))f.close()# 【img2pdf.convert参数rotation=img2pdf.Rotation.ifvalid】# 使用rotation=img2pdf.Rotation.ifvalid是因为之前出现过如下报错【非必要时该参数可不加】# img2pdf.ExifOrientationError: Invalid rotation (0): use --rotation=ifvalid or rotation=img2pdf.Rotation.ifvalid to ignore# 【参考链接】https://github.com/ocrmypdf/OCRmyPDF/issues/894【img2pdf.ExifOrientationError很容易修复】
if __name__=='__main__':print('input the path of Windows:', end='')  # 输入保存图片的文件夹的路径winPath = input()path = WinPathToLinuxPath(winPath)  # 格式化这个路径print('input the path_2 of Windows:', end='')  # 输入另一个路径,用来保存一个txt文件winPath = input()path_2 = WinPathToLinuxPath(winPath)  # 格式化这个路径print('input the url:', end='')xhr_url = input()ppt_name_ = get_YuKeTang_pic(path, path_2, xhr_url)print('是否需要立刻合成PDF?', end='')  # 询问是否需要立刻合成PDFjudge = input()if judge=='YES':print('input the pdf path of Windows:', end='')winPath = input()pdfPath = WinPathToLinuxPath(winPath)  # 格式化这个路径picToPDF(path, pdfPath, ppt_name_)

看一下皮皮的输入示例:

input the path of Windows:C:\Users\x\Desktop\pic
input the path_2 of Windows:C:\Users\x\Desktop
input the url:https://www.yuketang.cn/api/v3/lesson-summary/student/presentation?presentation_id=******&lesson_id=******
是否需要立刻合成PDF?YES
input the pdf path of Windows:C:\Users\x\Desktop\pdf
指定单位:px
指定pdf的单页的宽:1280
指定pdf的单页的高:960

这里面的URL,是雨课堂网站里抓包复制来的,

只抓取PPT打开的一瞬间的那个Ajax请求就可以

对于小白来说,这100多行的代码里,有一些方法可能没学过,比如:

怎样将win路径转化为Linux路径?

怎样用Python语句索引json文件中的值?

怎样使用多线程?

怎样等待所有线程运行完毕之后再运行之后的代码?

怎样将大量的图片合成一个PDF?

皮皮把之前学习过的一些链接放在下面,也许能提供一些帮助

python怎么索引json中的值https://blog.csdn.net/weixin_39779537/article/details/111443084多线程实现多任务节省工作时长https://blog.csdn.net/qq_41604569/article/details/129802437如何使python中线程等待其他线程完了再执行https://blog.csdn.net/weixin_39589455/article/details/126809443python下将图片合成PDFhttps://blog.csdn.net/weixin_42081389/article/details/100734926

【Python代码实践】使用Python批量获取雨课堂图片相关推荐

  1. 莫烦Python代码实践(一)——Q-Learning算法工程化解析

    提示:转载请注明出处,若本文无意侵犯到您的合法权益,请及时与作者联系. 莫烦Python代码实践(一)--Q-Learning算法工程化解析 声明 一.Q-Learning算法是什么? 二.Q-Lea ...

  2. Python 免费代理ip的批量获取

    Python 免费代理ip的批量获取 简介 网络爬虫的世界,向来都是一场精彩的攻防战.现在许多网站的反爬虫机制在不断的完善,其中最令人头疼的,莫过于直接封锁你的ip.但是道高一尺魔高一丈,在爬取网页的 ...

  3. python代码图片头像_60行Python代码一键拼出你的微信好友图片墙!

    原标题:60行Python代码一键拼出你的微信好友图片墙! 源 /高级农民工文 /苏克1900 近 2000 位好友的头像拼图,有没有犯密集恐惧症?这并不震撼,如果你有 5000 位好友的话,做出来的 ...

  4. pythonencoding etf-8_etf iopv python 代码30个Python常用小技巧

    1.原地交换两个数字x, y =10, 20 print(x, y) y, x = x, y print(x, y) 10 20 20 10 2.链状比较操作符n = 10 print(1 print ...

  5. 用Python代码自己写Python代码,竟如此简单

    用Python代码自己写Python代码,竟如此简单 Python作为一门功能强大且使用灵活的编程语言,可以应用于各种领域,具有"无所不能"的特质. Python甚至可以代替人,自 ...

  6. python爬虫下载链接_【Python项目】简单爬虫批量获取资源网站的下载链接

    简单爬虫批量获取资源网站的下载链接 1 由来 自己在收集剧集资源的时候,这些网站的下载链接还要手动一个一个复制到百度云离线下载里,稍微懂了一点编程就不想做这种无意义的劳动了.于是就写了一个这样的一个小 ...

  7. python抠图精确到发丝_别再用PS了,我用五行Python代码就实现了批量抠图

    对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图.不过对于一些比较复杂的图,有时候还是需要花点时间的,今天就给大家带了一个非常快速简单的办法,用Python来批量抠 ...

  8. python抠图_别再用PS了,我用五行Python代码就实现了批量抠图

    对于会PhotoShop的人来说,抠图是非常简单的操作了,有时候几秒钟就能扣好一张图.不过对于一些比较复杂的图,有时候还是需要花点时间的,今天就给大家带了一个非常快速简单的办法,用Python来批量抠 ...

  9. python读取html中body_python批量获取html内body内容的实例

    现在有一批完整的关于介绍城市美食.景点等的html页面,需要将里面body的内容提取出来 方法:利用python插件beautifulSoup获取htmlbody标签的内容,并批量处理. # -*- ...

最新文章

  1. jsp获取连接池的实时连接数_PHP进阶教程-实现一个简单的MySQL连接池
  2. vs程序生成后找不到exe文件
  3. 【Android】Uri、UriMatcher、ContentUris详解
  4. FFMPEG结构体分析
  5. Java中的传值与传引用
  6. ERROR: cuda_runtime_api.h: No such file or directory
  7. 工信部回应“网传4G降速”:从未要求运营商降速
  8. ylbtech_dbs_article_五大主流数据库模型
  9. Android编程之SparseArrayE详解 Android编程之SparseArrayE详解
  10. HDU 5510 Bazinga(kmp)
  11. Python第十六课(模块3)
  12. vue 及sass安装
  13. 重新组织和重新生成索引sp_RefreshIndex
  14. Vue 中的计算属性,方法,监听器
  15. 【Lintcode】1880. Largest Number X Which Occurs X Times
  16. 部分电商平台为防止爬虫竟然这样做?
  17. ps导出gif+html,ps怎么导出gif格式的动图
  18. Python backtrader回测之布林带策略
  19. dos命令实现循环求和
  20. 海康威视真是太恶心了

热门文章

  1. android 表情键盘切换,如何在键盘之间切换(从表情符号到qwerty,反之亦然)
  2. 设置网页宽高的比例为16:9
  3. 小技巧 - 如何将“比例比例”站上的视频下载到本地?
  4. C#实现贝塞尔曲线的算法
  5. 关于kali Linux缺少pyrit或者pyrit无法定位的问题
  6. @PostConstruct与afterPropertiesSet
  7. 谈谈我在PyTorch踩过的12坑
  8. HHDBCS及HHDESK的资源加密功能
  9. Axure RP Extension for Chrome的安装
  10. 『R语言Python』建模前的准备:连续型与离散型变量探索,离散型变量转为虚拟变量