基于QT5 + requests + MySQL + Python开发的爬虫软件

该软件仅仅用于学习爬虫了解爬虫的相关技术和实现方法!!!

  1. 话不多说,我们直接上代码学习
  2. 仅仅用于学习
  3. 仅仅用于学习
  4. 不要总想着搞点事情,安分守己做一个爱学习的好孩子把
  5. 其实还有几个页面我是故意关掉的你们自己二次开发,因为功能实在是强大容易出事

上图片
在这里插入图片描述
最上面是菜单栏
在这里插入图片描述
功能界面如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好了就这几个,其他的自己搞,根据学习,也不要问我要,问就是没有!!!

效果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

好了好了上代码
项目框架搭建:
在这里插入图片描述

首页:index.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.

import Img.bg_rc
import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets

from Verification import Verification
from Data import data
from TP import tp
from PPT import ppt

class Ui_MainWindow(QMainWindow):

    # 构造方法
    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        self.setupUi(self)  # 初始化窗体设置


    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(786, 600)

        MainWindow.setAutoFillBackground(True)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setStyleSheet("border-image: url(:/jpg/bg.jpg);")
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 786, 26))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        self.menu_2 = QtWidgets.QMenu(self.menubar)
        self.menu_2.setObjectName("menu_2")
        self.menu_3 = QtWidgets.QMenu(self.menubar)
        self.menu_3.setObjectName("menu_3")
        self.menu_4 = QtWidgets.QMenu(self.menubar)
        self.menu_4.setObjectName("menu_4")
        self.menuPPT = QtWidgets.QMenu(self.menubar)
        self.menuPPT.setObjectName("menuPPT")
        self.menu_5 = QtWidgets.QMenu(self.menubar)
        self.menu_5.setObjectName("menu_5")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.actionyanz = QtWidgets.QAction(MainWindow)
        self.actionyanz.setObjectName("actionyanz")
        self.actionguanyu = QtWidgets.QAction(MainWindow)
        self.actionguanyu.setObjectName("actionguanyu")
        self.actionhezuo = QtWidgets.QAction(MainWindow)
        self.actionhezuo.setObjectName("actionhezuo")
        self.actionsjpc = QtWidgets.QAction(MainWindow)
        self.actionsjpc.setObjectName("actionsjpc")
        self.actiontppq = QtWidgets.QAction(MainWindow)
        self.actiontppq.setObjectName("actiontppq")
        self.actionsp = QtWidgets.QAction(MainWindow)
        self.actionsp.setObjectName("actionsp")
        self.actionppt = QtWidgets.QAction(MainWindow)
        self.actionppt.setObjectName("actionppt")
        self.actionzz = QtWidgets.QAction(MainWindow)
        self.actionzz.setObjectName("actionzz")

        self.menu.addAction(self.actionyanz)
        self.menu.addSeparator()
        self.menu.addAction(self.actionguanyu)
        self.menu.addAction(self.actionhezuo)
        self.menu_2.addAction(self.actionsjpc)
        self.menu_3.addAction(self.actiontppq)
        self.menu_4.addAction(self.actionsp)
        self.menuPPT.addAction(self.actionppt)
        self.menu_5.addAction(self.actionzz)
        self.menubar.addAction(self.menu.menuAction())
        self.menubar.addAction(self.menu_2.menuAction())
        self.menubar.addAction(self.menu_3.menuAction())
        self.menubar.addAction(self.menu_4.menuAction())
        self.menubar.addAction(self.menuPPT.menuAction())
        self.menubar.addAction(self.menu_5.menuAction())

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        getTime = QtCore.QDateTime.currentDateTime()
        time = getTime.toString("yyyy-MM-dd HH:mm:ss")
        self.statusbar.showMessage("程序开始时间为:" + time + "|星梦工作室|负责人:刘文豪")

        self.menu.triggered[QtWidgets.QAction].connect(self.openVerification)
        self.menu_2.triggered[QtWidgets.QAction].connect(self.openData)
        self.menu_3.triggered[QtWidgets.QAction].connect(self.openTP)
        self.menu_4.triggered[QtWidgets.QAction].connect(self.openSP)
        self.menuPPT.triggered[QtWidgets.QAction].connect(self.openPPT)
        self.menu_5.triggered[QtWidgets.QAction].connect(self.openZZB)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "给我爬"))
        self.menu.setTitle(_translate("MainWindow", "网站可爬域"))
        self.menu_2.setTitle(_translate("MainWindow", "数据爬取"))
        self.menu_3.setTitle(_translate("MainWindow", "图片爬取"))
        self.menu_4.setTitle(_translate("MainWindow", "视频爬取"))
        self.menuPPT.setTitle(_translate("MainWindow", "PPT爬取"))
        self.menu_5.setTitle(_translate("MainWindow", "资源包爬取"))
        self.actionyanz.setText(_translate("MainWindow", "验证合法性"))
        self.actionguanyu.setText(_translate("MainWindow", "关于"))
        self.actionhezuo.setText(_translate("MainWindow", "合作"))
        self.actionsjpc.setText(_translate("MainWindow", "数据爬取"))
        self.actiontppq.setText(_translate("MainWindow", "图片爬取"))
        self.actionsp.setText(_translate("MainWindow", "视频爬取"))
        self.actionppt.setText(_translate("MainWindow", "ppt爬取"))
        self.actionzz.setText(_translate("MainWindow", "资源爬取"))


    def openVerification(self, m):
        if m.text() == "关于":
            QMessageBox.about(None, "关于", "本软件开发设计是为了学习技术,没有任何盈利性的目的,本人不承担任何法律责任")
        elif m.text() == "合作":
            QMessageBox.about(None, "合作", "找我合作:www.wenhaosuper.topb")
        elif m.text() == "验证合法性":
            self.m = Verification.Ui_MainWindow()
            self.m.show()

    def openData(self, m):
        if m.text() == "数据爬取":
            self.m = data.Ui_MainWindow()
            self.m.show()

    def openTP(self, m):
        if m.text() == "图片爬取":
            self.m = tp.Ui_MainWindow()
            self.m.show()

    def openPPT(self, m):
        if m.text() == "ppt爬取":
            self.m = ppt.Ui_MainWindow()
            self.m.show()

    def openSP(self, m):
        if m.text() == "视频爬取":
            QMessageBox.about(None, "尚在开发", "更多精彩还在开发中")

    def openZZB(self, m):
        if m.text() == "资源爬取":
            QMessageBox.about(None, "尚在开发", "更多精彩还在开发中")









