Python小白逆袭大神-结营心得-alading

Python小白逆袭大神-结营心得

赶在五一前结束的Python小白逆袭大神7天打卡营结束了,经过了7天的练习,我觉得收获还是很多的。经过整理总结,进行分享。

1. 本期培训重点

本期集训营主要是一些库的使用,爬虫的主要技巧,图片绘制技巧等。如想全部消化还是需课下多花时间和精力。

  • 第一天开营:1、7日打卡营课程安排 2、Python与人工智能的关系,Python的特点和应用。
    实战1: 百度AI开放平台体验-人像漫画,视频内容分析,文本纠错,端语言识别 。
    实战2: Python实践-1分钟统计文件名。
  • 第二天:1、AI Studio使用与操作。2、Linux命令在AIStudio上的使用。3、Python的进阶用法。
    实战: 用Python轻松get《青春有你2》成员剧照。
  • 第三天:人工智能应用中最常用的Python库。
    实战: 冠军Pick谁?《青春有你2》小姐姐单人助力榜数据大揭秘。
  • 第四天: 1、深度学习欲训练模型管理工具PaddleHub的使用。2、深度学习在CV领域的应用内:颜值打分。3、以小姐姐颜值打分为例讲解深度学习主要步骤。
    实战: 自制数据集,利用PaddleHub颜值打分。
  • 第五天: 1、深度学习在NLP领域的应用:情感分析。 2、深度学习平台EasyDL介绍及使用体验。
    实战: 《青春有你2》评论调取,词频统计、绘制词云、自制数据集、利用PaddleHub进行评论情感分析。
  • 第六天: 学员完成全部实践,助教答疑。
  • 第七天: 结营讲解,经验分享,优秀学员颁奖。

每天的任务总结起来,实际上就是day5的大作业,贯穿整个7天打卡营的内容就是numpy库,pandas库,matplotlab库,python自带OS库,爬虫方法,paddleHub工具使用和EasyDL工具。
其中最重要的是三大库和爬虫技巧。

2. 培训内容概括

整个集训营包括8个课节,但不是每个课间的重要程度都是一样。我自己按照难易程度和重要程度做了一个划分。

总体前瞻

课节1:前置课程 对于有集训经验的同学,直接跳过。 ⭐课节2:Day1–人工智能概述与入门基础
讲的是python中几个典型的数据结构与结合张量进行示范。 ⭐⭐课节3:Day2–Python进阶 Python数据结构;
Python面向对象;Python JSON;Python 异常处理;常见Linux命令。
⭐⭐⭐课节4:Day3–深度学习常用Python库介绍
Python被大量应用在数据挖掘和深度学习领域,其中使用极其广泛的是Numpy、pandas、Matplotlib、PIL等库。
⭐⭐⭐课节5:Day4–PaddleHub体验与应用
用口罩检测教你使用PaddleHub工具,也就是不用自己动手搭神经网络框架了,只要准备数据+训练就行。
⭐⭐⭐⭐⭐课节6:Day5-EasyDL体验与作业发布 就是结合前4天内容的大作业,相当于一个总结。
⭐⭐⭐课节7:Day6-PaddleHub创意赛发布发布了创意赛和作业答疑,因为第5天的作业比较有难度。
⭐⭐⭐⭐课节8:Day7-课程结营 课程总结,赛事发布。

课节2:Day1–人工智能概述与入门基础
#1.基础操作
age = 20  		# 声明一个变量age 用来存储一个数字 20
1+1		        # 基础数学加法
print('Hello World!')   # 打印Hello World!
#2.条件判断if
if 1 == 2: # 如果 if 跟随的条件为 假 那么不执行属于if 的语句,然后寻找 else
    print("假的")
else: # 寻找到 else 之后 执行属于else中的语句
    print("1==2是假的")
#3.循环操作---for
for i in range(5):
    print(i)
#3.循环操作---while
sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 1
print(sum)
#4.break、continue、pass
#break语句可以跳出 for 和 while 的循环体
n = 1
while n <= 100:
    if n > 10:
        break
    print(n)
    n += 1

#continue语句跳过当前循环,直接进行下一轮循环
n = 1
while n < 10:
    n = n + 1
    if n % 2 == 0:
        continue
    print(n)
#pass是空语句,一般用做占位语句,不做任何事情
 for letter in 'Room':
    if letter == 'o':
        pass
        print('pass')
    print(letter)
#5.数据类型---Number(数字)
#Python支持int, float, complex三种不同的数字类型
a = 3
b = 3.14
c = 3 + 4j
print(type(a), type(b), type(c))
#5.数据类型---String(字符串)
#支持字符串拼接、截取等多种运算
a = "Hello"
b = "Python"
print("a + b 输出结果:", a + b)
#print("a[1:4] 输出结果:", a[1:4])
#5.数据类型---List(列表)
#列表是写在方括号 [] 之间、用逗号分隔开的元素列表。
#列表索引值以 0 为开始值,-1 为从末尾的开始位置。
list = ['abcd', 786 , 2.23, 'runoob', 70.2]
print(list[1:3])

#tinylist = [123, 'runoob']
#print(list + tinylist)
#5.数据类型---Tuple(元组)
#tuple与list类似,不同之处在于tuple的元素不能修改。tuple写在小括号里,元素之间用逗号隔开。
#元组的元素不可变,但可以包含可变对象,如list。
t1 = ('abcd', 786 , 2.23, 'runoob', 70.2)
t2 = (1, )
t3 = ('a', 'b', ['A', 'B'])
t3[2][0] = 'X'
print(t3)
#5.数据类型---dict(字典)
#字典是无序的对象集合,使用键-值(key-value)存储,具有极快的查找速度。
#键(key)必须使用不可变类型。
#同一个字典中,键(key)必须是唯一的。
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print(d['Michael'])
#5.数据类型---set(集合)
#set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
#set是无序的,重复元素在set中自动被过滤。
s = set([1, 1, 2, 2, 3, 3])
print(s)

看着简单,眼睛会,手也要会,而且要熟练,事实上如果几天不练就会生疏。

课节3:Day2–Python进阶
主要讲到的库总结:
  • math
  • random
  • json
主要讲到的接口总结:
  • math.ceil(4.1) # 返回数字的上入整数
  • math.floor(4.9) #返回数字的下舍整数
  • math.fabs(-10) #返回数字的绝对值
  • math.sqrt(9) #返回数字的平方根
  • math.exp(1) #返回e的x次幂
  • random.random()
  • random.seed(10) #当预先使用 random.seed(x) 设定好种子之后,其中的 x 可以是任意数字,此时使用 random() 生成的随机数将会是同一个。
  • girls.append(‘杨超越’) #声明一个空列表 girls = [] 1次添加1个
  • girls.extend(models) #models = [‘刘雯’,‘奚梦瑶’] 1次添加多个
  • girls.insert(1,‘虞书欣’) #指定位置添加
  • words.remove(‘cat’) #words = [‘cat’,‘hello’,‘pen’,‘pencil’,‘ruler’]
  • words.pop(1) #跟上面一样的效果
  • random.randint(1,20) #随机生成这个范围里面的整数
  • sorted(random_list) #升序排列一个列表
  • sorted(random_list,reverse =True) 降序排列一个列表
  • max(random_tuple)
  • min(random_tuple)
  • sum(random_tuple)
  • len(random_tuple)
  • random_tuple.count(4) 统计元组中某一个元素的个数
  • random_tuple.index(4) 元组中某一个元素对应的下标
  • for key,value in dict5.items(): 字典的遍历
  • dict5.get(‘赵小棠’,170) #如果能够取到值,则返回字典中的值,否则返回默认值170
python的面向对象

方法:类比CPP来学习

定义一个类Animals:
(1)init()定义构造函数,与其他面向对象语言不同的是,Python语言中,会明确地把代表自身实例的self作为第一个参数传入
(2)创建一个实例化对象 cat,init()方法接收参数
(3)使用点号 . 来访问对象的属性。

Python JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。json.dumps 用于将 Python 对象编码成 JSON 字符串。
就是一种格式化的文档,里面就是一条条重复的数据,每天数据的性质是一样的。

  • text = json.loads(jsonData) #将string转换为dict json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。
  • data = [ { ‘b’ : 2, ‘d’ : 4, ‘a’ : 1, ‘c’ : 3, ‘e’ : 5 } ]
    json = json.dumps(data)
    #json.dumps 用于将 Python 对象编码成 JSON 字符串。
Python异常处理
try:
    fh = open("/home/aistudio/data/testfile01.txt", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print('Error: 没有找到文件或读取文件失败')
else:
    print ('内容写入文件成功')
    fh.close()
try:
    f = open("/home/aistudio/data/testfile02.txt", "w")
    f.write("这是一个测试文件,用于测试异常!!")
finally:
    print('关闭文件')
    f.close()
    #finally中的内容,退出try时总会执行,就是终究都会被执行

当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。捕捉异常可以使用try/except语句。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

常见Linux命令
  • gzip:linux压缩文件中最常见的后缀名即为.gz,gzip是用来压缩和解压.gz文件的命令。
#会将文件压缩为文件 test.txt.gz,原来的文件则没有了,解压缩也一样
!gzip /home/aistudio/work/test.txt
  • tar:tar本身是一个打包命令,用来打包或者解包后缀名为.tar。配合参数可同时实现打包和压缩。
!tar -zcvf /home/aistudio/work/test.tar.gz /home/aistudio/work/test.txt
  • zip和unzip:zip命令和unzip命令用在在Linux上处理.zip的压缩文件。
!zip -r /home/aistudio/work/test.zip /home/aistudio/work/test.txt
!unzip  /home/aistudio/work/test.zip 
课节4:Day3–深度学习常用Python库介绍
常用库总结:
  • numpy
  • padas
  • PIL
  • Matplotlib
常用接口及用法总结:
  1. array = np.array([[1,2,3], [4,5,6]]) #将列表转化为数组
  2. zeroarray = np.zeros((2,3)) 可以创建指定长度或者形状的全0数组
  3. np.ones((3,4),dtype=‘int64’) 可以创建指定长度或者形状的全1数组
  4. np.empty((3,4))
  5. array = np.arange( 10, 31, 5 ) #该函数返回数组而不是列表。
  6. array.ndim #数组的维度
  7. array.shape #数组的形状
  8. array.size #数组元素的个数
  9. array.dtype #数组元素的类型
  10. np.arange(6).reshape([2,3]) #自定义数组类型
  11. np.array([[1,2,3],[4,5,6]],dtype=np.int64).reshape([3,2]) #自定义张量形状
  12. np.dot(arr3,arr4) #数组的点乘
  13. np.sum(arr3,axis=1) #axis=1,每一行求和 axie=0,每一列求和
  14. arr3.transpose() #矩阵的转置
  15. pd.Series([‘a’,‘b’,‘c’,‘d’,‘e’]) #Series带标签的一维数组 Seris中可以使用index设置索引列表。
  16. pd.Series([‘a’,‘b’,‘c’,‘d’,‘e’],index=[100,200,100,400,500]) #与字典不同的是,Seris允许索引重复
  17. d = {‘b’: 1, ‘a’: 0, ‘c’: 2} pd.Series(d) #可以通过Series的values和index属性获取其数组表示形式和索引对象
  18. s[100] s[[400, 500]] #通过索引的方式选取Series中的单个或一组值
  19. s+s s*3 #对应元素求和,对应元素相乘 (Series中最重要的一个功能是:它会在算术运算中自动对齐不同索引的数据,Series 和多维数组的主要区别在于, Series 之间的操作会自动基于标签对齐数据。因此,不用顾及执行计算操作的 Series 是否有相同的标签。
  20. data = {‘state’: [‘Ohio’, ‘Ohio’, ‘Ohio’, ‘Nevada’, ‘Nevada’], ‘year’: [2000, 2001, 2002, 2001, 2002], ‘pop’: [1.5, 1.7, 3.6, 2.4, 2.9]}
    frame = pd.DataFrame(data)
    #相当于定义一张表
  21. pd.DataFrame(data, columns=[‘year’, ‘state’, ‘pop’]) #如果指定了列顺序,则DataFrame的列就会按照指定顺序进行排列**(如果传入的列在数据中找不到,就会产生NAN值)**
  22. Image.open(’/home/aistudio/work/yushuxin.jpg’) #读取图片
  23. img.show() #自动调用计算机上显示图片的工具
  24. img_mode = img.mode #获得图像的模式
  25. width,height = img.size #获得图像的大小
  26. **img_rotate = img.rotate(45) ** #将图片旋转45度
  27. img1.crop((126,0,381,249)) #按照这4个坐标对图像进行剪切
  28. **img1_crop_result.save(’/home/aistudio/work/yushuxin_crop_result.jpg’) ** #保存处理后的图片
  29. img2.resize((int(width0.6),int(height0.6)),Image.ANTIALIAS) #对图片进行缩放
  30. img3.transpose(Image.FLIP_LEFT_RIGHT) #对图片进行左右翻转
  31. img3.transpose(Image.FLIP_TOP_BOTTOM) #对图像进行上下翻转
  32. np.linspace(-1,1,50) #创建等差数列
  33. plt.plot(x,y) #传入x,y,通过plot()绘制出折线图
  34. plt.show() #显示图形
  35. plt.figure(figsize=(7,5)) #创建一个画布**(2张图同时显示在一个画布上)**
  36. plt.plot(x,y1,color=‘red’,linewidth=1) #对数据添加属性
  37. plt.xlabel(‘x’,fontsize=20) #设置坐标轴
  38. plt.legend(handles=[l1,l2],labels=[‘aa’,‘bb’],loc=‘best’) #添加图例
  39. **plt.xlim((0,1)) ** #x轴只截取一段进行显示
  40. plt.scatter(dots1,dots2,c=‘red’,alpha=0.5) #散点图
  41. np.random.rand(50) #随机数
  42. plt.bar(x,y,facecolor=’#9999ff’,edgecolor=‘white’) #柱状图
  43. plt.text(ax,ay,’%.1f’ % ay,ha=‘center’,va=‘bottom’) #柱状图上每个数据添加标签
    ⭐⭐梳理的过程也是自己复习的过程!⭐⭐
课节5:Day4–PaddleHub体验与应用

使用PaddleHub的总体步骤:

  1. 安装工具paddlehub
  2. 安装模型
  3. 喂数据

上手示例1:情感检测

!pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
!hub install senta_lstm==1.1.0
!hub run senta_lstm --input_text "人工智能课程很有趣"

结果:

[{'text': '人工智能课程很有趣', 'sentiment_label': 1, 'sentiment_key': 'positive', 'positive_probs': 0.9572, 'negative_probs': 0.0428}]

positive_probs’: 0.9572 :0.9572,整体上一个正面的表达,情感是正面的,没啥问题。

上手示例2:口罩检测

  1. 安装模型
  2. 喂数据(事先准备好的)
#安装口罩检测模型
!hub install pyramidbox_lite_mobile_mask==1.1.0
!hub run pyramidbox_lite_mobile_mask --input_path "data/data31681/test.jpeg"

上手示例3:预测

  1. 加载模型
  2. 准备数据
module = hub.Module(name="pyramidbox_lite_mobile_mask")
test_img_path = "data/data31681/test.jpeg"
# set input dict
input_dict = {"data": [cv2.imread(test_img_path)]}
results = module.face_detection(data=input_dict)
print(results)

人像抠图,风格迁移模型都有

课节6:Day5-EasyDL体验与作业发布

综合大作业
第一步:爱奇艺《青春有你2》评论数据爬取(参考链接:https://www.iqiyi.com/v_19ryfkiv8w.html#curid=15068699100_9f9bab7e0d1e30c494622af777f4ba39) 爬取任意一期正片视频下评论评论条数不少于1000条。
第二步:词频统计并可视化展示
数据预处理:清理清洗评论中特殊字符(如:@#¥%、emoji表情符),清洗后结果存储为txt文档
中文分词:添加新增词(如:青你、奥利给、冲鸭),去除停用词(如:哦、因此、不然、也好、但是)
统计top10高频词
可视化展示高频词
第三步:绘制词云:根据词频生成词云可选项-添加背景图片,根据背景图片轮廓生成词云
第四步:结合PaddleHub,对评论进行内容审核

准备工作:

#查看第三方库安装位置
# matplotlib.__path__
# jieba.__path__
# Linux系统默认字体文件路径
# !ls /usr/share/fonts/
# 查看系统可用的ttf格式中文字体
!fc-list :lang=zh | grep ".ttf"
# !wget https://mydueros.cdn.bcebos.com/font/simhei.ttf # 下载中文字体
# #创建字体目录fonts
# !mkdir .fonts
# # 复制字体文件到该路径
# !cp simhei.ttf .fonts/
#安装模型
!hub install porn_detection_lstm==1.1.0
# !pip install --upgrade paddlehub

导入库

from __future__ import print_function
import requests
import json
import re #正则匹配
import time #时间处理模块
import jieba #中文分词
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
from PIL import Image
from wordcloud import WordCloud  #绘制词云模块
import paddlehub as hub

爬取数据

#请求爱奇艺评论接口,返回response信息
def getMovieinfo(url):
    '''
    请求爱奇艺评论接口,返回response信息
    参数  url: 评论的url
    :return: response信息
    '''
    session = requests.Session()
    headers = {
        "User-Agent": "Mozilla/5.0",
        "Accept": "application/json",
        "Referer": "http://m.iqiyi.com/v_19rqriflzg.html",
        "Origin": "http://m.iqiyi.com",
        "Host": "sns-comment.iqiyi.com",
        "Connection": "keep-alive",
        "Accept-Language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,zh-TW;q=0.6",
        "Accept-Encoding": "gzip, deflate"
    }
    response = session.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None

#解析json数据,获取评论
def saveMovieInfoToFile(lastId,arr):
    '''
    解析json数据,获取评论
    参数  lastId:最后一条评论ID  arr:存放文本的list
    :return: 新的lastId
    '''
    url = "https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&\
    agent_version=9.11.5&business_type=17&content_id=15068699100&page=&page_size=10&types=time&last_id="
    url += str(lastId)
    responseTxt = getMovieinfo(url)
    responseJson = json.loads(responseTxt)
    comments = responseJson['data']['comments']
    for val in comments:
        # print(val.keys())
        if 'content' in val.keys():
            # print(val['content'])
            arr.append(val['content'])
        lastId = str(val['id'])
    return lastId

对文本进行处理

#去除文本中特殊字符
def clear_special_char(content):
    '''
    正则处理特殊字符
    参数 content:原文本
    return: 清除后的文本
    '''
    s = re.sub(r"</?(.+?)>|&nbsp;|\t|\r", "", content)
    s = re.sub(r"\n", " ", s)
    s = re.sub('[^\u4e00-\u9fa5^a-z^A-Z^0-9]', '', s)

    return s

利用结巴进行分词

def fenci(text):
    '''
    利用jieba进行分词
    参数 text:需要分词的句子或文本
    return:分词结果
    '''
    jieba.load_userdict('add_words.txt') #添加自定义字典
    seg = jieba.lcut(text, cut_all=False)
    return seg

停用词处理

def stopwordslist(file_path):
    '''
    创建停用词表
    参数 file_path:停用词文本路径
    return:停用词list
    '''
    stopwords = [line.strip() for line in open(file_path, encoding='UTF-8').readlines()]
    return stopwords
def movestopwords(sentence,stopwords,counts):
    '''
    去除停用词,统计词频
    参数 file_path:停用词文本路径 stopwords:停用词list counts: 词频统计结果
    return:None
    '''
    out = []
    for word in sentence:
        if word not in stopwords:
            if len(word) != 1:
                counts[word] = counts.get(word,0) + 1
    return None

绘图部分练习:绘制词云统计表

ef drawcounts(counts,num):
    '''
    绘制词频统计表
    参数 counts: 词频统计结果 num:绘制topN
    return:none
    '''
    x_aixs = []
    y_aixs = []
    c_order = sorted(counts.items(), key=lambda x:x[1],reverse=True)
    # print(c_order)
    for c in c_order[:num]:
        x_aixs.append(c[0])
        y_aixs.append(c[1])
        
    # 设置显示中文
    matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
    matplotlib.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题
    plt.bar(x_aixs, y_aixs)
    plt.title('词频统计结果')
    plt.show()

绘制词云

def drawcloud(word_f):
    '''
    根据词频绘制词云图
    参数 word_f:统计出的词频结果
    return:none
    '''
    #加载背景图片
    cloud_mask = np.array(Image.open('cluod.png'))
    #忽略显示的词
    st=set(["东西","这是"])
    #生成wordcloud对象
    wc = WordCloud(background_color='white', 
    mask=cloud_mask,
    max_words=150,
    font_path='simhei.ttf',
    min_font_size=10,
    max_font_size=100, 
    width=400, 
    relative_scaling=0.3,
    stopwords=st)
    wc.fit_words(word_f)
    wc.to_file('pic.png')

PaddleHub练习

def text_detection(text,file_path):
    '''
    使用hub对评论进行内容分析
    return:none
    '''
    porn_detection_lstm = hub.Module(name="porn_detection_lstm")
    f = open('aqy.txt', 'r',encoding='utf-8')
    for line in f:
        if len(line.strip()) == 1:  #判断评论长度是否为1
            continue
        else:
            test_text.append(line)
    f.close()
    input_dict = {"text": test_text}
    results = porn_detection_lstm.detection(data=input_dict,use_gpu=True, batch_size=1)
    # print(results)
    for index, item in enumerate(results):
        if float(item['porn_probs']) > 0.95 :
            print(item['text'],':',item['porn_probs'])

脚本

#评论是多分页的,得多次请求爱奇艺的评论接口才能获取多页评论,有些评论含有表情、特殊字符之类的
#num 是页数,一页10条评论,假如爬取1000条评论,设置num=100
if __name__ == "__main__":
    num = 20
    lastId = '0' #lastId 是接口分页id
    arr = [] #arr是爬取的所有评论存放的数组
    with open('aqy.txt', 'a', encoding='utf-8') as f: #写文件是追加写的
        for i in range(num):
            lastId = saveMovieInfoToFile(lastId,arr)
            # print(i)
            time.sleep(0.5)#频繁访问爱奇艺接口,偶尔出现接口连接报错情况,睡眠0.5秒,增加每次访问间隔时间
        for item in arr:
            Item = clear_special_char(item)
            # print(Item)
            if Item.strip()!='':
                try:
                    f.write(Item+'\n')
                except  Exception as e:
                    print("含有特殊字符")
    print('共爬取评论:',len(arr))
    f = open('aqy.txt', 'r',encoding='utf-8')
    counts = {}
    for line in f:
        words = fenci(line)
        stopwords = stopwordslist('cn_stopwords.txt')
        movestopwords(words,stopwords,counts)

    drawcounts(counts,10) #绘制top10 高频词
    drawcloud(counts) #绘制词云
    f.close()
    
    '''
    使用hub对评论进行内容分析
    '''
    file_path = 'aqy.txt'
    test_text = []
    text_detection(test_text,file_path)
 
display(Image.open('pic.png')) #显示生成的词云图像

3. 培训心得与反省

1、7天打卡营给我们绘制了一个pyhon学习的蓝景图,将pyhon学习涉及到的方方面面的信息都展示了一下,给我们学习python起了个好头。
2、通过培训,深切的感受到自己的学习能力和处理问题的能力亟待加强。我面对问题时惯性心理是抗拒的,内心告诉自己,这里面有很多坑,一时半会肯定解决不了。但是这样自己始终浮于表面,应该沉下心来,一点一点的攻破。
3、每天坚持努力一下,终有一天可以胸有成竹。
在这里插入图片描述

4、致谢

1、感谢集训营给我们一个免费,高质量,高效率,强氛围的学习平台。
2、讲课的几个老师都是实力派,讲的都很好,尤其是文老师的代码风格,读您的代码,像是自己一步一步走了一遍心路历程,浮躁和杂念都放下了。
3、感谢班班,每天及时给我们上传视频,发布通知,统计信息。我通常临睡时,班班还在搞当晚的视频,第二天刚醒,班班又在发新的通知,让我一度怀疑,班班是不是不睡觉,太拼了。

5、后续

爬虫专题
正则表达式专题

需要整理的内容较多,后续开新帖整理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值