“懒人往往都是促进科技发展的动力” ---- 不知道哪位大佬说的
由于本人太懒,懒到几个文件下载都不想点击,所以写了一个爬虫来解决,貌似耗时更长了 -_-!! ,真是得不偿失啊,算了,就当是练练python吧。
1.准备一个可以写代码的IDE,我比较喜欢vscode,免费插件多,好用。
2.安装beautifulsoup ,命令提示符打开 pip install beautifulsoup4 , 点击 -> 官网
3.由于针对的是内网的作业管理系统,所以需要内网才可以,外网的人,大概看看就行了。
4.审查元素打开,查看相应ppt的url(统一资源定位符),复制下来,待会要用
5.打开IDE,新建一个py文件
引入这些库,刚才的库就可以填入otherUrl了
6.接下来就是常规的伪装头,防止主机屏蔽掉python请求
7.保存的文件夹也需要判断是否存在,import os就可以派上用场了
8.关于文件还是目录的判断,可以明显发现,文件是有后缀的,所以可以通过这种方式判断,细心的人会发现,有一个更好的方法是判断前面的备注,所以方法可以是
info.find_all('td')[1].text.replace('[','').replace(']','') == '文件'
但是我采用的还是利用文件后缀名来判断,总感觉这种方式更通用
len(re.compile(r'\.[a-zA-Z0-9]+$').findall(info.a.text.strip()))
这个正则表达式的意思为以‘.’开始多个数字或字母结尾的正则表达式,然后通过在文件名中匹配,若成功,返回数组,通过判断数组长度是否为1,执行后续操作。
9.关于文件存储,很普通,没有什么特别的。
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)
文件下载过程,可以看到是去除了文件夹的:
网站目录:
下载的文件: