python3批量下载文件

“懒人往往都是促进科技发展的动力”                   ----  不知道哪位大佬说的

由于本人太懒,懒到几个文件下载都不想点击,所以写了一个爬虫来解决,貌似耗时更长了 -_-!! ,真是得不偿失啊,算了,就当是练练python吧。

1.准备一个可以写代码的IDE,我比较喜欢vscode,免费插件多,好用。

2.安装beautifulsoup ,命令提示符打开 pip install beautifulsoup4 ,  点击 -> 官网

3.由于针对的是内网的作业管理系统,所以需要内网才可以,外网的人,大概看看就行了。


4.审查元素打开,查看相应ppt的url(统一资源定位符),复制下来,待会要用

5.打开IDE,新建一个py文件

from urllib.request import urlopen
from urllib.request import Request
from urllib import parse
from bs4 import BeautifulSoup
import os
import re

引入这些库,刚才的库就可以填入otherUrl了

# 基础URL
baseUrl = 'http://202.117.179.110/'
# 列表url
otherUrl = "ListDir.jsp?Dir=srXdHI4teMaOo5NtDt62cclvdSkJPPJaDkBRTbKuMgLzU4y42YPfnnB-uSxpc6mu"
# otherUrl = "ListDir.jsp?Dir=srXdHI4teMY5iurnj5rqvUqYBNxX4N5oDkBRTbKuMgLzU4y42YPfnvTOUiLcs6zt"


6.接下来就是常规的伪装头,防止主机屏蔽掉python请求

req = Request(url)
req.add_header( "User-Agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36")
res = urlopen(req)
data =res.read().decode( "utf-8")

7.保存的文件夹也需要判断是否存在,import os就可以派上用场了

if (os.path.exists(folder) == False):
# 如果不存在新建文件夹
os.mkdir(folder)


8.关于文件还是目录的判断,可以明显发现,文件是有后缀的,所以可以通过这种方式判断,细心的人会发现,有一个更好的方法是判断前面的备注,所以方法可以是

info.find_all('td')[1].text.replace('[','').replace(']','') == '文件'

但是我采用的还是利用文件后缀名来判断,总感觉这种方式更通用

len(re.compile(r'\.[a-zA-Z0-9]+$').findall(info.a.text.strip()))
这个正则表达式的意思为以‘.’开始多个数字或字母结尾的正则表达式,然后通过在文件名中匹配,若成功,返回数组,通过判断数组长度是否为1,执行后续操作。


9.关于文件存储,很普通,没有什么特别的。

with open(filename, 'wb') as f:
print( "save -> %s " % filename)
f.write( file)

10.关于递归整个网站,下载所有文件的思路。递归的过程可以算回溯或者深度优先遍历/搜索,所以可以采取栈的数据结构,在遇到文件夹时候,进入文件夹,下载完所有文件,弹出栈顶元素,回溯执行别的文件下载操作。


代码实现:

from urllib.request import urlopen
from urllib.request import Request
from urllib import parse
from bs4 import BeautifulSoup
import os
import re

# 本爬虫功能
#   爬取202.117.179.110上指定文件夹内所有文件


# 关于改进方案
#   可采取栈的方式,使用深度优先遍历,如果遇到文件夹,放入栈中
#   继续递归,直到所有a标签的数量与文件数量相等,此时返回,弹出栈顶元素,继续向下执行
#   弹出所有栈内元素,则执行结束,这样可以对整个站点进行爬取,下载所有文件

# 代码实现

# 基础URL
baseUrl = 'http://202.117.179.110/'
# 列表url
otherUrl = "ListDir.jsp?Dir=srXdHI4teMaOo5NtDt62cclvdSkJPPJaDkBRTbKuMgLzU4y42YPfnnB-uSxpc6mu"
# otherUrl = "ListDir.jsp?Dir=srXdHI4teMY5iurnj5rqvUqYBNxX4N5oDkBRTbKuMgLzU4y42YPfnvTOUiLcs6zt"

# 存放文件夹名字
folder = "中间件"
# 完整url
url = baseUrl + otherUrl

req = Request(url)
req.add_header("User-Agent","Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36")
res = urlopen(req)
data =res.read().decode("utf-8")
# 使用beautifulsoup
soup = BeautifulSoup(data,"lxml")

# 包含tr的对象列表
infoList = soup.find_all('tr')

# print(infoList)
# infoList = soup.find_all('a')
# del infoList[0]

# 判断是否文件夹存在
if (os.path.exists(folder) == False):
    # 如果不存在新建文件夹
    os.mkdir(folder)

    
os.chdir(folder)

for info in infoList:
    # print(info.find_all('td')[1].text.replace('[','').replace(']','') == '文件')
    # 正则表达式对后缀名进行判断,如果有后缀名,则数组长度不为1,说明链接是文件而不是文件夹
    if(len(re.compile(r'\.[a-zA-Z0-9]+$').findall(info.a.text.strip()))):
        # 提取文件名
        filename = info.a.text.strip()
        # 拼接url
        response = urlopen(baseUrl + info.a['href'])
        file =response.read()
        # 文件存储
        with open(filename,'wb') as f:
            print("save -> %s " % filename)
            f.write(file)

文件下载过程,可以看到是去除了文件夹的:

网站目录:


下载的文件:



  • 19
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值