Python爬虫自动下载CTS测试工具

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%)

这样就可以一个一个的下载文件了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值