爬取kylin系统软件源源码

本文介绍了一个使用Python编写的网页爬虫程序,该程序能够解析HTML页面,抓取链接,并递归下载指定网站上的文件。通过自定义的HTML解析器,爬虫可以忽略特定的链接类型,同时记录操作日志。此外,程序还包含了下载进度的显示功能,确保了文件下载的完整性和效率。
#!/usr/bin/python
# -- coding: utf-8 --
from html.parser import HTMLParser
import urllib.error
import urllib.request
import os, sys
import socket
from urllib import request


def out_log(logfile, message):
    with open(logfile, 'a') as log:
        log.write(message+'\n')


class myparser(HTMLParser):
    '''找到a标签并把属性的值放到列表里'''
    def __init__(self):
        HTMLParser.__init__(self)
        self.links = []

    def handle_starttag(self, tag, attrs):
        if tag == 'a':
            if len(attrs) == 0:
                pass
            else:
                for (variable, value) in attrs:
                    # print(variable, '=========', value)
                    if variable == 'href':
                        if value in ['?C=N&O=D', '?C=M&O=A', '?C=S&O=A', '?C=D&O=A', '?C=N&O=A']:
                            pass
                        else:
                            self.links.append(value)


def callbackfunc(blocknum, blocksize, totalsize):
    '''回调函数,打印下载进度
    @blocknum: 已经下载的数据块
    @blocksize: 数据块的大小
    @totalsize: 远程文件的大小
    '''
    percent=0
    try:
        percent = int(100.0 * blocknum * blocksize / totalsize)
    except:
        pass
    if totalsize > 505528:
        pass
    else:
        percent = 100
    sys.stdout.write('\r')
    out_log('G:\\HK\\simple\\out.log', '\r')
    out_log('G:\\HK\\simple\\out.log', file_name + percent * '>' + str(percent) + '%')
    sys.stdout.write(file_name + percent * '>' + str(percent) + '%')
    sys.stdout.flush()


def create_dir(root_tree,catalog):
    '''根据url的目录结构在本地穿件文件夹'''
    os.chdir(root_tree)
    try:
        out_log('G:\\HK\\simple\\out.log', '创建目录:' + catalog)
        os.makedirs(catalog)
    except FileExistsError as e:
        pass


def download_file(url, down_path):

    '''下载文件保存到相应的目录,并把下载失败的放在一个字典里'''
    global file_name
    global error_download
    file_name = url.split('/')[-1]
    error_download = {}
    socket.setdefaulttimeout(600)
    try:
        if os.path.exists(down_path):
            out_log('G:\\HK\\simple\\out.log', os.path.join(down_path) + 'have existed')
            print(os.path.join(down_path), ' have existed')
            pass
        # elif os.path.isdir(down_path):
        #     out_log('G:\\HK\\ios_FT\\out.log', os.path.join(down_path) + 'have existed')
        #     print(os.path.join(down_path), ' have existed')
        else:
            print('download:')
            out_log('G:\\HK\\packages\\out.log', 'download:')
            request.urlretrieve(url, down_path, callbackfunc)
    except socket.gaierror as e:
        error_download[url] = down_path
        out_log('G:\\HK\\simple\\out.log', 'socket.gaierror:'+url)
        print('socket.gaierror', url)
    except urllib.error.URLError as e:
        error_download[url] = down_path
        out_log('G:\\HK\\simple\\out.log', 'urllib.error.URLError'+ url)
        print('urllib.error.URLError', url)
    sys.stdout.write('\n')


def get_url_tree(url_tree):
    ''' 获取一个字典,链接:目录,并把文件夹创建及把文件下载 '''
    url_tree_dict = {}
    level = 0
    for url in url_tree:
        try:
            response = request.urlopen(url)
            page = response.read().decode('utf-8')
            hp = myparser()
            hp.feed(page)
            hp.close()
        except urllib.error.URLError as e:
            print(e)
            pass
        try:
            # for i in hp.links:
            #     if '../' in hp.links[i]:
            #         hp.links[i] = hp.links[i].split('../')[-1]
            hp.links.remove("../")
        except ValueError as e:
            pass
        for file in hp.links:
            if '/' in file:
                create_dir(url_tree[url], file)
                url_tree_dict[url+file] = url_tree[url]+file
            else:
                download_file(url+file, url_tree[url]+file)
            if file.find('/') > 0:
                level += 1
    return url_tree_dict, level

url_tree = {"http://archive.kylinos.cn/kylin/KYLIN-ALL/": 'G:\\HK\\ios_FT\\'}
# url_tree = {"https://mirrors.aliyun.com/pypi/packages/": 'G:\\HK\\packages\\'}
try:
    os.makedirs('G:\\HK\\ios_FT\\')
    os.makedirs('G:\\HK\\packages\\')
except FileExistsError as e:
    print(e)
#     pass

while True:
    url_tree, level = get_url_tree(url_tree)
    if level == 0:
        break
    print(url_tree, level)
for key in error_download:
    download_file(key, error_download[key])

 

### 3.1 Kylin 系统下的 Qt 编译准备 在 Kylin 系统上编译 Qt 源码,需要确保系统具备必要的依赖库和编译工具。首先应安装以下基础依赖: - `openssl`:用于支持 Qt 的 SSL/TLS 功能 - `libxcb`(版本至少为 1.12):用于 X11 图形界面支持 - `gcc`:C/C++ 编译器 - `libpthread-stubs`(版本 0.1) - `xcb-proto`(版本 1.12) 此外,还需安装 `make`、`g++`、`perl` 和 `python` 等构建工具[^2]。 在开始编译前,建议设置环境变量以指定 Qt 的安装路径和编译模式。例如: ```bash export QTDIR=~/qt5.12.8 export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH ``` 若需在系统中使用自定义版本的 Qt,可使用 `qtchooser` 工具进行版本切换: ```bash qtchooser -install qt5.6.0-aarch-linux-gnu /usr/local/Qt-5.6.0/bin export QT_SELECT=qt5.6.0-aarch-linux-gnu ``` ### 3.2 配置 Qt 编译选项 进入 Qt 源码目录后,执行 `./configure` 命令进行配置。Kylin 系统通常使用 `linux-g++` 平台配置,例如: ```bash cd ~/qt5.7.0 ./configure -platform linux-g++ ``` 如需启用特定功能(如 WebEngine 模块),可添加 `-webengine` 参数: ```bash ./configure -platform linux-g++ -webengine ``` 对于静态编译需求,可使用以下配置参数: ```bash ./configure -prefix ~/Qt-5.15.16-static \ -release \ -static \ -qt-zlib -qt-libpng -qt-libjpeg \ -no-opengl -no-egl \ -ssl -openssl-linked \ OPENSSL_INCDIR=/opt/openssl/include \ OPENSSL_LIBDIR=/opt/openssl/lib \ OPENSSL_LIBS='-L/opt/openssl/lib -lssl -lcrypto -ldl -lpthread' ``` ### 3.3 编译与安装 配置完成后,执行以下命令进行编译: ```bash make -j$(nproc) ``` 编译完成后,执行安装命令将 Qt 安装到指定目录: ```bash make install ``` 若需将 Qt Creator 安装到指定目录,可使用如下方式: ```bash qmake -r make -j4 sudo make install INSTALL_ROOT=/opt/QtCreator-4.13.3 ``` ### 3.4 中文显示问题处理 在 Kylin 系统中,Qt 应用程序可能会出现中文显示异常的问题,通常是由于缺少中文字体库所致。解决方法是将合适的中文字体文件(如 `simsun.ttc` 或 `wenquanyi.ttf`)复制到 Qt 安装目录下的 `lib/fonts` 目录中,或系统字体目录 `/usr/lib/fonts`[^1]。 ### 3.5 常见问题与解决 - **缺少 xcb 错误**:确保安装了 `libxcb`、`libx11-dev` 和 `xcb-proto` 等依赖库 - **WebEngine 模块编译失败**:检查是否启用了 `-webengine` 选项,并确保系统有足够内存和磁盘空间 - **静态编译失败**:检查是否正确配置了 `OPENSSL_INCDIR` 和 `OPENSSL_LIBDIR` 等参数 - **找不到 qmake**:确认 `QTDIR/bin` 是否已加入系统 `PATH` 环境变量 ### 3.6 分模块编译(可选) 若仅需编译 Qt 的特定模块,可进入相应模块目录进行单独编译。例如: ```bash cd qtbase qmake make ``` 这种方式有助于节省编译时间并排查模块级问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值