1.python爬虫入门实战课
网络爬虫(英语:Web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。
1.1爬虫可以胜任的工作
抓取视频、抓取文本、抓取图片、抓取音乐。
通过爬虫获取数据可以进行市场调研和数据分析,可以作为机器学习和数据挖掘的原始数据。
1.2掌握爬虫后,下面哪些工作可以自动化完成
数据收集、数据分析、下载视频等
1.3使用Python编写爬虫的优点
上手入门简单
丰富第三方库
语法简单
2.python基本介绍
Python是荷兰计算机科学家Guido van Rossum 发明的一款解释型、强类型、动态的、支持对象的高级程序设计语言。
初期 Python 仅仅是个人项目,现在已经发展成了时下最热门的编程语言之一,2020 年初在 TIOBE 榜单稳定排第三。Python 在人工智能的应用领域占领绝对优势。
Python 是解释性语言,非常适合作为入门的程序设计语言,它无须编译,编写完成即可运行。
尽管 Python 是动态语言,但它的数据类型是强类型的,避免了像JS这样过分动态为初学者带来各种奇怪的困惑。
2.1python的优势
简而言之,python有三大优势:
入门简单
Python 语法简单,核心关键字数量较少,结构清晰。为了达到结构清晰的目的,Python 用代码缩进来表达程序结构,在一般的编程语言,缩进往往只是一种美化代码的方法。这一点非常适合强迫症用户(处女座的应该喜欢😋)。
丰富的标准库
Python 内置的标准模块非常丰富,可以满足一般科学计算、文本处理、后端服务等需求,Python 甚至内置了一个 Demo 性质 HTTP 服务器。用户可以借助一个丰富的标准库,用较少的代码就可以构建一个规模较大的应用。对语言流行的助力是非常大的。
生态优秀
Python 在 Web 框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志、代码分析等领域都有非常高质量的模块和库。使用高质量的库进行开发,系统中的坑自然会少很多。
2.2python的缺点
Python 对 CPU 的利用效率的确有限。
其次,Python 程序运行期间难以精确控制内存占用,在使用内置类库来处理大规模数据的时候,占用的内存可能越来大,引起 OOM(Out Of Memory, 内存溢出) 问题。
3.python操作入门
3.1. Python注释
注释 的目的是让阅读者能够轻松读懂每一行代码的意义,同时也为后期代码维护提供便利。在 Python 中,单行注释以#
号开头,如下所示。
# 第一个注释
print('hello world')
注意:不符合Python的注释规则-多行注释以"开头和结尾
3.2Python变量
1.变量赋值
Python 的变量无须提前声明,赋值的同时也就声明了变量,如下面代码:
a = 42
print(a)
2.变量命名
Python 中具有自带的关键字(保留字),任何变量名不能与之相同。在 Python 的标准库中提供了一个 keyword
模块,可以查阅当前版本的所有关键字,如下所示。
import keyword
print(keyword.kwlist)
输出为:
['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
4.python数字与字符串
Python 数据类型
在 Python 中有 6 大数据类型:
- number(数字)
- string(字符串)
- list(列表)
- tuple(元组)
- set(集合)
- dictionary(字典)。
Python3支持4种类型的数字:
- int(整数类型)
- float(浮点类型)
- bool(布尔类型)
- complex(复数类型)
5.python复杂数据类型
5.1列表list
前一节我们回顾了Python中最基本的数字及字符串,但数字及字符串还不足以帮我们解决复杂的问题。
在真实的编程中其他4个数据类型list(列表)、tuple(元组) 、set(集合)、 dictionary(字典) 可谓是python中的大杀器,用好了,可以快速解决很多问题。
接下来我们还是简单回顾下此四种复杂数据类型的基本知识,如果想要深入学习请移步我们出的Python 入门课程。
列表格式
Python 列表是任意对象的有序集合,写在中括号[]
里,元素之间用逗号,
隔开。这里的任意对象,既可以是列表,也可以是字符串,如下所示:
a_list = [1, 2, '12', [1, 2, '12']]
print(a_list)
输出为:[1, 2, '12', [1, 2, '12']]
。
列表切片
每个列表中的元素从0开始计数,如下代码可以选取列表中的第一个元素:
a_list = [1, 2, '12', [1, 2, '12']]
print(a_list[0])
输出为:1
。
列表删除操作可以使用 remove()
方法,只需要在变量名称后面加一个点号,就可以轻松调用。
如果你是用pycharm作为IDE有自动联想功能,选中目标方法或函数,按【Tab】键即可快速键入,如下图.
以下代码用于删除第3个元素,并用 print()
函数将结果打印出来。其中 remove()
方法用于删除列表的元素。
a_list = [1, 2, '12', [1, 2, '12']]
a_list.remove('12')
print(a_list)
输出为:[1, 2, [1, 2, '12']]
。
注意:
remove()
方法传入的是列表元素的值,不是下标,并且只会删除出现的第一个,如果传入的值不在列表中,会报错。
5.2元组tuple
元组与列表类似,也是任意对象的有序集合,不同之处在于元组的元素不能修改。元组写在小括号()
里,元素之间用逗号,
隔开,如下所示:
a_tuple = (1, 2, '12', (1, 2, '12'))
print(a_tuple)
print(a_tuple[0])
print(a_tuple[1:3])
(1, 2, '12', (1, 2, '12'))
1
(2, '12')
如果你用pycharm对变量a_tuple
进行联想提示,会发现没有一个方法可以修改元组本身,如下图
5.3集合set
集合是一个无序、不重复元素序列,可以使用大括号{}
或 set()
函数创建集合。需要注意的是,一个空集合必须使用set()
函数创建而不能使用大括号{}
,因为大括号{}
是用来创建空字典的,如下所示:
age0 = {18,19,20,21}
age1 = set({18,19,20,21})
empty_set = set() #空集合,必须用set()
print(age0)
print(age1)
print(empty_set)
输出为:
{18, 19, 20, 21}
{18, 19, 20, 21}
set()
集合是可以修改的,并且提供了很多内置运算如计算两个集合的交、并、差集合。
5.4字典dict
字典是一种可变容器模型,且可存储任意类型的对象,用{}
标识。字典是一个无序的键key
值value
对的集合,格式为:a_dict={key1:v1, key2:v2, key3:v3}
比如下面代码创建一个字典:
a_dict = {
'k1': 1,
'k2': 2,
'k3': 3
}
print(a_dict)
输出为:{'k1': 1, 'k2': 2, 'k3': 3}
当字典增加数据时,可以使用下面的方法。
a_dict = {
'k1': 1,
'k2': 2,
'k3': 3
}
# 增加一个键值对
a_dict['k4'] = 4
print(a_dict)
输出为:{'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
当字典删除数据时,可以使用 del()
函数,代码如下:
a_dict = {
'k1': 1,
'k2': 2,
'k3': 3
}
# 增加一个键值对
a_dict['k4'] = 4
# 删除一个键值对
del a_dict['k1']
print(a_dict)
输出为: {'k2': 2, 'k3': 3, 'k4': 4}
6.python语句与函数
在python主要使用if-elif-else
语句进行条件控制。
假设登录验证操作,首先给变量 password
(密码)赋值,然后判断 password
是否正确,正确就打印"login success!"
(登录成功!),错误就打印"wrong password"
(密码错误)。
password='12345'
if password == '12345':
print("login success!")
else:
print("wrong password")
在 Python 中判断是否相等可以使用两个等号==
(单个等号表示赋值)。 条件语句的语法如下:
if 条件判断1:
执行语句...
elif 条件判断1:
执行语句..
elif ...
...
else:
都不满足上上述条件判断,执行语句
6.python语句及函数
6.1条件语句
完善函数sorta_num
,给定2个int
数a
和b
,并返回它们的和。但是如果和在[10,19]
之间,则直接返回20
.
def sorta_sum(a, b):
ab_sum = a + b
10 <= <= 19:
return 20
return ab_sum
6.2循环语句
在 Python 中要注意缩进,循环语句根据缩进来判断执行语句的归属。
下面用 for 语句实现 1~9 的累加。
sum = 0
for i in range(1,10, 1): #注意不包含10
sum += i
print(sum)
输出结果为:45
其中 range
表示范围,i 从 1(第1个参数)开始迭代,每次加1(第3个参数),直到 i 变成了 10(第 2 个参数)结束,因此当 i=10 时不执行语句,for 循环是 9 次迭代
for 语法如下:
for 迭代变量 in 迭代次数:
执行语句...
如果是列表或字典,则不用 range()
函数,直接用列表或字典,此时 i 表示列表或字典中的元素,代码如下:
a_list = [1,2,3,4,5,6,7,8,9]
sum = 0
for i in a_list:
print(i)
输出为:
1
2
3
4
5
6
7
8
9
6.3函数
在之前接触的函数中,print()
是将结果打印出来的函数,int()
是将字符串类型转换成数据类型的函数。类似这种函数,统称为内建函数,内建函数可以直接调用。
有内就有外,外建函数其实就是通常所讲的自定义函数。
自定义函数的语法如下:
def 函数名(参数列表):
定义过程...
return 返回值
def
(define,定义)是创建函数的方法,下面用 def 创建方程:y=5x+2
:
def y(x):
return 5*x + 2
print(y(1))
print(y(2))
输出为:
7
12
7.python进阶
总结函数
通过前面的学习,我们学到了:
- Python基本的语法知识,如注释、缩进、变量定义
- Python中6大基础数据类型(可以回忆下是哪些),
- Python中基本的条件、循环、函数相关知识
这些基本的知识是Python编程的核心基石,有了它们基本可以编写Python程序,但如果要编写一个比较完善的爬虫程序,还需要了解一些更深入的特性,所以接下来我们将前面的知识融会贯通下,顺便学习下Python中一些高级的用法。
假设有个文件p2.py
代码如下:
#! env python
def log(s):
print(s)
log('hello file')
if __name__ == '__main__':
log('hello main')
用 def
指令,可以定义一个函数/方法。冒号:
缩进下的代码是函数体。缩进在 Python 中是严格限制的,不能使用一些比较落后的文本编辑器对 Python 代码进行格式化,因为它们可能会破坏程序结构。建议使用pycharm编辑器,并选择 2 个或者 4 个空格做代码缩进。
函数自然是相对封闭的,在函数体内创建的变量,只能在函数体内可见。
运行 python p2.py
,打印出两行日志:
hello file
hello main
模块
模块是 Python 代码组织单元,如下使用内置模块 datetime
:
import datetime
print(datetime.datetime.now())
在 Python中可以用 dir
方法来列举模块内的所有成员(类/对象/方法):
import datetime
print(dir(datetime))
输出为:['MAXYEAR', 'MINYEAR', '__doc__', '__file__', '__name__', '__package__', 'date', 'datetime', 'datetime_CAPI', 'time', 'timedelta', 'tzinfo']
最简单的模块是一个.py
文件,上面p2.py
文件就可以作为自定义模块引入,如下在python交互命令行中引入上述模块
➜ python3 Python 3.8.5 (default, Jul 21 2020, 10:48:26)
[Clang 11.0.3 (clang-1103.0.32.62)] on darwin
Type "help", "copyright", "credits" or "license" for more information. >>> import p2
hello file
看到屏幕只打印了 hello file
,和直接运行 python p2.py
不同。
原因是模块内置变量 __name__
是随着运行环境改变的,当模块 p2
被作为运行入口时,它是的值是 'main';当被其他模块引入时,它的取值是 p2
。
可以在解释器中检查:
>>> print(p2.__name__)
p2
dir
查看一下,p2
模块的 log
方法被导出。
>>> dir(p2) ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'log']
不仅模块方法可以导出,模块变量也可以导出。 模块的更上一层管理结构是包,多个相关的模块可以组成一个包来发布
模块
请在代码创建一个当前日期的变量current_time
并且用datetime.now()
语句 赋值,然后打印看下其输出。
from datetime import datetime
current_time = datetime.now()
print(current_time)
类及面向对象
Python 是支持面向对象的,以非常直观的方法绑定对象的方式来组织面向对象的代码。
用 class
指令来定义类:
class Logger:
def __init__(self, level):
self.log_method = print
self.level = level
def log(self, s):
self.log_method(s)
if __name__ == '__main__':
mylog = Logger(0)
mylog.log('in main')
_init_
是构造方法,log
是自定义方法。和 C++/Java 不同,两个方法都必须把方法绑定的对象明显列出,就是上面的 self
对象。self
不是关键字,只是 Python 老铁的一个约定习惯,用 this
和 me
等名字也可以。在调用对象的方法时,对象已经绑定了,参数列表不需要再给出对象本身
注意:虽然 Python 可以说一切皆对象,使用 Python 进行编程不强求使用面向对象的思维。可以根据自己的水平和解决问题的类型采取合适的程序架构。
至此,用 Python 实现爬虫的知识准备已经足够👏