目录
上机练习 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"
代码量不大,但是爬取的数据不好清洗,太多了,加上今天的知识点很多还没记
住,钻研了好久。
最后数据库中得到的表: