目录
Python API 接口开发用法介绍
Postman 调试接口
OS 库
pandas
Pandas 数据结构 - Series
Pandas 处理数据方法
Pandas CSV 文件
Pandas JSON
Pandas excel 文件
上机练习 11
爬虫
爬取所有数据
pandas 分析处理数据
导入到 mysql
上机练习 12---使用爬虫+pandas+os 获取处理导入数据
Python API 接口开发用法介绍
API
(
Application Programming Interface
)是应用程序接口的简称,是一
种使得不同软件之间进行互操作的定义和协议。
以
Flask
为例进行
Python API
接口的开发
from flask import Flask
app=Flask(__name__)
#
定义一个
API
接口
@app.route("/")
def index():
return "<a href='/list'><img src='/static/py11.png'/></a>"
以上就是一个极简的
Python API
接口,通过访问
'http://127.0.0.1:5000'
,
就可以获得的响应。
from flask import Flask,jsonify,request
from DAL import MovieTypeDAL
from Model import MovieType
app=Flask(__name__)
mtdal=MovieTypeDAL()
#
定义一个
API
接口
@app.route("/addSubmit", methods=["POST"])
def addSubmit():
tid = request.form.get("tid")
tname = request.form.get("tname")
tcontent=request.form.get("tcontent")
leixing=MovieType(tid,tname,tcontent)
result=mtdal.insert(leixing)
if result>0:
return "
插入成功
<a href='/list'>
刷新
</a>"
else:
return "
插入失败
<a href='/list'>
刷新
</a>"
#
定义一个
API
接口
@app.route("/list")
def list():
tlist = mtdal.select()
list1=[]
for i in tlist:
dict1={}
dict1["tid"]=i[0]
dict1["tname"]=i[1]
dict1["tcontent"]=i[2]
dict1["tdate"]=i[3]
list1.append(dict1)
return jsonify(list1)
Postman 调试接口
Postman
是
Python API
接口开发的测试,没有前端的情况下使用
安装完,点击
Send an API request
get
步骤:
1.
设置请求方式,
GET
请求
2.
输入接口地址
3.
点击发送请求
4.
查
看响应结果
post
步骤:
1.
设置请求方法
2.
设置接口
URL
地址
3.
设置请求头
4.
设置请求
数据
5.
点击
Send
发送请求
6.
查看响应数据
7.
查看响应体数据



OS 库
os
(
operating system
)是
Python
程序与操作系统进行交互的接口
1
、
os.listdir
()返回对应目录下的所有文件及文件夹
2
、
os.mkdir
()创建目录(只支持一层创建)即新建一个路径
3
、
os.open
( ) 创 建 文 件 相 当 于 全 局 函 数
open()
(
IO
流 )
os.open("t.txt",os.O_CREAT)
4
、
os.remove
(文件名或路径)删除文件
5
、
os.rmdir
()删除目录
6
、
os.system
()执行终端命令
os.system("touch a.txt")
import os
os.mkdir("t")
os.open("tt.txt",os.O_CREAT)
os.rmdir("t")
os.remove("tt.txt")
#
终端操作
os.system("mkdir hello")
pandas
Pandas
是
Python
语言的一个扩展程序库,用于数据分析。
Pandas
名字衍生自术语
"panel data"
(面板数据)
Pandas
可以从各种文件格式比如
CSV
、
JSON
、
Excel
python
终端输入安装 :
pip3 install -i
https://pypi.tuna.tsinghua.edu.cn/simple pandas

