作为一个业余爱好者,一直在CSDN学习,终于有机会也来写一篇记录一下这两天的成果。
最近因为网课上线,教育部公开了义务教育用书的电子版本,出于好奇打开看了看,看网站上不仅可以在线观看,还能够下载,于是下载两本看看。细看这次提供的教材挺多的,就想收集一下备用,但是一个个的下载实在太麻烦了,于是想起来利用Python应该能实现批量下载的。于是乎动手操作,先查资料。下载地址:https://bp.pep.com.cn/jc/
首先感谢—zhiang张的文章: https://blog.csdn.net/jonathanzh/article/details/78630587
经过简单的修改,实现了下载功能。
下面是第一次完成的代码,可以实现下载功能:

import urllib.request
import re
import os# open the url and read
def getHtml(url):page = urllib.request.urlopen(url)html = page.read()page.close()return htmldef getUrl(html):# 此处reg是利用正则表达式获取含有'.pdf'的链接reg = 'href="(.*\w\.pdf)"'url_re = re.compile(reg)url_lst = url_re.findall(html.decode('UTF-8'))return(url_lst)def getFile(url):file_name = url.split('/')[-1]u = urllib.request.urlopen(url)f = open(file_name, 'wb')block_sz = 8192while True:buffer = u.read(block_sz)if not buffer:breakf.write(buffer)f.close()print ("Sucessful to download" + " " + file_name)root_url = 'http://bp.pep.com.cn/jc/yjcz'  #下载地址中相同的部分html = getHtml(raw_url)
url_lst = getUrl(html)if not os.path.exists('pdf_download') : #文件夹不存在时,再进行创建os.mkdir('pdf_download')
os.chdir(os.path.join(os.getcwd(), 'pdf_download'))for url0 in url_lst[:]:url = re.sub('\A\.', '', url0)url = root_url + url  # 形成完整的下载地址getFile(url)

虽然相面的代码可以运行,但是获得的文件是”P020200210116270366430.pdf“这种命名方式,如果手动重命名文件也比较麻烦,因此先通过抓取课本名称,然后再给文件重命名的方式对文件进行处理。
修改后的代码如下:

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
import os# open the url and read
def getHtml(url):page = urlopen(url)html = page.read()page.close()return htmldef getUrl(html):reg = 'href="(.*\w\.pdf)"'url_re = re.compile(reg)url_lst = url_re.findall(html.decode('UTF-8'))return(url_lst)def getFile(url,i):file_name = url.split('/')[-1]u = urlopen(url)f = open(file_name, 'wb')block_sz = 8192while True:buffer = u.read(block_sz)if not buffer:breakf.write(buffer)f.close()print("Sucessful to download" + " " + file_name)# 新增重命名操作title = title_lst[i]dir1 = 'F:\\DOC\\Project\\2020\\pdf_download0\\' + file_namedir2 = 'F:\\DOC\\Project\\2020\\pdf_download0\\' + title.get_text() + '.pdf'if os.path.exists(dir1):os.rename(dir1, dir2)# os.rename(file_name, title)print ("下载成功:" + " " + title.get_text() + '.pdf')root_url = 'http://bp.pep.com.cn/jc/yjcz'  #下载地址中相同的部分html = getHtml(raw_url)
url_lst = getUrl(html)file_url = urlopen(root_url)
bsobj = BeautifulSoup(file_url, 'lxml')
title_lst = bsobj.findAll({"h6"})if not os.path.exists('pdf_download0') : #文件夹不存在时,再进行创建os.mkdir('pdf_download0')
os.chdir(os.path.join(os.getcwd(), 'pdf_download0'))for i in range(len(title_lst)):url = re.sub('\A\.', '', url_lst[i])url = root_url + url  # 形成完整的下载地址getFile(url, i)

为了获取课本名称引入了BeautifulSoup,比较冗余……
其实这里通过正则表达式应该也可以获取到课本名称的,不过试了几次没成功,所以改用了finaAll()函数来实现这个功能。
通过各种学习,有增加了一些爬虫应该有的内容,优化了一些冗余的部分,又形成了第三个版本……当然还是不够完美……还有可以优化的地方,还请大神们多指教。
第三版代码如下:

from bs4 import BeautifulSoup
from urllib.request import urlopen, Request
import re
import os
import time
from fake_useragent import UserAgent# 获取下载地址和文件名称
def getUrl(url_head):ua = UserAgent()# 请求头headers = {"User-Agent": ua.random}# 请求网址response = Request(url=url_head, headers=headers)print(response.headers)html = urlopen(response)print('html:', html)bsobj = BeautifulSoup(html, 'lxml')url_list = bsobj.findAll(name='a', attrs={"href": re.compile('.pdf$')})title_list = bsobj.findAll({"h6"})return url_list,  title_listdef getFile(url, one_name):file_name = url.split('/')[-1]u = urlopen(url)f = open(file_name, 'wb')block_sz = 8192while True:buffer = u.read(block_sz)if not buffer:breakf.write(buffer)f.close()print("原文件下载成功:" + " " + file_name)# 新增重命名操作dir1 = file_path + file_name  # 优化了文件路径dir2 = file_path + one_name + '.pdf'if os.path.exists(dir1):os.rename(dir1, dir2)elif os.path.exists(dir2):print('%s 文件已存在!' % dir2)else:print('%s 下载失败!' % dir1)# os.rename(file_name, title)print("下载成功:" + " " + one_name + '.pdf')time.sleep(30)if __name__ == '__main__':# 下载地址中相同的部分root_url = 'http://bp.pep.com.cn/jc/yjcz'  # 义务教育初中教材下载地址# root_url = 'http://bp.pep.com.cn/jc/ptgzjks'  # 普通高中教材下载地址file_path = 'F:\\DOC\\Project\\2020\\pdf_download0\\'print('文件保存地址:', file_path)if not os.path.exists(file_path):  # 文件夹不存在时,再进行创建os.mkdir(file_path)print('文件夹 %s 新建成功!' % file_path)os.chdir(os.path.join(os.getcwd(), file_path))url_lst, title_lst = getUrl(root_url)print('获取地址和文件名成功!')print('准备开始下载文件!')for i in range(len(title_lst)):url = re.sub('\A\.', '', url_lst[i].get('href')) # 获得的下载地址是'./'开头的,需要进行修剪url = root_url + url  # 形成完整的下载地址title = title_lst[i].get_text()print('下载地址:', url)getFile(url, title)print('**********开始下一循环**********')print('全部文件下载完成!')

至此经过两天的摸索和修改,终于能够实现最初的目的了。
由于没全面的学习爬虫知识,因此踩了几个坑,特别是正则表达式写不好,获取不到想要的内容。对于以上代码肯定还存在很多可以优化的地方,还请大神们多指教!

小白,写第一篇文章,还是比较忐忑的……
希望能对各位学习者有所帮助,在CSDN里共同进步!

利用Python批量下载学生PDF教材相关推荐

  1. 利用python 批量下载美拍视频

    前些日子写了一个利用Python批量下载微博配图的程序,因为是基于微博的移动端,即weibo.cn  ,难度要小很多.而当我面对美拍时却发现,好像有点困难啊. 美拍的页面有很多动态元素,当我们打开某一 ...

  2. 利用python批量下载美拍视频

    前些日子写了一个利用python批量下载微博配图的程序,因为是基于微博的移动端,即weibo.cn  ,难度要小很多.而当我面对美拍时却发现,好像有点困难啊. 美拍的页面有很多动态元素,当我们打开某一 ...

  3. 利用Python批量下载必由学答题卡

    零.序言 在期末语文考试结束后,班主任老师想要下载一些高分作文的答题卡,但人工操作下载一张张答题卡是一个费时费力还会出现很多失误的工作,所以笔者决定尝试利用Python编写程序解决该问题. 一.分析目 ...

  4. 利用Python批量下载自己喜欢听得音乐

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 音乐是生活的调剂品,目前很多的音乐只能播放不能下载.生为技术员的我们,怎么甘 ...

  5. python怎么批量下载年报_使用Python批量下载Wind数据库中的PDF报告

    原标题:使用Python批量下载Wind数据库中的PDF报告 背景 最近小编出于工作需要,准备在Wind金融数据终端批量下载上市公司2019年第一季度业绩预告.通过相关的条件检索,发现其相关数据有近百 ...

  6. python利用多线程批量下载高清美女图片(350秒下载近3600张1.2个G的照片,地址可变)

    目录 第一章.前言 1.1.实现的效果: 1.2.需要用到的库: 第二章.代码分块讲解 2.1.对象的定义和初始化 2.2.方法1和2获取所有图集链接 2.2.1. 对应网站结构 2.2.2 .相应代 ...

  7. Python爬虫——利用Scrapy批量下载图片

    Python爬虫--利用Scrapy批量下载图片 Scrapy下载图片项目介绍 使用Scrapy下载图片 项目创建 项目预览 创建爬虫文件 项目组件介绍 Scrapy爬虫流程介绍 页面结构分析 定义I ...

  8. 用python可以免费下载音乐吗-利用Python来下载会员歌曲!想让我充会员?不存在的!...

    原标题:利用Python来下载会员歌曲!想让我充会员?不存在的! 低头呢喃,对你的偏爱太过于明目张胆 目标 QQ音乐中VIP才能下载的歌曲 使用库 主要使用的库: requests 向服务器发起请求 ...

  9. Python 批量下载SIGMOD,VLDB的论文 Mac OS

    这里写自定义目录标题 Python 批量下载SIGMOD,VLDB的论文 Mac OS 实现 0.要爬取的网站 1.下载单篇论文 2.获得所有论文的链接 完整代码 Python 批量下载SIGMOD, ...

最新文章

  1. Node的异步与java的异步_node中异步IO的理解
  2. 25亿布局大湾区,创新工场的AI下一站
  3. 清华「男神」沈天成,踢毽子踢成了2021学生年度人物
  4. ubuntu修改根用户密码
  5. Python 技术篇-使用time库获取秒级时间戳、毫秒级时间戳实例演示
  6. Beginning C# Objects 读书笔记(一)
  7. (22)通过代码修改PTE实现挂物理页
  8. Android 开发之多线程处理、Handler 详解
  9. 人口普查系统_王佐镇全面开展第七次人口普查数据采集处理系统培训暨摸底动员部署会...
  10. linux ubuntu 安装 SSH
  11. python绘制密度散点图
  12. 系统集成(IBMS)软件的功能
  13. 智能陈桥五笔输入法 for linux,解决在Linux下安装陈桥五笔输入法的方法
  14. 机器学习实战之信用卡诈骗(二)
  15. 如何零基础转行成为一个自信的前端达人
  16. 无限极分类JAVA 实现—查子孙树、家谱树
  17. docker中php环境慢,解决访问本地 docker 项目慢的问题
  18. 搭建Git远程仓库详细步骤(保姆级)
  19. vue-seamless-scroll的使用以及实例
  20. 碧蓝航线皇家巡游服务器更新维护,碧蓝航线更新公告

热门文章

  1. [转]Docker中的镜像
  2. 安装NSX的注意事项
  3. 石器时代单机版 – 80后的初恋网游
  4. 动画师必备maya绑定插件AdvancedSkeleton5.899官网新版发布!
  5. 前端3D技术起源与发展
  6. Deal with diffcult people-人与人共事沟通之道
  7. 【论文泛读169】少数线索:中文的小样本学习评估基准
  8. [Simulink] PolySpace学习笔记
  9. centos 安装内核头文件_centos 内核头文件的安装操作方法
  10. 维迪声E3—维尔晶科技的十年磨一剑