if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()  # 创建窗体对象
    ui = Ui_MainWindow()  # 创建PyQt5设计的窗体对象
    ui.setupUi(MainWindow)  # 调用PyQt5窗体的方法对窗体对象进行初始化设置
    MainWindow.show()  # 显示窗体
    sys.exit(app.exec_())  # 程序关闭时退出进程

爬取数据文章的页面:data.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'data.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import sys
import time
from dbMySQL import service
from SpiderWeb.vfWeb import getMessage
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *


class Ui_MainWindow(QMainWindow):

    # 构造方法
    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        self.setupUi(self)  # 初始化窗体设置


    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 528)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 20, 91, 41))
        self.label.setStyleSheet("font: 12pt \"Adobe 黑体 Std R\";")
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(130, 20, 311, 31))
        self.lineEdit.setStyleSheet("font: 11pt \"黑体\";")
        self.lineEdit.setText("")
        self.lineEdit.setObjectName("lineEdit")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(40, 70, 72, 15))
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(30, 70, 181, 41))
        self.label_3.setStyleSheet("font: 12pt \"Adobe 黑体 Std R\";")
        self.label_3.setObjectName("label_3")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(210, 70, 581, 31))
        self.lineEdit_2.setStyleSheet("font: 11pt \"黑体\";")
        self.lineEdit_2.setText("")
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(542, 17, 151, 41))
        self.pushButton.setStyleSheet("font: 14pt \"黑体\";")
        self.pushButton.setObjectName("pushButton")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(33, 146, 741, 251))
        self.textEdit.setOverwriteMode(True)
        self.textEdit.setObjectName("textEdit")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(30, 110, 171, 31))
        self.label_4.setStyleSheet("font: 12pt \"Adobe 黑体 Std R\";")
        self.label_4.setObjectName("label_4")
        self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(210, 110, 421, 23))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(240, 410, 91, 21))
        self.label_5.setStyleSheet("font: 12pt \"黑体\";")
        self.label_5.setObjectName("label_5")
        self.checkBox = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox.setGeometry(QtCore.QRect(340, 410, 101, 19))
        self.checkBox.setObjectName("checkBox")
        self.checkBox_2 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_2.setGeometry(QtCore.QRect(340, 440, 121, 19))
        self.checkBox_2.setObjectName("checkBox_2")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(550, 410, 151, 41))
        self.pushButton_2.setStyleSheet("font: 14pt \"黑体\";")
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.pushButton.clicked.connect(self.actiondata)
        self.pushButton_2.clicked.connect(self.save)



    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "数据爬取"))
        self.label.setText(_translate("MainWindow", "目标网址:"))
        self.label_3.setText(_translate("MainWindow", "目标资源结构路径:"))
        self.pushButton.setText(_translate("MainWindow", "开始爬取"))
        self.label_4.setText(_translate("MainWindow", "爬取进度及显示:"))
        self.label_5.setText(_translate("MainWindow", "保存选项:"))
        self.checkBox.setText(_translate("MainWindow", "保存到文件"))
        self.checkBox_2.setText(_translate("MainWindow", "保存到数据库"))
        self.pushButton_2.setText(_translate("MainWindow", "开始保存"))


    def actiondata(self):
        self.a = []
        self.b = []
        url = self.lineEdit.text()
        cssPath = self.lineEdit_2.text()
        if url == "" or cssPath == "":
            QMessageBox.about(None, "警告", "你没有填写任何内容")
        else:
            try:
                self.data = getMessage(url, cssPath)
            except:
                self.textEdit.setPlainText("爬取失败")
            self.progressBar.setMaximum(len(self.data))
            self.step = 0
            try:
                for i in self.data:
                    title = i.get_text("title")
                    self.b.append(title)
                    weburl = i.get("href")
                    newpath = '#article > p'
                    message = getMessage(weburl, newpath)
                    s = ''
                    for j in message:
                        s = s + j.get_text()
                    self.b.append(s)
                    self.textEdit.append("-------------------------------------------")
                    self.textEdit.append(title)
                    self.textEdit.append(s)
                    self.step = self.step + 1
                    self.progressBar.setValue(self.step)
                    self.a.append(self.b)
                    self.b = []
            except:
                self.textEdit.setPlainText("爬取失败!")


    def save(self):
        if self.checkBox.isChecked() and self.checkBox_2.isChecked():
            nowtime = time.strftime('%Y%m%d-%H-%M-%S', time.localtime()) + ".txt"
            fw = open("../CK/data/{}".format(nowtime), "w+")
            for m, n in self.a:
                title = m
                s = n
                service.exec("insert into data(title, weburl) value (%s, %s)", (title, s))
                fw.write(title + "\n")
                fw.write(s + "\n")
            fw.close()
        elif self.checkBox_2.isChecked():
            for m, n in self.a:
                title = m
                s = n
                service.exec("insert into data(title, weburl) value (%s, %s)", (title, s))
        elif self.checkBox.isChecked():
            nowtime = str(time.strftime('%Y%m%d-%H-%M-%S', time.localtime())) + ".txt"
            path = "../CK/data/" + nowtime
            print(path)
            fw = open(path, "w+", encoding="utf8")
            for m, n in self.a:
                title = m
                s = n
                fw.write(title + "\n")
                fw.write(s + "\n")
            fw.close()



图片爬取页面:tp.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'tp.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import sys
import time
import requests
from PyQt5 import QtCore, QtGui, QtWidgets
from SpiderWeb.vfWeb import downImg
from PyQt5.QtWidgets import *


class Ui_MainWindow(QMainWindow):

    # 构造方法
    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        self.setupUi(self)  # 初始化窗体设置

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(569, 386)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 30, 131, 31))
        self.label.setStyleSheet("font: 11pt \"Adobe 黑体 Std R\";")
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(140, 30, 391, 31))
        self.lineEdit.setStyleSheet("font: 57 10pt \"Adobe Myungjo Std M\";")
        self.lineEdit.setObjectName("lineEdit")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(10, 70, 141, 31))
        self.label_2.setStyleSheet("font: 11pt \"Adobe 黑体 Std R\";")
        self.label_2.setObjectName("label_2")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(150, 70, 401, 31))
        self.lineEdit_2.setStyleSheet("font: 57 10pt \"Adobe Myungjo Std M\";")
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QtCore.QRect(20, 160, 531, 131))
        self.textEdit.setOverwriteMode(True)
        self.textEdit.setObjectName("textEdit")
        self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(140, 110, 411, 31))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(10, 110, 121, 31))
        self.label_3.setStyleSheet("font: 11pt \"Adobe 黑体 Std R\";")
        self.label_3.setObjectName("label_3")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(220, 300, 121, 31))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 569, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.pushButton.clicked.connect(self.actiondata)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "图片爬取"))
        self.label.setText(_translate("MainWindow", "图片目标网址:"))
        self.label_2.setText(_translate("MainWindow", "网址的路径结构:"))
        self.label_3.setText(_translate("MainWindow", "爬取下载进度:"))
        self.pushButton.setText(_translate("MainWindow", "开始爬取"))


    def actiondata(self):
        a = 1
        url = self.lineEdit.text()
        cssPath = self.lineEdit_2.text()
        nowtime = time.strftime('%Y%m%d-%H-%M-%S', time.localtime())
        path = "../CK/img/{}".format(nowtime)
        try:
            data = downImg(url, cssPath, path)
        except:
            self.textEdit.setPlainText("爬取出错!!")
        self.progressBar.setMaximum(len(data))
        self.step = 0
        try:
            for i in data:
                imgurl = i.get("src")
                self.textEdit.append(imgurl)
                self.step = self.step + 1
                self.progressBar.setValue(self.step)
                newpath = path + "/第{}张".format(a) + ".png"
                fw = open(newpath, 'wb')
                r = requests.get("https:" + imgurl)
                r.raise_for_status()
                fw.write(r.content)
                fw.close()
                a = a + 1
                time.sleep(0.5)
        except:
            self.textEdit.setPlainText("爬取出错!!")



本项目核心代码很简单就几句话vfWeb.py:

#-*-coding:utf-8-*-
# 刘文豪
# 大帅哥
import requests
from bs4 import BeautifulSoup
import os


def vf(url):
    response = requests.get(url)
    response.encoding = "UTF8"
    html = response.text
    return html


def getHTML(url, cssPath):
    response = requests.get(url)
    response.encoding = "utf8"
    Htlmtext = response.text
    soup = BeautifulSoup(Htlmtext, "lxml")
    data = soup.select(cssPath)
    return data


def getMessage(url, cssPath):
    data = getHTML(url, cssPath)
    return data

def downImg(url, caaPath, path):
    IMG = os.path.exists(path)
    if not IMG:
        os.mkdir(path)
    data = getMessage(url, caaPath)
    return data

def downPPT(url, cssPath, path):
    PPTurl = os.path.exists(path)
    if not PPTurl:
        os.mkdir(path)
    data = getMessage(url, cssPath)
    return data







# url = "https://mil.news.sina.com.cn/"
# cssPath = "body > div.wrap > div.zgjq > div.left > ul.part1.arcticle-list > li > a"
# getMessage(url, cssPath)


封装数据库操作service.py:

# -*- coding: utf-8 -*-

import pymysql # 导入操作MySQL数据库的模块


userName="" # 记录用户名

# 打开数据库连接
def open():
    db = pymysql.connect(host="localhost", user="root", password="196811", database="spidermessage", charset="utf8")
    return db # 返回连接对象

# 执行数据库的增、删、改操作
def exec(sql,values):
    db=open()  # 连接数据库
    cursor = db.cursor()  # 使用cursor()方法获取操作游标
    try:
        cursor.execute(sql, values)  # 执行增删改的SQL语句
        db.commit()  # 提交数据
        return 1   # 执行成功
    except:
        db.rollback() # 发生错误时回滚
        return 0  # 执行失败
    finally:
        cursor.close()  # 关闭游标
        db.close()  # 关闭数据库连接

# 带参数的精确查询
def query(sql,*keys):
    db=open() # 连接数据库
    cursor = db.cursor()  # 使用cursor()方法获取操作游标
    cursor.execute(sql, keys)  # 执行查询SQL语句
    result = cursor.fetchall()  # 记录查询结果
    cursor.close()  # 关闭游标
    db.close()  # 关闭数据库连接
    return result  # 返回查询结果

# 不带参数的模糊查询
def query2(sql):
    db=open() # 连接数据库
    cursor = db.cursor() # 使用cursor()方法获取操作游标
    cursor.execute(sql) # 执行查询SQL语句
    result = cursor.fetchall() # 记录查询结果
    cursor.close() # 关闭游标
    db.close() # 关闭数据库连接
    return result # 返回查询结果



好了项目代码就这么多如果需要直接下载的话这里有连接
快速链接
代码下载入口

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值