Python3扩展模块
【课程26】引用扩展模块(import)
模块(Module):模块就是程序。每个扩展名为.py的Python程序都是一个独立的模块。模块能定义函数、类和变量,让你能够有逻辑地组织你的Python代码段。
包(package):组织模块。放在一个文件夹里的模块集合。
模块引用方式:(1)import [as ]。将模块中的函数等名称导入当前程序。在调用模块中的函数的时候,需要加上模块的命名空间。可以给导入的命名空间替换一个新的名字。引用方法:.。(2)from import 。引入模块中的某个函数。调用时不需要再加上命名空间。
命名空间(namespace):表示标识符(identifier)的可见范围。一个标识符可以在多个命名空间中定义,在不同命名空间中的含义互不相干。
dir()函数:列出名称的属性
help()函数:显示参考手册
Python语言标准库:在安装Python时就默认已经安装好的模块。
数字和数学模块
numbers:数字抽象基类
math:数学函数
cmath:复数的数学函数
decimal:十进制定点和浮点算术
fractions:有理数
random:生成伪随机数
statistics:数学统计功能
数据类型
datetime:基本日期和时间类型
calendar:与日历相关的一般功能
collections:容器数据类型
heapq:堆队列算法
bisect:数组二分算法
array:高效的数值数组
weakref:弱引用
types:动态类型创建和内置类型的名称
copy:浅层和深层复制操作
pprint:格式化输出
reprlib:备用repr()实现
enum:支持枚举
功能编程模块
itertools:为高效循环创建迭代器的函数
functools:可调用对象的高阶函数和操作
operator:标准运算符作为函数
数据持久化
pickle:Python对象序列化
copyreg:注册pickle支持功能
shelve:Python对象持久化
marshal:内部Python对象序列化
dbm:与Unix“数据库”的接口
sqlite3:SQLite数据库的DB-API 2.0接口
数据压缩和存档
zlib:与gzip兼容的压缩
gzip/bz2:支持gzip/bzip2文件
lzma:使用LZMA算法进行压缩
zipfile:使用ZIP存档
tarfile:读取和写入tar归档文件
文件格式
csv:CSV文件读写
configparser:配置文件解析器
netrc:netrc文件处理
xdrlib:对XDR数据进行编码和解码
plistlib:生成并解析Mac OS X.plist文件
文件和目录访问
pathlib:面向对象的文件系统路径
os.path:常见的路径名操作
fileinput:迭代多个输入流中的行
stat:解释stat()结果
filecmp:文件和目录比较
tempfile:生成临时文件和目录
glob:Unix样式路径名模式扩展
fnmatch:Unix文件名模式匹配
linecache:随机访问文本行
shutil:高级文件操作
macpath:Mac OS 9路径操作函数
通用操作系统服务
os:其他操作系统接口
io:用于处理流的核心工具
time:时间访问和转换
argparse:用于命令行选项,参数和子命令的解析器
getopt:用于命令行选项的C风格解析器
logging:Python的日志记录工具
getpass:便携式密码输入
curses:字符单元格显示的终端处理
platform:访问底层平台的标识数据
errno:标准errno系统符号
ctypes:Python的外部函数库
并发执行
threading:基于线程的并行性
multiprocessing:基于进程的并行性
concurrent.futures:启动并行任务
subprocess:子流程管理
sched:事件调度程序
queue:同步的队列类
_thread:低级线程API
加密服务
hashlib:安全哈希和消息摘要算法接口
hmac:用于消息身份验证的密钥哈希算法
secrets:生成用于管理机密的安全随机数
网络和进程间通信
asyncio:异步I/O
socket:低级网络接口
ssl:套接字对象的TLS/SSL包装器
select:等待I/O完成
selectors:高级I/O复用
asyncore:异步套接字处理程序
asynchat:异步套接字命令/响应处理程序
signal:设置异步事件的处理程序
mmap:内存映射文件支持
互联网数据处理
email:电子邮件和MIME处理包
json:JSON编码器和解码器
mailcap:Mailcap文件处理
mailbox:以各种格式处理邮箱
mimetypes:将文件名映射到MIME类型
base64:Base16/Base32/Base64/Base85数据编码
binhex:对binhex4文件进行编码和解码
binascii:在二进制和ASCII之间转换
quopri:对MIME引用的可打印数据进行编码和解码
uu:对uuencode文件进行编码和解码
互联网协议和支持
webbrowser:Web浏览器控制器
cgi:通用网关接口支持
cgitb:CGI脚本的回溯管理器
wsgiref:WSGI实用程序和参考实现
urllib:URL处理模块
http:HTTP模块
ftplib/poplib/imaplib/nntplib/smtplib:
FTP/POP3/IMAP4/NNTP/SMTP协议客户端
smtpd:SMTP服务器
telnetlib:Telnet客户端
socketserver:网络服务器的框架
xmlrpc:XMLRPC服务器和客户端模块
ipaddress:IPv4/IPv6操作库
多媒体服务
audioop:处理原始音频数据
aifc:读写AIFF和AIFC文件
sunau:读取和写入Sun AU文件
wave:读写WAV文件
chunk:读取IFF分块数据
colorsys:颜色系统之间的转换
imghdr:确定图像的类型
sndhdr:确定声音文件的类型
ossaudiodev:访问兼容OSS的音频设备
结构化标记处理工具
html:超文本标记语言支持
xml:XML处理模块
程序框架
turtle —海龟作图库
cmd —支持面向行的命令解释器
shlex —简单的词法分析
图形用户界面
tkinter:Tcl/Tk的Python接口
【课程27】datetime模块
主要的类:可对date、time、datetime三种时间模式进行单独管理。
datetime.date()处理日期(年月日)
datetime.time()处理时间(时分秒、毫秒)
datetime.datetime()处理日期+时间
备注:datetime是模块,datetime模块还包含一个datetime类,通过from datetime import datetime导入的才是datetime这个类。
strptime():用户输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()实现,需要一个日期和时间的格式化字符串:
>>> from datetime importdatetime
>>> cday =datetime.strptime('2017-8-1 18:20:20', '%Y-%m-%d %H:%M:%S')
>>> print(cday)
strftime():后台提取到datetime对象后,要把datetime对象格式化为字符串显示给用户,就需要转换为str,转换方法是通过strftime()实现的,同样需要一个日期和时间的格式化字符串:
>>> from datetime import datetime
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))
时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。
将日期转换成时间戳:
timetuple()函数:将时间转换成struct_time格式
time.mktime()函数:返回用秒数来表示时间的浮点数
时间上的加减法:datetime.timedelta()处理时段(时间间隔),表示两个时间点的间隔
【课程28】calendar模块
calendar模块:跟日历相关的若干函数和类,可以生成文本形式的日历。
常用函数:
calendar.calendar()返回多行字符串,一整年
calendar.month(,)返回多行字符串,一个月
calendar.prmonth(,)相当于print(calendar.month (,))
calendar.prcal()相当于print (calendar.prcal ())
将日历列表化:calendar.monthcalendar()。返回某一年的某一个月份日历,是一个嵌套列表。最里层的列表含有七个元素,代表一周(从周一到周日)。如果没有本月的日期,则为。
与日历相关的计算:
判别闰年calendar.isleap():普通闰年:能被4整除但不能被100整除的年份。世纪闰年:能被400整除的年份。
计算某月共有多少天,从周几开始calendar.monthrange(,):从开始,依次为周一、周二…
计算某天是周几calendar.weekday(,,):返回值为0~6,依次对应的是周一到周日。
【课程29】time模块
获取时间戳:time.time()方法。时间戳的用处:测试程序运行时间。
获取当前时间:time.asctime()或time.ctime()。
将元组数据转化为日期:t = (2018, 8, 13, 11, 42, 31, 0, 0, 0)。time.asctime(t)。这一系列的数值分别对应年、月、日、时、分、秒、周几、一年中的第几天、是否为夏令时间。
struct_time类:time.localtime()。
利用索引获取时间信息:t = time.localtime()。year = t[0]#年。
让程序运行到某处便暂停几秒:time.sleep()。
【课程30】几个算术模块
math模块:支持浮点数运算
math.sin()/math.cos()/math.tan()
math.pi #Π = 3.14159…
math.log(x,a) #以a为底的x的对数
math.pow(x,y) #xy
cmath模块:支持复数运算
cmath.polar() #极坐标
cmath.rect() #笛卡尔坐标
cmath.exp(x) #e^x
cmath.log(x,a) #以a为底的x的对数
cmath.log10(x) #以10为底x的对数
cmath.sqrt(x) #x的平方根。
decimal模块:小数-固定精度的浮点值
生成小数:from decimal import Decimal。Decimal('0.1')。
小数计算:Decimal('0.1')+Decimal('0.1')+Decimal('0.10')-Decimal('0.3')。
fractions模块:分数-实现了一个有理数对象
生成分数:from fractions import Fraction。Fraction(1,4)/Fraction('0.25')。
浮点数转换为分数:Fraction.from_float(1.75)。尽管可以把浮点数转换为分数,在某些情况下,这么做会有不可避免的精度损失,因为这个数字在其最初的浮点形式上是不精确的。
random模块:伪随机数
计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可预见的。随机数种子相同,随机数的序列也是相同的。
random.seed(a=None)设置随机数种子
random.random()生成范围在[0,1)之间的随机实数
random.uniform()生成指定范围的内的随机浮点数
random.randint(m,n)生成指定范围[m,n]内的整数
random.randrange(a,b,n)可以在[a,b)范围内,按n递增的集合中随机选择一个数
random.getrandbits(k)生成k位二进制的随机整数
random.choice()从指定序列中随机选择一个元素
random.sample()能指定每次随机元素的个数
random.shuffle()可以将可变序列中所有元素随机排序
【课程31】持久化模块
临时性对象:类创建的对象并不是真正的数据库记录。存储在内存而不是文件中。关闭python,实例将消失。
对象持久化:对象在创建它们的程序退出之后依然存在。
对象持久化的标准库模块:
pickle:任意Python对象格式化和解格式化
dbm:实现一个可通过键访问的文件系统,以存储字节串
shelve:按照键把pickle处理后的对象存储到一个文件中
shelve模块:提供基本的存储操作,通过构造一个简单的数据库,像操作字典一样按照键存储和获取本地的Python对象,使其可以跨程序运行而保持持久化。键必须是字符串,且是唯一的。值是任何类型的Python对象。数据处理不支持类似SQL的查询工具,但只要通过键获取到保存在文件的对象,就可以像正常的数据对象一样处理。与字典类型的区别:一开始必须打开shelve,并且在修改后需要关闭它。
常用操作:
1.将任何数据对象,保存到文件中去:d = shelve.open(filename)。open函数在调用时返回一个shelf对象,通过该对象可以存储内容。
2.类似字典形式访问,可读可写。
d[key] =data #写
value=d[key]#读
del d[key]#删
3.操作完成后,记得关闭文件:d.close()。
【课程32】文件文本读写模块
普通文件:数据持久化的最简单类型。仅仅是在一个文件名下的字节流,把数据从文件读入内存,从内存写入文件。
文件的打开:内置open()函数:f = open(filename[,mode[,buffering]])
f: open()返回的文件对象
filename:文件的字符串名
mode:可选参数,打开模式和文件类型
mode第一个字母表明对其的操作:
‘r’表示读模式(默认)
‘w’表示写模式
‘x’表示在文件不存在的情况下新创建并写文件
‘a’表示在文件末尾追加写内容
‘+’表示读写模式
mode第二个字母是文件类型
‘t’表示文本类型
‘b’表示二进制文件
buffering:可选参数,文件的缓冲区,默认为-1
文件的写操作:
f.write(str):写入字符串
f.writelines(strlist):写入字符串列表
文件的读操作:
f.read():每次读取整个文件,生成文件内容的字符串表示
f.readline():返回一行,每次只读取一行
f.readlines():返回所有行的列表,每次读取整个文件
文件的关闭:文件打开后要记得关闭。关闭的作用是终止对外部文件的连接,同时将缓存区的数据刷新到硬盘上。调用close()方法:f.close()。
使用上下文管理器(contextmanager):确保在退出后自动关闭文件。
with open(‘textfile’,’rt’) as myfile:
myfile.read()
结构化文本文件:
(1)CSV:纯文本文件,以“,”为分隔符。值没有类型,所有值都是字符串。不能指定字体颜色等样式。不能指定单元格的宽高,不能合并单元格。没有多个工作表。不能嵌入图像图表。
文件读取-reader:re = csv.reader()。接受一个可迭代对象(比如csv文件),能返回一个生成器,可以从其中解析出内容。
文件读取-DictReader:re = csv.DictReader()。与reader类似。但返回的每一个单元格都放在一个元组的值内。
文件写操作:w = csv.writer()。w.witerow(rows)。当文件不存在时,自动生成。支持单行写入和多行写入。
字典数据写入:w = csv.DictWriter()。w.writeheader()。w.writerow(rows)。
(2)EXCEL:openpyxl模块用来读写扩展名为xlsx/xlsm/xltx/xltm的文件。Workbook类是对工作簿的抽象。Worksheet类是对表格的抽象。Cell类是对单元格的抽象文件写操作。
操作之前先导入第三方库openpyxl模块:
安装:pip install openpyxl
导库:from openpyxl import workbook
创建Excel文件:一个Workbook对象代表一个Excel文档,使用该方法创建一个Worksheet对象后才能打开一个表。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
读取Excel文件:
from openpyxl import load_workbook
wb = load_workbook(filename)
获取单元格信息:获取Cell对象。
c = wb[‘sheet’][‘A1’]
c = wb[‘sheet’].cell(row=1,column=1)
c.coordinate :返回单元格坐标
c.value :返回单元格的值
c.row :返回单元格所在的行坐标
c.column :返回单元格所在列坐标
(3)PDF:PyPDF2库包含了PdfFileReader、PdfFileMerger、PageObject和PdfFileWriter四个主要类。能进行读写、分割、合并、文件转换等多种操作。只能从PDF文档中提取文本并返回为字符串,而无法提取图像、图表或其他媒体。
读取PDF文件:
readFile = open('test.pdf','rb')
pdfFileReader = PdfFileReader(readFile)
pdfFileReader类:
.getNumPages():计算PDF文件总页数
.getPage(index):检索指定编号的页面
PDF文件的写操作:
writeFile = 'output.pdf'
pdfFileWriter = PdfFileWriter()
pdfFileWriter类:
.addPage(pageObj):根据每页返回的
PageObject,写入到文件
.addBlankPage():在文件的最后一页后面写入一个空白页,保存到新文件
合并多个文档:
pdf_merger = PdfFileMerger()
pdf_merger.append('python2018.pdf')
pdf_merger.merge(20, 'insert.pdf')
pdf_merger.write('merge.pdf')
单个页面操作–PageObject类
.extractText():按照顺序提取文本
.getContents():访问页面内容
.rotateClockwise(angle):顺时针旋转
.scale(sx,sy):改变页面大小
【课程33】简单图形界面模块(easygui)
图形用户界面GUI:人机交互的图形化界面设计,包括展示数据用的小控件、输入的方法、菜单、按钮以及窗口等。用户通过鼠标、键盘等输入设备操纵屏幕上的图标或菜单选项,来执行选择命令、调用文件、启动程序等日常任务。
easygui模块:可以显示各种对话框、文本框、选择框与用户交互。
功能演示:easygui.egdemo()。
消息窗口easygui.msgbox():显示一条消息和提供一个"OK"按钮。用户可以指定任意的消息和标题,甚至重写"OK"按钮的内容。
按钮选项easygui.choicebox():为用户提供了一个可选择的列表,使用序列(元组或列表)作为选项。
显示文本easygui.textbox():用于显示文本内容。text参数可以是字符串、列表或元组类型。
输入密码easygui.passwordbox():类似于enterbox(),但是用户输入的内容是用"*"显示出来。
打开文件easygui.fileopenbox():返回用户选择的文件名(带完整路径)。Default参数指定了一个默认路径。
实现简单的图形界面程序:互动小游戏
import easygui as g
import sys
while 1:
g.msgbox('欢迎进入')
msg = '你想学习什么?'
title = '互动小游戏'
choices = ['琴棋书画', '四书五经', '编程', '数学', 'English']
choice =g.choicebox(msg,title,choices)
g.msgbox('你选择的是'+str(choice),'结果') # convert the choice to string
# in case the user cancelled thechoice, and we got None.
msg = '你希望重新选择吗?'
title = '请选择'
if g.ccbox(msg,title): #show acontinue/cancel dialog
pass # user choose continue
else:
sys.exit(0) # user choosecancel
【课程34】海龟作图模块(turtle)
海龟作图turtle模块:Python内置,随时可用。其意象为模拟海龟在沙滩上爬行而留下的足迹。从LOGO语言借鉴而来。
属性:位置、方向、画笔(颜色、线条宽度等)
指令:画笔运动命令:前/后移动、左/右转动、作画速度等。画笔控制命令:抬起/放下、画笔宽度、画笔颜色、填充颜色等。
调用递归画树:先画树干,再画右树枝,最后画左树枝:与递归函数里的流程一致。
#分形树
#导入turtle模块
import turtle
#定义画树的函数
def tree(branchLen,t): # t为海龟
if branchLen >= 5: #最小规模为5
if branchLen
t.pencolor('green') #设置画笔颜色为绿色
else: #规模在50以上,树干
t.pencolor('brown') #设置画笔颜色为棕色
t.forward(branchLen) #画树干
if branchLen
t.color('red','pink')
# t.pencolor('red')
# t.fillcolor('pink')
t.begin_fill() #开始填充
t.circle(5) #画半径为5的圆
t.end_fill() #结束填充
t.right(25) #右倾25度
tree(branchLen-15,t) #减小规模,树干减15
t.left(50) #回左倾50度
tree(branchLen-15,t)
if branchLen
t.pencolor('green') #设置画笔颜色为绿色
else: #规模在50以上,树干
t.pencolor('brown') #设置画笔颜色为棕色
t.right(25) #回右倾25度,回正
t.backward(branchLen) #海龟回到原位置
#定义主函数
def main():
t = turtle.Turtle() #创建一支画笔
win = turtle.Screen()
turtle.tracer(0) #关闭绘画动画
#画笔位置调整
t.left(90) #海龟向左旋转90度,指向正北
t.up() #抬笔
t.backward(300) #后退100
t.down() #落笔
t.pensize(3) #设置画笔粗细为3
t.color('brown') #设置画笔颜色为棕色
tree(135,t) #画树,树干长度为100
turtle.update() #打开绘画动画
win.exitonclick()
#调用主函数
main()
【课程35】图像处理库(PIL)
Pillow库:Python里的图像处理库。PIL即PythonImage Library。功能强大,可以对图像做各种处理。缩放、裁剪、旋转、滤镜、文字、调色板等等。
图像处理步骤:
1.打开图像
image.open()
Pillow库能自动根据文件内容确定格式
若图片在程序目录下,则不需要附带路径,直接将图像名+文件格式作为参数
2.处理图像
image模块中提供了大量处理图像的方法
3.存取或显示图像
im.show()
im.save()
PIL生成缩略图:thumbnail(size, Image.ANTIALIAS)函数。参数size为一个元组,指定生成缩略图的大小。直接对内存中的原图进行了修改,但是修改完后的图片需要保存,处理后的图片不会被拉伸。
from PIL import Image
#打开一个jpg图像文件,注意是当前路径
im = Image.open('test.jpg')
#获得图像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
#缩放到50%:
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
#把缩放后的图像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')
PIL生成模糊效果图像:filter(ImageFilter.BLUR)函数。
from PIL import Image, ImageFilter
#打开一个jpg图像文件,注意是当前路径
im = Image.open('test.jpg')
#应用模糊滤镜
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')
PIL给图片添加文字:
from PIL import Image,ImageDraw,ImageFont
#打开程序目录下的图片test.jpg
img=Image.open('test.jpg')
#设置待添加文字大小为100,字体为隶书SIMLI.TTF
font=ImageFont.truetype('SIMLI.TTF',100)
#在img上创建可绘图对象draw
draw=ImageDraw.Draw(img)
#添加红色文字'未名湖畔好读书'
draw.text((100,10),'未名湖畔好读书',(255,0,0),font=font)
#保存图片
img.save('未名湖畔好读书.jpg','jpeg')
PIL生成验证码:
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random
#随机字母:
def rndChar():
return chr(random.randint(65,90))
#随机颜色1:
def rndColor():
return (random.randint(64, 255),random.randint(64, 255), random.randint(64, 255))
#随机颜色2:
def rndColor2():
return (random.randint(32, 127),random.randint(32, 127), random.randint(32, 127))
# 240 x 60:
width = 60 * 4
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255))
#创建Font对象:
font = ImageFont.truetype('Arial.ttf', 36)
#创建Draw对象:
draw = ImageDraw.Draw(image)
#填充每个像素:
for x in range(width):
for y in range(height):
draw.point((x, y),fill=rndColor())
#输出文字:
for t in range(4):
draw.text((60 * t + 10, 10),rndChar(), font=font, fill=rndColor2())
#模糊:
image = image.filter(ImageFilter.BLUR)
image.save('code.jpg', 'jpeg')
【课程36】Web服务框架(Flask)
Web应用:Web应用已经成为目前最热门的应用软件形式。Web应用通过Web服务器提供服务,客户端采用浏览器或者遵循HTTP协议的客户端。由于需要处理HTTP传输协议,很多Web开发框架涌现。
框架:Web服务器会处理与浏览器客户端交互的HTTP协议具体细节,但对具体内容的处理还需要自己编写代码。一个Web框架至少要具备处理浏览器客户端请求和服务端响应的能力。
框架的特性:
路由:解析URL并找到对应的服务端文件或者Python服务器代码。
模板:把服务端数据合并成HTML页面。
认证和授权:处理用户名、密码和权限。
会话Session:处理用户在多次请求之间需要存储的数据。
框架可能具备这些特性中的一种或多种。
Flask框架:Flask是一种非常容易上手的Pythonweb开发框架,功能强大,支持很多专业Web开发需要的扩展功能。如Facebook认证和数据库集成。只需要具备基本的Python开发技能,就可以开发出一个web应用来。
表单插件Flask-WTF:使用Flask-WTF时,每个表单都抽象成一个类。
一个Web服务器测试:在浏览器中访问http://127.0.0.1:5000/,这个服务器会返回一行文本。
#Flask框架-一个Web服务器测试
#引入Flask类,Flask类实现了一个WSGI应用
from flask import Flask
#app是Flask的实例,它接收包或者模块的名字作为参数,但一般都是传递__name__
app=Flask(__name__)
#使用app.route装饰器会将URL和执行的视图函数的关系保存到app.url_map属性上
#处理URL和视图函数的关系的程序就是路由,这里的视图函数就是hello
@app.route('/')
def hello():
return 'hello world'
#使用这个判断可以保证当其他文件引用这个文件的时候(例如“from hello import app”)
#不会执行这个判断内的代码,也就是不会执行app.run函数
if __name__=='main':
#执行app.run就可以启动服务了
#默认Flask只监听虚拟机的本地127.0.0.1这个地址,端口为5000
app.run()
【课程37】网络爬虫(requests, Beautiful Soup)
爬虫(搜索引擎蜘蛛):爬虫是按照一定规则,自动地提取并保存网页中信息的程序。蜘蛛沿着网络抓取猎物,通过一个节点之后,顺着该节点的连线继续爬行到下一个节点,最终爬完整个网络的全部节点。通过向网站发起请求获取资源,提取其中有用的信息。
requests库:Python实现的一个简单易用的HTTP库。支持HTTP持久连接和连接池、SSL证书验证、cookies处理、流式上传等。向服务器发起请求并获取响应,完成访问网页的步骤。简洁、容易理解,是最友好的网络爬虫库。
http请求类型:返回的是一个response对象。
requests.request():构造一个请求
requests.get():获取HTML网页
requests.head():获取HTML网页头信息
requests.post():提交POST请求
requests.put():提交PUT请求
requests.patch():提交局部修改请求
requests.delete():提交删除请求
requests.options():获取http请求
response对象:包含服务器返回的所有信息,例如状态码、编码形式、文本内容等;也包含请求的request信息。
.status_code:HTTP请求的返回状态
.text:HTTP响应内容的字符串形式
.content:HTTP响应内容的二进制形式
.encoding:(从HTTPheader中)分析响应内容的编码方式
.apparent_encoding:(从内容中)分析响应内容的编码方式
定制请求头:requests的请求接口有一个名为headers的参数,向它传递一个字典来完成请求头定制。
设置代理:一些网站设置了同一IP访问次数的限制,可以在发送请求时指定proxies参数来替换代理,解决这一问题。
Beautiful Soup页面解析器:使用requests库下载了网页并转换成字符串后,需要一个解析器来处理HTML和XML,解析页面格式,提取有用的信息。
搜索方法:find_all(name,attrs,recursive,string,**kwargs)返回文档中符合条件的所有tag,是一个列表。find(name,attrs,recursive,string,**kwargs)相当于find_all()中limit=1,返回一个结果。name:对标签名称的检索字符串。attrs:对标签属性值的检索字符串。recursive:是否对子节点全部检索,默认为True。string:...中检索字符串。**kwargs:关键词参数列表。
爬虫的基本流程:
1.分析网页结构;
2.爬取页面:通过requests库向目标站点发送请求,若对方服务器正常响应,能够收到一个response对象,它包含了服务器返回的所有信息。
3.解析页面:
HTML代码-网页解析器。
Json数据-json模块,转换成Json对象。
二进制数据-以wb形式写入文件,再做进一步处理。
此处使用bs4进行解析。
#举例:爬取猫眼网站上的电影信息
import requests
from bs4 import BeautifulSoup
#我们用选择器来选择我们需要获取的内容
def get_info(soup):
imgs = soup.select('dd.board-img') #这是获取图片链接
names = soup.select('dd.board-item-main .name') #这是获取电影名字
starses = soup.select('dd.board-item-main .movie-item-info .star') #这是获取电影主演
times = soup.select('dd.board-item-main .movie-item-info .releasetime') #这是获取电影上映时间
scores = soup.select('dd.board-item-main .score-num')
films = [] #存储一个页面的所有电影信息
for x in range(0, 10):
#这个是获取属性的链接
img = imgs[x]['data-src']
#下面的都是获取标签的内容并去掉两端空格
name =names[x].get_text().strip()
stars =starses[x].get_text().strip()[3:] #使用切片是去掉主演二字
time =times[x].get_text().strip()[5:] #使用切片是去掉上映时间二字
score =scores[x].get_text().strip()
film = {'name': name, 'stars': stars,'img': img, 'time': time, 'score': score}
films.append(film)
pages = soup.select('.list-pagerli a') #可以看到下一页的链接在最后一个a标签
page =pages[len(pages)-1]['href']
return films, page
url_start = 'http://maoyan.com/board/4'
page = ''
while True:
response = requests.get(url_start+ page)
soup =BeautifulSoup(response.text, 'lxml')
films, page = get_info(soup)
#写个json文件吧,这样容易点
with open('猫眼电影top250.json', 'a', encoding='utf-8') as f:
for film in films:
f.write(str(film)+'\n')
if '下一页' not in response.text: #下一页不在就表示下载完毕
print('所有电影下载完毕')
break
【课程38】数据可视化(numpy, matplotlib)
numpy矩阵处理库:numpy是Python用于处理大型矩阵的一个速度极快的数学库。可以做向量和矩阵的运算,包括各种创建矩阵的方法,以及一般的矩阵运算、求逆、求转置。它的很多底层的函数都是用C写的,可以得到在普通Python中无法达到的运行速度。
矩阵计算:
创建矩阵a = np.matrix([])
矩阵求逆a.I
矩阵转置a.T
矩阵乘法a*b或np.dot(a,b)
对象属性:
np.shape数组形状,矩阵则为n行m列
np.size对象元素的个数
np.dtype指定当前numpy对象的整体数据
matplotlib绘图库:matplotlib是Python的一个绘图库。它包含了大量的工具,可以使用这些工具创建各种图形,如简单的散点图、折线图,甚至三维图形、动画等。matplotlib功能异常强大,Python科学计算社区经常使用它完成数据可视化的工作。
http://matplotlib.org/gallery.html
绘制函数图像基本思路:通过将图像上一些点的坐标连接起来,即可绘制函数的近似图像,当点越多时,所绘图像越接近函数图像。
numpy库的linspace()函数生成数组:numpy.linspace(,,)。生成一个存放等差数列的数组,数组元素为浮点型,包含三个参数,分别是:数列起始值、终止值(默认包含自身)、数列元素个数。
matplotlib库的plot()函数用来画图:可以设定图形颜色、线条线型、以及做标注等。坐标轴标签:plt.xlabel()、plt.ylabel()。图形标题:plt.title()。
散点图:函数scatter(x,y)。(x, y)是点的坐标。
直方图:函数hist(x,n)。x是横坐标,n是条状图的数量。
领取专属 10元无门槛券
私享最新 技术干货