Ch1 Python零基础语法入门

概要


本文我想拣些使用频率相对高些的基础语法来讲讲,权当作备忘录了吧。

类别:

  • Python 和 Pycharm的安装
  • 变量和字符串
  • 函数与控制语句:Python循环、判断语句
  • Python数据结构:列表、字典、元组和集合
  • Python文件操作:使用Python建立文件并写入数据
  • Python面向对象:类的定义和使用方法。

正文


1. Python安装

当前主流的Python版本为2.x3.x。由于Python 2 第三方库更多(很多库没有向Python 3转移),企业普遍使用Python 2。如果作为学习和研究的话,建议使用Phthon 3。

Win 7下安装Python 3.7 就直接参照我另一篇简文:安装Python 3.7

Linux下安装Python 3

大部分Linux系统内置了Python 2 和Python 3 ,通过在终端输入python -version
可以查看当前Python 3的版本。如果需要安装某个特定版本的Python,可以在终端中输入:

sudo apt-get install python3.7

2. 变量和字符串

由于Python爬虫的对象大部分为文本,所以字符串的用法尤为重要。

在Python中,字符串由双引号或单引号和引号中的字符组成。

首先看看字符串的“加法”:

a = 'I'
b = ' love'
c = ' Python'
print(a + b + c)

在爬虫代码中,会经常构造URL
例如:在爬取一个网页链接时,只有一部分/u/9104ebf5e177,这部分链接是无法访问的,还需要“http://www.jianshu.com”,这时可以通过字符串的加法进行合并。

Python 的字符串不仅可以相加,也可以乘以一个数字

a = "word"
print(a * 3)
#wordwordword

字符串乘以一个数字,表示字符串复制的份数。

3.字符串的切片和索引

字符串的切片和索引就是通过string[x],获取字符串的一部分信息:

a = "I love Python"
print(a[0])
#I
print(a[0:5])
#I lov
print(a[-1])
#n

在爬虫实战中,经常会通过字符串的切片和索引,提取需要的部分,剔除一些不需要的部分。

4.字符串方法

Python作为面向对象的语言,每个对象都有相应的方法,字符串也一样,拥有多种方法,在这里介绍爬虫技术中常用的几种方法。

① split()方法

a = "www.baidu.com"
print(a.split("."))
#['www', 'baidu', 'com']

字符串的split()方法就是通过给定的分隔符('.'),将一个字符串分割为一个列表

如果没有提供任何分隔符,程序会把所有的空格作为分隔符(空格、制表、换行等)

② replace()方法

a = "there is apples"
b = a.replace("is", "are")
print(b)
#there are apples

这种方法类似于文本中的“查找和替换”功能。

③ strip()方法

a = "python is cool "
print(a.strip())
#python is cool

strip()方法返回去除两侧(不包含内部)空格的字符串,也可以指定需要去除的字符。将它们列为参数中即可。

a = "***python *is * good***"
print(a.strip('*'))
#python *is * good

这个方法只能去除两侧的字符,在爬虫得到的文本中,文本两侧常会有多余的空格,只需使用字符串的strip()方法即可去除多余的空格部分。

④format()方法

最后再讲解下好用的字符串格式化符,首先看以下代码:

a = "{} is my love".format('Python')
print(a)
#Python is my love

字符串格式化符就像是做选择题,留了空给做题者选择。

在爬虫过程中,有些网页链接的部分参数是可变的,这时使用字符串格式化符可以减少代码的使用量。

例如:Pexels素材网(https://www.pexels.com/),当搜索图片时,网页链接也会发生变化,如在搜索栏中输入“book”,网页跳转为“https://www.pexels.com/search/book/”,可以设计如下代码,笔者只需输入搜索内容,便可返回网页链接。

content = input("请输入搜索内容:")
url_path = 'https://www.pexels.com/search/{}/'.format(content)
print(url_path)
#https://www.pexels.com/search/book/

介绍Python的判断和循环两种爬虫技术中常用的控制语句

1.函数

Python中定义函数的方法:

def 函数名(参数1,参数2...):
    return "结果"

制作一个输入直角边就能计算出直角三角形的面积函数:

def function(a, b):
    return 1 / 2 * a * b

print(function(1, 2))

来做一个综合练习,读者都知道网上的电话号码 156****9354,中间的数值使用其他符号代替了,而用户输入的时候是完整地输入,下面通过使用函数来实现这个功能:

def change_number(number):
    hiding_number = number.replace(number[3:7], '*' * 4)
    print(hiding_number)


change_number("15674439354")
#156****9354

2.判断语句

在爬虫实战中也会经常使用判断语句,Python的判断语句格式如下:

if condition:
    pass
else:
    pass
#冒号和缩进不要忘记了

#再看一下多重条件的格式
if condition:
    pass
elif condition:
    pass
else:
    pass

在平时使用密码时,输入的密码正确即可登录,密码错误时就需要再次输入密码。

def count_login():
    password = input("password:")
    if password == '12345':
        print("输入成功!")
    else:
        print("错误,再输入:")
        count_login()


count_login()

3.循环语句

Python的循环语句包括for循环和while循环,代码如下:

#for 循环
for item in iterable:
    pass
#item表示元素,iterable是集合
for i in range(1,11):
    print(i)
#输出1到10间的整数
#while 循环
while condition:
    pass

例如,设计一个小程序,计算1~100的和:

i = 0
sum = 0

while i < 100:
    i += 1
    sum += i
print(sum)
#5050

Python 数据结构是存放数据的容器。

1.列表

在爬虫实战中,使用最多的就是列表数据结构,不论是构造出的多个URL,还是爬取到的数据,大多数都为列表数据结构。

下面首先介绍列表最显著的特征:

  • 列表中的每一个元素都是可变的。

  • 列表的元素是都是有序的,也就是说每个元素都有对应的位置(类似字符串的切片和索引)

  • 列表可以容纳所有的对象

列表中的每个元素都是可变的,这意味着可以对列表进行增删改操作,这些操作在爬虫中很少使用,因此不再给读者添加知识负担。

list = ["peter", "lilei", "wangwu", "xiaoming"]
print(list[0])
print(list[2:])
#peter
#['wangwu', 'xiaoming']

如果为切片,返回的也是列表的数据结构。

列表可以容纳所有的对象

list = [1, 1.1, 'string', print(1), True, [1, 2], {'key', 'value'}]

列表中会经常使用到多重循环,因此有必要了解和使用多重循环。现在有两个列表,分别是姓名和年龄的列表:

names = ['xiaoming', 'wangwu', 'peter']
ages = [23, 15, 58]

这时可以通过多重循环让 name 和 age 同时打印在屏幕上

names = ['xiaoming', 'wangwu', 'peter']
ages = [23, 15, 58]
for name, age in zip(names, ages):
    print(name, age)
#xiaoming 23
#wangwu 15
#peter 58

在爬虫中,经常请求多个网页,通常情况下会把网页存到列表中,然后循环依次取出并访问爬取数据。这些网页都有一定的规律,如果是手动将这些网页URL存入到列表中,不仅花费太多时间,也会造成代码冗余。这时可通过列表推导式,构造出这样的列表,例如某个网站每页的URL是这样的(一共13页)

http://bj.xiaozhu.com/search-duanzufang-p1-0/
http://bj.xiaozhu.com/search-duanzufang-p2-0/
http://bj.xiaozhu.com/search-duanzufang-p3-0/
http://bj.xiaozhu.com/search-duanzufang-p4-0/
......

通过以下代码即可构造出13页URL的列表数据:

urls = ['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(number) for number in range(1, 14)]

for url in urls:
    print(url)

通过一行代码即可构造出来,通过for循环打印出每个URL

http://bj.xiaozhu.com/search-duanzufang-p1-0/
http://bj.xiaozhu.com/search-duanzufang-p2-0/
http://bj.xiaozhu.com/search-duanzufang-p3-0/
http://bj.xiaozhu.com/search-duanzufang-p4-0/
http://bj.xiaozhu.com/search-duanzufang-p5-0/
http://bj.xiaozhu.com/search-duanzufang-p6-0/
http://bj.xiaozhu.com/search-duanzufang-p7-0/
http://bj.xiaozhu.com/search-duanzufang-p8-0/
http://bj.xiaozhu.com/search-duanzufang-p9-0/
http://bj.xiaozhu.com/search-duanzufang-p10-0/
http://bj.xiaozhu.com/search-duanzufang-p11-0/
http://bj.xiaozhu.com/search-duanzufang-p12-0/
http://bj.xiaozhu.com/search-duanzufang-p13-0/

2.字典

Python的字典数据结构与现实中的字典类似,以键值对('key'--'value')的形式表现出来。

user_info = {'name': 'xiaoming', 'age': 23, 'sex': 'man'}

for key, value in user_info.items():
    print(key, value)

注意:插入MongoDB数据库需用字典结构

3.元组和集合

在爬虫中,元组和集合很少用到,因此这里只做简单介绍。元组类似于列表,但是元组的元素不能修改只能查看,元组的格式如下:

tuple = (1,2,3)

集合的概念类似于数学中的集合。每个集合中的元素是无序的,不可以有重复的对象,因此可以通过集合把重复的数据去除。

lists = ['xiaoming', 'zhangyun', 'xiaoming']
sets = set(lists)
print(sets)
#{'xiaoming', 'zhangyun'}

注意:集合是用大括号构建的。


在爬虫初期的工作中,常常会把数据存储到文件中。

主要讲解Python如何打开文件和读写数据

1.打开文件

Python中通过open()函数打开文件,语法如下:

open(name[,mode[,buffering]])

open()函数使用文件名作为唯一的强制参数,然后返回一个文件对象。模式(mode)和缓冲(buffering)是可选参数。

在Python的文件操作中,mode参数的输入是有必要的,而buffering使用较少。

如果在本机上有名为file.txt的文件,其存储路径为C:\Users\Admin\Desktop,那么可以通过下面代码打开文件:

f = open("C:/Users/Admin/Desktop/file.txt")

注意:此代码为Windows系统下的路径写法

如果文件不存在,则会出现如下图所示的错误:

文件不存在报错信息

如果open()函数只是加入文件的路径这一个参数,则只能打开文件并读取文件的相关内容。

如果想要文件中写入内容,则必须加入模式这个参数了。下面看看open()函数中模式参数的常用值:

描述
'r' 读模式
'w' 写模式
'a' 追加模式
'b' 二进制模式(可添加到其他模式中使用)
'+' 读/写模式(可添加到其他模式中使用)

2.读写文件

可以通过f.write()方法和f.read()方法写入和读取数据了。

f = open("data.txt", 'r+', encoding="utf8")
f.write("hello world!")

注意:如果没有建立文件,运行上面代码也可以成功,如果模式为r+w+,只会覆盖原先的内容。

如果再次运行程序,txt文件中的内容不会继续添加,可以修改模式参数为'r+',便可一直写入文件。

Python读取文件通过read()方法,下面尝试把f的类文件对象写入的数据读取出来,使用如下代码即可完成。

f = open("data.txt", 'r', encoding="utf8")
content = f.read()
print(content)

3.关闭文件

当完成读写工作后,应该牢记使用close()方法关闭文件。这样可以保证Python进行缓冲的清理(出于效率考虑而把数据临时存储在内存中)和文件的安全性。

f = open("data.txt", 'r', encoding="utf8")
content = f.read()
print(content)
f.close()

Python作为一个面向对象的语言,很容易创建一个类和对象。

1.定义类

类是用来描述具有相同属性和方法的对象集合。人可以通过不同的肤色划分为不同的种族,事物也有不同的种类,商品也是形形色色。但划分为同一类的物体,肯定具有相似的特征和行为方式。

对于同一款自行车而言,他们的组成结构都是一样的,如车架、车轮和脚踏板等。通过Python可以定义这个自行车的类:

class Bike:
    compose = ['frame', 'wheel', 'pedal']

通过使用class定义一个自行车的类,类中的变量compose 称为类的变量,专业术语为类的属性。这样,顾客购买的自行车组成结构就是一样的了。

my_bike = Bike()
your_bike = Bike()
print(my_bike.compose)
print(your_bike.compose)

在左边写上变量名,右边写上类的名称,这个过程称之为类的实例化,而my_bike就是类的实例。通过.加上类的属性,就是类属性的引用。类的属性会被类的实例共享,所以结果都是一样的。

2.实例属性

对于同一款自行车,有些顾客买回去后会改造下:

class Bike:
    compose = ['frame', 'wheel', 'pedal']

my_bike = Bike()
my_bike.other = 'basket'
print(my_bike.other)

说明:通过给类的实例属性进行赋值,也就是实例属性。compose属性属于所有的该款自行车,而other属性只属于my_bike这个类的实例。

3.实例方法

是否记得字符串的format()方法。方法就是函数,方法是对实例进行使用的,所以又叫实例方法。对于自行车而言,它的方法就是骑行:

class Bike:
    compose = ['frame', 'wheel', 'pedal']

    def use(self):
        print("you are riding")


my_bike = Bike()
my_bike.use()

和函数一样,实例方法也是可以有参数的。

class Bike:
    compose = ['frame', 'wheel', 'pedal']

    def use(self, time):
        print("you ride {}m".format(time * 100))


my_bike = Bike()
my_bike.use(10)

Python的类中有一些“魔法方法”,__init__()方法就是其中之一。在我们创建实例的时候,不需要引用该方法也会被自动执行。

class Bike:
    compose = ['frame', 'wheel', 'pedal']

    def __init__(self):
        self.other = 'basket'

    def use(self, time):
        print("you ride {}m".format(time * 100))


my_bike = Bike()
my_bike.use(10)

4.类的继承

共享单车的出现,方便了人们的出行,共享单车和原来的自行车组成结构类似,但多了付费的功能。

class Bike:
    compose = ['frame', 'wheel', 'pedal']

    def __init__(self):
        self.other = 'basket'

    def use(self, time):
        print("you ride {}m".format(time * 100))


class Share_bike(Bike):
    def cost(self, hour):
        print('you spent {}'.format(hour * 2))


bike = Share_bike()
print(bike.other)
bike.cost(2)

在新的类Share_bike后面的括号中加入Bike,表示Share_bike继承了Bike父类。父类中的变量和方法完全被子类继承,在特殊情况下,也可以对其覆盖。

你可能感兴趣的:(Ch1 Python零基础语法入门)