1:首先是从官网上获取需要下载的工具的url。进入官网的工具下载页面,右键点击需要下载的工具,选择检查,会选中对应的连接。如下图所示:
此时可以观察它的结构,发现我需要下载的连接都在div,class="devsite-article-body clearfix"这个类下方。接下来使用python进行处理。首先就是从这些内容中挑出需要下载的链接.代码如下:
import requests
from bs4 import BeautifulSoup
import re
#这个url是工具下载的页面
url = 'https://source.android.com/compatibility/cts/downloads'
#用字典来存储请求头,请求头可以通过F12打开调试台,然后查看网络-请求头即可获得。
headers1 = {
'Host': 'source.android.com',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0'
}
#使用request来获取url的信息
response = requests.get(url, headers=headers1)
#通过BeautifulSoup将指定类的信息提取出来,之后使用正则表达式获取需要的连接。
soup = BeautifulSoup(response.content, 'lxml')
html_str = str(soup.find_all('div', class_='devsite-article-body clearfix'))
urls = re.findall('href="(.*?)">Android', html_str)
print(urls)
上面的代码可以将需要下载的工具的连接提取出来,输出如下:
这样获取链接的一步就完成了.
2.接下来就是使用这些链接进行下载。有时候不需要下载这些链接的全部,只需要一部分。可以先整理以下,再进行下载.代码如下:
#新建一个列表用来保存想要下载的工具,比如x86-86且不是verifier,同时是android9及以上版本的工具。
dl_urls = []
for i in range(len(urls)):
if '_x86-x86' in urls[i] and 'verifier' not in urls[i]:
if (float(re.search('-(\d.*?)_',str(urls[i])).group(1))) >= 9:
dl_urls.append(urls[i])
# print(dl_urls)
#设置下载链接使用的请求头,通过点击链接然后查看请求头获得,同时根据点击链接也可得知这个请求是get类型
headers2 = {
'Connection': 'keep-alive',
'Host': 'dl.google.com',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0'
}
#遍历列表一个一个下载文件
for dl_url in dl_urls:
dl_response = requests.get(dl_url, timeout=(5,10), headers=headers2, stream=True)
#获取需要下载的文件的大小并转换为数字,同时获取当前时间
file_size_str = dl_response.headers['Content-Length']
file_size = int(file_size_str) / 1024 / 1024
t_start = time.time()
tmp = 0
#通过正则表达式获取文件名称
filename = re.search('cts/(.*?)$', dl_url).group(1)
#创建文件,以二进制的形式写入
with open(f'/home/huchengbo/tool_version/{filename}', 'wb') as f:
print(f'{filename}文件创建成功')
#一块一块写入文件,由chunksize来决定块的大小
for chunk in dl_response.iter_content(chunk_size=512):
f.write(chunk)
t_end = time.time()
#每三秒检测一次当前文件大小,并打印动态报告
if t_end - t_start > tmp + 3:
local_file_size = os.stat(f'/home/huchengbo/tool_version/{filename}').st_size / (1024 * 1024)
print(f"\r{filename}执行时间:{int(t_end - t_start)}秒,总大小为{int(file_size)}MB,已经下载{int(local_file_size)}MB({round(float(local_file_size / file_size) * 100, 1)}%)", end='')
tmp = t_end - t_start
print(f'{filename}写入完成')
下面是输出的结果:
android-cts-12_r1-linux_x86-x86.zip文件创建成功
android-cts-12_r1-linux_x86-x86.zip执行时间:21秒,总大小为4505MB,已经下载9MB(0.2%)
这样就可以一个一个的下载文件了。