概要
本文我想拣些使用频率相对高些的基础语法来讲讲,权当作备忘录了吧。
类别:
- Python 和 Pycharm的安装
- 变量和字符串
- 函数与控制语句:Python循环、判断语句
- Python数据结构:列表、字典、元组和集合
- Python文件操作:使用Python建立文件并写入数据
- Python面向对象:类的定义和使用方法。
正文
1. Python安装
当前主流的Python版本为2.x
和3.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父类。父类中的变量和方法完全被子类继承,在特殊情况下,也可以对其覆盖。
网友评论