Pandas 数据结构 - Series
import pandas as pd
a = [1, 2, 3]
print(pd.Series(a))
sites = {"a": "Google", "b": "Runoob", 3: "Wiki"}
print(pd.Series(sites))
Pandas 数据结构 - DataFrame
data = [["Google",10],["Runoob",12],["Wiki",13]]
print(pd.DataFrame(data))
data
=
{"Site":["Google",
"Runoob",
"Wiki"],
"Age":[10,
12,
13],"sss":[22,33,44]}
print(pd.DataFrame(data))
Pandas 处理数据方法
data = {"Site":["Google", "Runoob", "Wiki"], "Age":[10, 12,
13],"sss":[22,33,44]}
df = pd.DataFrame(data)
print(df.loc[1]) #
一行
print(df.loc[[0,1]]) #
多行
print(df["Age"]) #
一列
print(df[["Age","Site"]]) #
多列
print(df["Age"][1]) #
一个值
print(df[(df.Age>11) & (df.sss>35)])#
带条件筛选
print(df[(df.Age>11) | (df.sss>35)]["Age"])
print(df[(df.Age.astype(int)>11) & (df.sss>35)])#
如果需要转换数据
类型如下
#
修改值
-
查出来后,右侧给左侧赋值即可,不存在的列即为添加
df["Age"]=100
df["Age"][1]=99
#
添加列
df["typeid"]=2
df["Score"]=[90,40,99]
df.insert(1,"Sex",["
男
","
女
","
男
"])
# 1
代表列
0
代表行
df.drop(1,axis=0,inplace=True)
df.drop([0,1],axis=0,inplace=True)
df.drop("Age",axis=1,inplace=True)
df.drop(df[df.Age>10].index,axis=0,inplace=True)
Pandas CSV 文件
CSV
(
Comma-Separated Values
,逗号分隔值,有时也称为字符分隔值,因为
分隔字符
也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
import pandas as pd
df = pd.read_csv("/root/douban.csv")
print(df.to_string()) #
完整显示
df = df[["id","title","rate"]]
print(df)
df.to_csv("db.csv",index=False)
Pandas JSON
JSON
(
JavaScript Object Notation
,
JavaScript
对象表示法),是存储
和交换文本信息
的语法,类似
XML
。
json.loads()
函数是将字符串转化为字典
一般
JSON
对象采用
{}
将键值对数据括起来,有时候会有多层
{}
也可以是
JSON
对象列表
import pandas as pd
d2 = [
{"class": "Year 1", "student number": 20, "room": "Yellow"},
{"class": "Year 2", "student number": 25, "room": "Blue"}
]
df = pd.DataFrame(d2)
print(df)
豆瓣的
txt
文件处理
#
内嵌的方法
import pandas as pd
import json
dict1=None
with open("douban.txt",mode="r",encoding="UTF-8") as f:
dict1 = json.loads(f.read())#
可以从文件读取过来
f.close()
df = pd.DataFrame(dict1["subjects"])
df["episodes_info"]="null"
df=df[["id","rate"]]#
改变顺序和列数
print(df)
df.to_csv("doubanout1.csv",index=False)
Pandas excel 文件
sheet_name
指定了读取
excel
里面的哪一个
sheet
usecols
指定了读取哪些列
nrows
指定了总共读取多少行
header
指定了列名在第几行,并且只读取这一行往下的数据
index_col
指定了
index
在第几列
engine="openpyxl"
指定了使用什么引擎来读取
excel
文件
安装:
pip3 install openpyxl
import pandas as pd
df = pd.read_excel("student.xlsx",sheet_name="Sheet1",header=1)
print(df)
df.to_excel("student1.xlsx",sheet_name="xs",index=False)
上机练习 11
import pandas as pd
import os
import json
import pymysql
# 1. 创建以日期为时间为名字的日志文件,格式如 20230303102030.log# os.system("nowaday='$(date +%Y%m%d%H%M%S)' && touch
/root/$nowaday.log")
# 2. 字典{1: "Google", 2: "Runoob", 3: "Wiki"},转成 series 数据,
打印数据,提
# 取"Runoob"打印
# sites = {"a": "Google", "b": "Runoob", 3: "Wiki"}
# print(pd.Series(sites))
# print(sites["b"])
# 3. 列表[["Google",10],["Runoob",12],["Wiki",13]],转成 DataFrame
数据打印
# data = [["Google",10],["Runoob",12],["Wiki",13]]
# print(pd.DataFrame(data))
# 4. 将[{"a": 1, "b": 2},{"a": 5, "b": 10, "c": 20}]转成 DataFrame
数据,提取第 2 行 a 那一列的
# 数据
# data = [{"a": 1, "b": 2},{"a": 5, "b": 10, "c": 20}]
# df=pd.DataFrame(data)
# print(df.loc[1,"a"])
# 5. 将 data = {"语文": [89,97,68,56,88,77],"数学":
[99,67,100,78,89,66],"英语":
# [73,57,89,90,82,55]}转成 DataFrame 数据,提取三科分数都及格的数据
# data = {"语文": [89,97,68,56,88,77],"数学":
[99,67,100,78,89,66],"英语":[73,57,89,90,82,55]}
# df=pd.DataFrame(data)
# for i in df.index:
#
if df.loc[i,"语文"]>=60 and df.loc[i,"数学"]>=60 and
df.loc[i,"英语"]>=60:
#
print(df.loc[i])
# 6. 使用 pandas 处理 douban.txt,提取列 id,title,rate,并且提取 rate
大于 7.5 的行导出
# douban1.csv,使用 os 库调用 shell 脚本 mysqlcsv.sh 自动导入
douban1.csv 到 mysql 数
# 据库,表名 douban1
# dict1=[]
# with open("/root/douban.txt", "r", encoding="utf-8") as f:
#
result=f.read()
#
dict1=json.loads(result)
#
f.close()
# df=pd.DataFrame(dict1["subjects"])
# df=df[df.rate.astype(float) > 7.5 ][["id","title","rate"]] #
改变顺序和列数
# print(df)
# df.to_csv("/root/douban1.csv",index=False,header=False)# os.system(" /root/shell/mysqlcsv.sh ")
# 7. 把 order.xlsx 使用 mobox 传入到/root/python 中,根据文档做如下操
作
# 把文档数据(从列名开始)转换为 dataframe 输出
# 在产品后面增加一列采购人,内容为 ["坤坤","杰杰","坤坤","丽丽","丽
丽","坤坤"]
# 查看金额大于 100 的坤坤的订单列表
# 查看金额大于 100 的坤坤的订单列表的产品及金额列
# 把上一步的结果另存为 order_kunkun.xlsx,表单名称为坤坤,不显示索引,
如下:
# 产品 金额
# 投影仪 2000
# 打印机 298
# df =
pd.read_excel("/root/python/order.xlsx",sheet_name="Sheet1",he
ader=1)
# print(df)
# df.insert(2,"采购人",["坤坤","杰杰","坤坤","丽丽","丽丽","坤坤
"])
# print(df[df["采购人"]=="坤坤"][ df["金额"]>100])
# df_kunkun = df[df["采购人"]=="坤坤" ][ df["金额"]>100][["产品","
金额"]]
#
df_kunkun.to_excel("order_kunkun.xlsx",sheet_name="xs",index=F
alse)
# mf=pd.read_excel("order_kunkun.xlsx",sheet_name="坤坤")
# print(mf)
爬虫
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
pip3 install urllib3==1.26.15
豆瓣网:
https://movie.douban.com/
例子:排行榜
-
动画
爬取一条数据
数据包的
headers
里面有我们需要的所有数据
数据包的
response
里面有我们要传递的
json
数据
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71
Safari/537.36"}
url="https://movie.douban.com/j/chart/top_list"
params={"type":"25","interval_id":"100:90","action":"","start":
"0","limit":"1"}
response=requests.get(url=url,headers=headers,params=params)
print(response.json())
爬取所有数据
刷新页面,一直往下滚动鼠标等待全部数据加载完成,共
147
条,修改参数的
limit
值即可

pandas 分析处理数据
把抓取的数据直接转换为
DataFrame
进行数据分析
这里处理并且添加自己想要的数据即可,此数据即为电影信息
类型为动漫类型,对应电影类型表
MovieType
的第二条数据
保存数据到文件
Movie.csv
content=response.json()
df=pd.DataFrame(content)
df=df[["id","title","release_date","score"]]
df["typeid"]=2
df.to_csv("/root/python/movie.csv",index=False)
导入到 mysql
电影表
(
编号
,
电影名称
,
上映时间
,
分数
,
电影类型编号
)
Movie(id,title,release_date,score,typeid)
os&shell
全自动导入
csv
文件到数据库
os.system("cp
/root/python/Movie.csv
/usr/local/mysql/data/Movie.csv")
os.system("/root/shell/mysqlcsv.sh
Movie
/usr/local/mysql/data/Movie.csv")
select * from Movie where typeid=2
上机练习 12---使用爬虫+pandas+os 获取处理导入数据
(这回是爬真的豆瓣电影!)
导入两种电影类型的电影到
mysql
数据库中,如:
豆瓣排行榜
-
动画
-mysql
数据效果如下:

Pa.py:
(
python
爬取部分)
import requests
import pandas as pd
import os
# 伪装网站
headers1={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71
Safari/537.36"}
url1="https://movie.douban.com/j/chart/top_list" #爬取网页
# 爬取参数
params1={"type":"25","interval_id":"100:90","action":"","start
":"0","limit":"20"}
response=requests.get(url=url1,headers=headers1,params=params1
)
# 获得前 20 个电影的 json 数据
GetData=response.json()
# print(GetData)
print("爬取中......")
# 将后续电影的 json 数据追加到 GetData 中
while True:
params1["start"]=str(int(params1["start"])+20)
response=requests.get(url=url1,headers=headers1,params=para
ms1)NewData=response.json()
if NewData!=[]:
GetData+=NewData
# print(GetData)
print("爬取中......")
else:
break
print("数据爬取完毕,开始解析数据......")
for i in GetData:
i["rating"]=i["rating"][1]
# 数据存入 excel 文件
print("正在更新 excel 文件......")
DisposalData=pd.DataFrame(GetData)[["id","title","release_date
","score","rating"]]
DisposalData.to_csv("/root/python/WedDouban/reallydouban.csv",
index=False,header=False,encoding="utf-8")
# 存入数据库
print("正在更新数据库......")
os.system("cp /root/python/WedDouban/reallydouban.csv
/usr/local/mysql/data/")
os.system(" /root/python/WedDouban/doubancsv.sh")
doubancsv.sh:(shell
写导入数据库部分
)
host="127.0.0.1"
port="3306"
user="root"
passwd="root123456"
dbname="test"
# 编写 shell 脚本/root/shell/mysqlcsv.sh
# 1.如果 douban 表存在则删除
mysql1="drop table if exists DoubanMovieType"
mysql -h$host -P$port -u$user -p$passwd $dbname -e "$mysql1"
# 2.如果 douban 表不存在则新建
mysql2="
create table if not exists DoubanMovieType(
id varchar(20) primary key,
title varchar(20),
release_date varchar(50),
score varchar(20),rating varchar(40)
)"
mysql -h$host -P$port -u$user -p$passwd $dbname -e "$mysql2"
# # 3.导入 douban.csv 数据到 douban 表中,建表过程为根据导入的 csv 文件
自动创建表
mysql3="LOAD DATA INFILE
'/usr/local/mysql/data/reallydouban.csv' INTO TABLE
DoubanMovieType
CHARACTER SET utf8
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES"
mysql -h$host -P$port -u$user -p$passwd $dbname -e "$mysql3"
# # 4.查询 douban 表验证结果
# mysql4="select * from douban1"
# mysql -h$host -P$port -u$user -p$passwd $dbname -e "$mysql4"
代码量不大,但是爬取的数据不好清洗,太多了,加上今天的知识点很多还没记
住,钻研了好久。
最后数据库中得到的表:
