当前位置: 首页 > article >正文

【Python爬虫(1)】专栏开篇:夯实Python基础

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。

目录

  • 一、引言
  • 二、Python 语法基础
    • 2.1 变量
    • 2.2 数据类型
    • 2.3 运算符
  • 三、流程控制语句
    • 3.1 if-else 语句
    • 3.2 for 循环
    • 3.3 while 循环
  • 四、函数的定义与使用
    • 4.1 函数定义
    • 4.2 函数调用
    • 4.3 函数参数
    • 4.4 局部变量和全局变量
  • 五、总结


一、引言

在如今这个数据驱动的时代,数据就如同宝贵的资源,而 Python 爬虫则是获取这些资源的有力工具。无论是从网页中提取新闻资讯、从电商平台获取商品信息,还是从社交媒体收集用户评论,Python 爬虫都能大显身手。

然而,要想熟练掌握 Python 爬虫技术,扎实的 Python 基础是必不可少的。这就好比建造高楼大厦,Python 基础就是那稳固的基石。只有打好了这个基础,我们才能在爬虫的学习道路上稳步前行,理解并运用各种爬虫技术和框架。接下来,就让我们一起回顾那些重要的 Python 基础知识吧。

二、Python 语法基础

2.1 变量

在 Python 中,变量就像是一个标签,我们可以把数据贴在这个标签上,方便后续使用。变量的命名需要遵循一定的规则:

  • 首先,变量名必须以字母或者下划线开头,后续字符可以是字母、数字或者下划线 ,比如my_variable、_name、count123都是合法的变量名,而2hello、my-var就是不合法的。
  • 同时,我们不能使用 Python 的保留字(关键字)作为变量名,像if、for、while这些都是保留字,是不能用来命名变量的。
  • 此外,为了提高代码的可读性,我们尽量使用有意义的名字作为变量名,比如用age表示年龄,name表示姓名,而不是用单个字母a、n等。

变量的赋值使用等号=,比如age = 20,这就把整数 20 赋值给了变量age,之后我们使用age时,就相当于使用 20 这个值。Python 是动态类型语言,变量不需要预先声明类型,它会根据赋值自动确定类型。我们还可以在一行内给多个变量赋值,如x = y = z = 0,这样x、y、z都被赋值为 0;也可以同时给多个不同变量赋不同的值,a, b, c = 1, 2, “hello”,此时a为 1,b为 2,c为"hello"。

2.2 数据类型

  1. 整型(int):用来表示整数,没有小数部分,如age = 25,count = -10。在 Python 中,整型的范围很大,基本可以满足我们日常的计算需求。
  2. 浮点型(float):表示带有小数部分的数字,比如pi = 3.14,salary = 5000.5 。需要注意的是,浮点数在计算机中存储时可能存在精度问题,例如0.1 + 0.2在数学上等于0.3,但在 Python 中输出结果可能是0.30000000000000004,这是因为浮点数在计算机中是以二进制形式存储的,某些十进制小数无法精确地用二进制表示。
  3. 布尔型(bool):只有两个值,True和False,常用于条件判断和逻辑运算。比如is_student = True,is_adult = False 。在 Python 中,True本质上是 1,False本质上是 0,所以布尔型也可以参与一些算术运算,如True + 1结果为 2,False + 5结果为 5。
  4. 字符串(str):由一系列字符组成,用于表示文本数据。可以用单引号(‘)、双引号(")或三引号(’'‘或"“”)括起来,比如name = ‘Alice’,message = “Hello, World!”,poem = “”“This is a multi - line poem.
    It has multiple lines.
    “”” 。字符串支持很多操作,如拼接first_name = “John”,last_name = “Doe”,full_name = first_name + " " + last_name,此时full_name的值为"John Doe";还可以通过索引获取单个字符,message[0]得到的是’H’ 。
  5. 列表(list):是一种可变的有序序列,可以包含多个不同类型的元素,用方括号[]表示 ,如fruits = [‘apple’, ‘banana’, ‘cherry’],numbers = [1, 2, 3, 4],mixed = [1, ‘two’, 3.5, True] 。列表可以通过索引访问元素,fruits[0]得到’apple’ ,也可以通过append()方法添加元素,fruits.append(‘date’),此时fruits变为[‘apple’, ‘banana’, ‘cherry’, ‘date’] ,还可以使用del语句删除元素,del fruits[1],fruits就变为[‘apple’, ‘cherry’, ‘date’] 。
  6. 元组(tuple):与列表类似,也是有序的序列,但元组是不可变的,一旦创建就不能修改其内容,用圆括号()表示,例如coordinates = (10, 20),colors = (‘red’, ‘green’, ‘blue’) 。虽然元组不能修改元素,但可以通过索引访问元素,coordinates[0]得到 10。元组通常用于存储一些固定的数据,比如坐标、日期等。
  7. 字典(dict):是一种可变的无序映射类型,用于存储键值对,用花括号{}表示,每个键值对之间用冒号:分隔,不同键值对之间用逗号,分隔,如person = {‘name’: ‘Bob’, ‘age’: 30, ‘city’: ‘New York’} 。可以通过键来访问对应的值,person[‘name’]得到’Bob’ ,也可以修改值person[‘age’] = 31 ,还能添加新的键值对person[‘job’] = ‘Engineer’ 。
  8. 集合(set):是一个无序的、不包含重复元素的集合,用花括号{}或set()函数来定义,如nums = {1, 2, 3, 3, 4},实际存储的nums为{1, 2, 3, 4} ,重复的 3 被自动去除了。集合可以进行交集、并集、差集等运算,set1 = {1, 2, 3},set2 = {3, 4, 5},set1.intersection(set2)得到{3} ,set1.union(set2)得到{1, 2, 3, 4, 5} ,set1.difference(set2)得到{1, 2} 。

2.3 运算符

  1. 算术运算符:用于基本的数学运算,包括+(加)、-(减)、*(乘)、/(除)、%(取模,即取除法的余数)、**(幂运算)、//(取整除,返回商的整数部分)。例如:
a = 10
b = 3
print(a + b)  # 输出13
print(a - b)  # 输出7
print(a * b)  # 输出30
print(a / b)  # 输出3.3333333333333335
print(a % b)  # 输出1
print(a ** b)  # 输出1000
print(a // b)  # 输出3
  1. 比较运算符:用于比较两个值的大小或是否相等,返回布尔值True或False ,包括==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。例如:
x = 5
y = 8
print(x == y)  # 输出False
print(x!= y)  # 输出True
print(x > y)  # 输出False
print(x < y)  # 输出True
print(x >= y)  # 输出False
print(x <= y)  # 输出True
  1. 逻辑运算符:用于逻辑运算,返回布尔值,包括and(与)、or(或)、not(非) 。and表示两个条件都为True时,结果才为True;or表示只要有一个条件为True,结果就为True;not用于反转条件的值。例如:
condition1 = True
condition2 = False
print(condition1 and condition2)  # 输出False
print(condition1 or condition2)  # 输出True
print(not condition1)  # 输出False
  1. 位运算符:对二进制位进行操作,包括&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移位)、>>(右移位)。例如:
a = 5  # 二进制为0101
b = 3  # 二进制为0011
print(a & b)  # 输出1,二进制为0001
print(a | b)  # 输出7,二进制为0111
print(a ^ b)  # 输出6,二进制为0110
print(~a)  # 输出-6,二进制为11111010(补码形式)
print(a << 1)  # 输出10,二进制为1010
print(a >> 1)  # 输出2,二进制为0010
  1. 赋值运算符:用于给变量赋值,最基本的是=,还有一些复合赋值运算符,如+=(加法赋值)、-=(减法赋值)、*=(乘法赋值)、/=(除法赋值)、%=(取模赋值)、**=(幂赋值)、//=(取整除赋值)。例如:
x = 10
x += 5  # 相当于x = x + 5,此时x的值为15
x -= 3  # 相当于x = x - 3,此时x的值为12
x *= 2  # 相当于x = x * 2,此时x的值为24
x /= 4  # 相当于x = x / 4,此时x的值为6.0

三、流程控制语句

流程控制语句是编程语言的重要组成部分,它允许我们根据不同的条件执行不同的代码块,或者重复执行一段代码。在 Python 中,主要的流程控制语句有if-else语句、for循环和while循环。

3.1 if-else 语句

if-else语句用于根据条件来决定执行哪部分代码,它有三种常见的形式:单分支、双分支和多分支

  1. 单分支
    • 语法:
if 条件表达式:
    语句块
    • 说明:当条件表达式的值为True时,执行语句块中的代码;否则,跳过语句块。
    • 示例:判断一个数是否大于 10。
num = 15
if num > 10:
    print(f"{num} 大于10")
  1. 双分支
    • 语法:
if 条件表达式:
    语句块1
else:
    语句块2
    • 说明:如果条件表达式的值为True,执行语句块 1;否则,执行语句块 2。
    • 示例:判断一个数是奇数还是偶数。
num = 8
if num % 2 == 0:
    print(f"{num} 是偶数")
else:
    print(f"{num} 是奇数")
  1. 多分支
    • 语法:
if 条件表达式1:
    语句块1
elif 条件表达式2:
    语句块2
...
else:
    语句块n
    • 说明:依次判断条件表达式的值,当某个条件表达式为True时,执行对应的语句块,然后跳过整个if-elif-else结构;如果所有条件表达式都为False,则执行else中的语句块(else部分可选)。
    • 示例:根据学生的成绩给出不同的等级评定。
score = 75
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 70:
    print("中等")
elif score >= 60:
    print("及格")
else:
    print("不及格")

3.2 for 循环

for循环用于遍历可迭代对象(如列表、元组、字符串等)中的每个元素,并对每个元素执行相同的操作。

  • 基本语法
for 变量 in 可迭代对象:
    语句块
    • 说明:依次从可迭代对象中取出每个元素,赋值给变量,然后执行语句块中的代码,直到可迭代对象中的所有元素都被遍历完。
    • 示例:遍历列表并打印每个元素。
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
  • 结合 range () 函数使用:range()函数可以生成一个整数序列,常与for循环结合使用来实现指定次数的循环。
    • 语法:range(start, stop, step),其中start是起始值(默认为 0),stop是结束值(不包含在序列中),step是步长(默认为 1)。
    • 示例:打印 0 到 4 的数字。
for i in range(5):
    print(i)
    • 示例:打印 1 到 10 之间的偶数。
for i in range(2, 11, 2):
    print(i)
  • break 和 continue 语句:在for循环中,break语句用于立即终止循环,continue语句用于跳过当前循环的剩余部分,直接进入下一次循环。
    • 示例:使用break语句提前结束循环。
for num in range(1, 10):
    if num == 5:
        break
    print(num)
    • 示例:使用continue语句跳过某些元素。
for num in range(1, 10):
    if num % 2 == 0:
        continue
    print(num)

3.3 while 循环

while循环会在条件表达式为True时,重复执行语句块。

  • 语法:
while 条件表达式:
    语句块
    • 说明:首先判断条件表达式的值,如果为True,则执行语句块,然后再次判断条件表达式,如此循环,直到条件表达式的值为False。
    • 示例:计算 1 到 10 的累加和。
sum_num = 0
i = 1
while i <= 10:
    sum_num += i
    i += 1
print(f"1到10的累加和为: {sum_num}")
  • break 和 continue 语句:在while循环中,break和continue语句的作用与在for循环中相同。
    • 示例:使用break语句在满足条件时终止循环。
i = 1
while True:
    if i == 5:
        break
    print(i)
    i += 1
    • 示例:使用continue语句跳过某些循环。
i = 0
while i < 10:
    i += 1
    if i % 2 == 0:
        continue
    print(i)

四、函数的定义与使用

在 Python 中,函数是组织好的、可重复使用的代码块,用于实现特定的功能。它可以提高代码的复用性和可维护性,让我们的编程工作更加高效。

4.1 函数定义

函数定义使用def关键字,其基本语法如下:

def 函数名(参数列表):
    """函数文档字符串,用于描述函数的功能和使用方法"""
    函数体
    return 返回值
  • 参数列表:可以包含零个或多个参数,参数之间用逗号,分隔。参数是函数接收外部传入数据的变量,通过参数,函数可以处理不同的数据。
  • 函数体:包含了实现函数功能的一系列语句,是函数的核心部分。
  • return 语句:用于返回函数的执行结果,是可选的。如果没有return语句,函数会默认返回None。

例如,定义一个简单的函数,用于计算两个数的和:

def add_numbers(a, b):
    """
    该函数用于计算两个数的和
    :param a: 第一个数
    :param b: 第二个数
    :return: 两个数的和
    """
    result = a + b
    return result

在这个例子中,add_numbers是函数名,a和b是参数,函数体计算了a和b的和并将结果通过return返回。

4.2 函数调用

函数定义好后,就可以通过函数调用来执行其中的代码。调用函数时,使用函数名加上括号,括号内传入实际的参数值(如果有参数的话)。

例如,调用上面定义的add_numbers函数:

sum_result = add_numbers(3, 5)
print(sum_result)  # 输出8

在这个例子中,add_numbers(3, 5)就是函数调用,3和5是实际传入的参数值,函数执行后返回的结果赋值给了sum_result变量,然后打印出结果。

函数调用时,参数的传递方式有两种

  1. 按位置传参:按照参数定义的顺序依次传入参数值,如上面的add_numbers(3, 5),3对应参数a,5对应参数b。
  2. 按名称传参:通过参数名来指定参数值,这种方式可以不按照参数定义的顺序传参 ,例如add_numbers(b = 5, a = 3),结果与按位置传参相同。

4.3 函数参数

  1. 必备参数:调用函数时必须传入的参数,数量和顺序都要与函数定义时一致,否则会报错。例如上面的add_numbers函数,a和b就是必备参数。
  2. 默认参数:在定义函数时可以为参数指定默认值,调用函数时如果没有传入该参数的值,就会使用默认值。例如:
def greet(name, greeting = "Hello"):
    """
    该函数用于向某人打招呼
    :param name: 姓名
    :param greeting: 问候语,默认为"Hello"
    :return: 打招呼的字符串
    """
    message = f"{greeting}, {name}!"
    return message

调用这个函数时,可以只传入name参数:

print(greet("Alice"))  # 输出Hello, Alice!

也可以传入greeting参数来覆盖默认值:

print(greet("Bob", "Hi"))  # 输出Hi, Bob!
  1. 不定长参数
  • *args:用于接收任意数量的位置参数,这些参数会被收集成一个元组。例如:
def print_numbers(*args):
    for num in args:
        print(num)


print_numbers(1, 2, 3, 4)
  • **kwargs:用于接收任意数量的关键字参数,这些参数会被收集成一个字典。例如:
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")


print_info(name="Alice", age=25, city="New York")

4.4 局部变量和全局变量

  1. 局部变量:在函数内部定义的变量,只在函数内部有效,函数执行结束后,局部变量就会被销毁。例如:
def my_function():
    local_var = 10  # 局部变量
    print(local_var)


my_function()
# print(local_var)  # 这行会报错,因为local_var在函数外不可见
  1. 全局变量:在函数外部定义的变量,在整个程序中都可以访问。例如:
global_var = 20  # 全局变量


def my_function():
    print(global_var)


my_function()
print(global_var)

在函数内部修改全局变量时,需要使用global关键字声明,否则 Python 会认为是在创建一个新的局部变量。例如:

global_var = 30


def modify_global():
    global global_var
    global_var = 40
    print(global_var)


modify_global()
print(global_var)

如果不使用global关键字,像下面这样:

global_var = 50


def modify_global():
    global_var = 60  # 创建了一个新的局部变量,而不是修改全局变量
    print(global_var)


modify_global()
print(global_var)  # 输出50,因为全局变量没有被修改

五、总结

通过以上对 Python 基础语法的回顾,我们复习了变量、数据类型、运算符、流程控制语句以及函数的定义与使用等重要知识点。这些基础内容是我们学习 Python 爬虫的基石,只有熟练掌握它们,才能更好地理解和运用后续的爬虫技术。

在后续的爬虫学习中,我们会频繁地使用这些基础知识。比如在处理网页数据时,可能会用到字符串操作来提取有用信息,使用列表和字典来存储数据;在编写爬虫逻辑时,会运用流程控制语句来判断网页状态、决定爬取策略,使用函数来封装一些重复的操作,提高代码的复用性。

所以,建议大家在学习爬虫之前,一定要花时间巩固这些 Python 基础知识。可以通过做练习题、阅读优秀的 Python 代码示例等方式来加深理解和记忆。只有基础扎实了,我们在爬虫的学习道路上才能走得更远、更稳。


http://www.kler.cn/a/548082.html

相关文章:

  • 服务器被暴力破解的一次小记录
  • 【Docker】Docker中卷的类型、区别及应用
  • 8、k8s的pv和pvc
  • 小白零基础如何用cursor
  • electron打包基本教程
  • 电解电容的参数指标
  • DevOps自动化部署详解:从理念到实践
  • Android车机DIY开发之软件篇(十六)编译forlinx i.mx8mplus Android
  • Next.js国际化:next-i18next
  • 【C】初阶数据结构4 -- 双向循环链表
  • Python PyCharm DeepSeek接入
  • LeetCode1706
  • Windows环境下使用Ollama搭建本地AI大模型教程
  • 平面与平面相交算法杂谈
  • flink实时集成利器 - apache seatunnel - 核心架构详解
  • 文心一言还有哪些待优化的地方
  • [leetcode] 动态规划 - 最大子数组和
  • 【拒绝算法PUA】LeetCode 1742. 盒子中小球的最大数量
  • es和kibana安装
  • 【大疆无人机地图测绘技术学习:高精度、高效率的全流程解决方案】