安全矩阵

 找回密码
 立即注册
搜索
楼主: Pluto

李佳瑞学习日记

[复制链接]

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-3 23:31:08 | 显示全部楼层
今天复习了一下但没有看太久,因为今天是满课,今天着重把前天看的代码写了一遍。
即requests获取ajax数据
import requests
from user_agent import headers


class DoubanSpider(object):
    """获取豆瓣电影的数据"""

    def __init__(self):
        self.url = 'https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action='
        self.headers = headers

    # 发送请求
    def send_request(self):
        res = requests.get(url=self.url, headers=self.headers)
        return res.content.decode()

    # 写入文件
    def save_file(self, data):
        with open('douban01.html', 'w', encoding='utf-8') as f:
            f.write(data)

    # 调度
    def main(self):
        self.save_file(self.send_request())


if __name__ == '__main__':
    DoubanSpider().main()
下面是根据上面的进行的改进
import requests
from user_agent import headers


class DoubanSpider(object):
    """获取豆瓣电影的数据"""
    def __init__(self):
        # self.url = 'https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action='
        self.url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20'
        self.headers = headers

    # 发送请求
    def send_request(self):
        res = requests.get(url=self.url, headers=self.headers)
        return res.content.decode()

    # 写入文件
    def save_file(self, data):
        with open('douban02.json', 'w', encoding='utf-8') as f:
            f.write(data)

    # 调度
    def main(self):
        self.save_file(self.send_request())

   
if __name__ == '__main__':
    DoubanSpider().main()
   
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-5 00:18:36 | 显示全部楼层
今天把前天看的cookie试了一下,对比了一下有无cookie的区别,也从i春秋上看了一下web安全的课程,大体上懂上面老师将的是什么,但由于对Linux系统的陌生,不能很好地理解。我发现越学需要学地东西越多,抽时间再把Linux的命令行看一下。
带cookie得方法:
import requests


def renren_login():
   
    url = 'http://www.renren.com/880151247/profile'
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
               "Cookie": "anonymid=juzm79va-x03gqk; _r01_=1; __utma=151146938.1980998033.1562678160.1562678160.1562684150.2; __utmz=151146938.1562684150.2.2.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/SysHome.do; depovince=GW; JSESSIONID=abc_4rwb6Izg1dwTzTl6w; ick_login=94bc72db-8ea9-4062-bf95-11be7ef69687; first_login_flag=1; ln_uact=13522544918; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20190115/1510/main_rzqN_0a8e00002018195a.jpg; jebe_key=159a7cf3-f312-4a23-9171-7dbe7f8e2f41%7C021eab1936db44c0143f9c5e982dd6c2%7C1574302019911%7C1%7C1574302024449; _de=CB7DEF5A50C453AA3982328FA1810782; jebecookies=62057c21-0bfb-492b-a98e-185b25367803|||||; p=dec2e7171e29076ed2ea0984a74421f22; t=0f266f825f84da3f9be1b3d9da1ac7fb2; societyguester=0f266f825f84da3f9be1b3d9da1ac7fb2; id=499121422; xnsid=734fab61; ver=7.0; loginfrom=null; wp_fold=0"
    }

    # 发送请求
    res = requests.get(url, headers=headers).content.decode()

    # 保存
    with open('renren_cookie1.html', 'w', encoding='utf-8') as f:
        f.write(res)


renren_login()
不带cookie的方法:
import requests


def renren_login():
   
    url = 'http://www.renren.com/880151247/profile'
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"
    }

    # 发送请求
    res = requests.get(url, headers=headers).content.decode()

    # 保存
    with open('renren_no_cookie.html', 'w', encoding='utf-8') as f:
        f.write(res)


renren_login()
通过对比能比较好的理解
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-5 23:54:58 | 显示全部楼层
今天看了一下Linux操作系统的知识
Linux允许将命令执行结果定向到一个文件中,将本应该在终端显示的内容保存造指定文件中
重定向命令:>

如:ls > 1.txt(若1.txt不存在,则创建,若存在,则覆盖其内容)
注意:> 表示先清空,后追加
           >> 表示直接添加
cat:查看或合并文件内容
cat 1.txt(查看当前文件中的内容)
cat 1.txt 2.txt > ck.txt(合并文件内容)
注意:> 表示先清空,后添加
          >> 直接添加
分屏显示:more
当查询内容在一屏无法显示时,为了查看方便,则需要分屏显示
此时可以使用more命令,每次只显示一页
按空格键显示下一页,按q键退出
如:more 2.txt
管道:|
一个命令的输入可以作为另一个命令的输出
可以理解为生活中国的水管,一头进去,一头出来
这里 | 的左右分别为两端,左边塞东西(写)右边取东西(读)
如:ls –lh | more
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-6 23:56:07 | 显示全部楼层
今天看的还是Linux的基本内容
文本搜索和查找文件及通配符
Grep
grep是一种强大的文本搜索工具,可以对文本文件进行查找
格式:grep 选项  搜索内容的文件名
在grep中输入字符串参数时,最好用单引号或双引号括起来
如:grep ‘q’ 1.txt
正则表达式
正则表达式是对字符串操作的一种逻辑公式
^a,搜索以a开头的行
b$,搜索以b结束的行
查找文件:find
ind通常用来在特定的目录下搜索符合条件的文件
find ./ -name b.txt
find ./ -name '*.txt'         查找当前目录下所有后缀为.txt的文件
find ./ -name "[A-Z]*"         查找当前目录下所有以大写字母开头的文件
通配符
通配符是一种特殊的字符,用来模糊搜索文件
代表0个或多个任意字符  *
代表任意一个字符   ?
[ 代表任意一个字符 ]  代表任意一个字符

    find *.txt
    ls 1?3.txt
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-7 23:29:46 | 显示全部楼层
Linux系统其实也就是通过小窗口来实现Windows的操作,其中快捷键蛮多的,以后有机会多练一下,毕竟熟能生巧。电脑没有安装虚拟机,没办法自己动手操作,虽然看了,但还是很虚,不清楚自己学到多少。尝试安装虚拟机,花了很长时间,安好了但是打不开,好像是电脑的兼容问题。
今天整理一下Linux系统命令的内容
打包及解包:tar
是将经常重要的数据归档到一个大文件中,也可以把文档解开恢复数据
tar  [ 选项]  打包文件名 文件
常用参数
-c  生成档案文件,创建打包文件
-v   列出归档接档的详细过程,显示进度
-f   指定档案文件名称,f后面一定是 .tar文件,所以必须放在选项最后,注意:除了 f 放在最后,其他两个参数随意
-x   解开档案文件
bz2压缩格式
压缩用法:tar –jcvf 压缩包报名 文件
解压用法:tar –jxvf 压缩包报名
zip压缩格式
通过zip压缩文件的目标文件不需要指定的扩展名,默认扩展名为:zip
压缩文件:zip  目标文件( 没有扩展名 ) 源文件
解压文件:unzip  -d  路径 压缩文件
文件权限的介绍
rwx         含义
r         read 表示可读取,对于一个目录,如果没有r权限,那么就意 味着不能通过ls查看这个目录的内容。
w         write 表示可写入,对于一个目录,如果没有w权限,那么就意味着不能在目录下创建新的文件。
x         excute 表示可执行,对于一个目录,如果没有x权限,那么就意味着不能通过cd进入这个目录。
拥有者、同组者及其他人的权限
u         user 表示该文件的所有者
g         group 所有者和拥有着属于同一组,即用户组
o         other 表示其他以外的人
a         all 表示这三者皆是
权限的增加,撤销与设置
[ +-= ]                  含义
+                            增加权限
-                            撤销权限
=                            设定权限
格式:chmod u/g/o/a +/-/= rwx 文件
如果想递归所有目录加上相同权限,需要加上参数“ -R ”
查看命令位置:which
which  命令名称
注意:which cd查看不了命令所在目录
          which命令分为内置命令和外部命令
         cd 属于内置命令
切换到管理员账号:sudo -s
一般不需要切换到管理员账号,需要使用管理员权限时在命令前面加:sudo
退出管理员命令:exit
查看当前用户
whoami
vim的概念和优势
vim:Unix及类Unix系统文本编辑器,类似于windows中的记事本
优点:类似于vi,功能强大,高度可定制的文本编辑器
vim的三种模式
vim的三种模式:命令模式,编辑模式,末行模式
vim三中模式的介绍
命令模式:当启动vim,便进入命令模式,此状态下敲击键盘会被vim识别为命令,而并非输入字符,无论用户在什么模式下,只要按esc,均可进入命令模式
编辑模式:在命令模式下,插入命令 i 可进入编辑模式,该模式下,用户输入任何字符都被 vi 当作文件内容保存起来并显示在屏幕上,按 ESC 可回到命令模式
末行模式:在命令模式下,按冒号 shift+:进入末行模式,显示到最后一行,等待用户输入命令(将缓存区的内容写入到文件中)
进入编辑模式
i:插入光标的前一个字符
I:插入行首
a:插入光标后一个字符
A:插入行末
o:    向下新开一行,插入行首
O:向上新开一行,插入行首
进入命令模式
ESC:从插入模式或末行模式进入命令模式
方向键上下左右表示向对应的方向移动
gg:光标移动到第一行行首
G:光标移动到最后一行行首
x:从前往后删除一个字母
X:从后往前删除一个字母
yy:复制光标所在行,p:粘贴
dd:删除光标所在行
u:撤销   ctrl + r 反撤销
进入末行模式
按 shift + : 进入末行模式
wq  保存并退出
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-8 23:35:10 | 显示全部楼层
Linux的基本操作差不多看完了,又返回去联系了一下不熟练的数据库,数据库的内容也只是看了一点,还有很多没学,今天复习了之前学的内容
进行练习    练习的内容也是从网上找的 下午没课,几乎是用了一个下午才,照着教程操作了一次   (发现了一个很好用的软件typora )
首先准备数据:
-- 创建数据库 create database python_test_1 charset=utf8;
-- 使用数据库 use python_test_1;
-- 创建学生表
create table students( id int unsigned primary key auto_increment not null, name varchar(20) default '', age tinyint unsigned default 0, height decimal(5,2), gender enum('男','女','中性','保密') default '保密', cls_id int unsigned default 0, is_delete bit default 0 );
-- 创建班级表
create table classes ( id int unsigned auto_increment primary key not null, name varchar(30) not null );
-- 向学生表中插入数据 insert into students values (0,'张三',18,180.00,2,1,0), (0,'李四',18,180.00,2,2,1), (0,'王五',29,185.00,1,1,0), (0,'赵六',59,175.00,1,2,1), (0,'冯远征',38,160.00,2,1,0), (0,'金星',28,150.00,4,2,1), (0,'王刚',18,172.00,2,1,1), (0,'周杰伦',36,NULL,1,1,0), (0,'曹操',27,181.00,1,2,0), (0,'刘备',25,166.00,2,2,0), (0,'孙权',33,162.00,3,3,1), (0,'周瑜',12,180.00,2,4,0), (0,'鲁肃',12,170.00,1,4,0), (0,'马超',34,176.00,2,5,0);
-- 向班级表中插入数据 insert into classes values(0,'python_01'),(0,'python_02');
-- 数据准备就绪,开始查询 -- 查询编号大于3的同学 select * from students where id>3;
-- 查询编号不大于3的同学 select * from students where id<=3;
-- 查询姓名不是张三的同学 select * from students where name!='张三'
-- 查询编号大于3的男同学 select * from students where id>3 and gender='男';
-- 查询编号大于2或者没被删除的同学 select * from students where id>2 or is_delete=0;
-- 查询姓李的学生 select * from students where name like '李%';
-- 查询姓张且名字是一个字的学生 select * from students where name like '张_';
-- 查询姓马或者名字是超的学生 select * from students where name like '马%' or name like '%超';
-- 查询编号是1或3或5的学生 -- in表示在一个非连续的范围内
select * from students where id in(1,3,5);
-- between ... and ...表示在一个连续的范围内 -- 查询编号为3到8的学生 select * from students where id between 3 and 8;
-- 查询编号是3到8的男生 -- between A and B在匹配数据的时候匹配的范围空间是 [A,B] select * from students where (id between 3 and 8) and gender='男';
-- is null表示判断为空 -- 查询没有填写身高的学生 select * from students where height is null;
-- 判非空is not null -- 查询填写了身高的学生 select * from students where height is not null;
-- order by 排序查询 -- 排序的语法规则:select * from 表名 order by 列1 asc | desc, 列2 asc | desc, ...
-- 查询未删除男生信息,按学号降序 select * from students where gender='男' and is_delete=0 order by id desc;
-- 查询未删除学生信息,按名id升序 select * from students where is_delete=0 order by id asc;
-- 显示所有的学生信息,先按照年龄从大-->小排序,当年龄相同时 按照身高从高到低排序 select * from students where order by age desc, height desc;
-- 分页查找
-- 分页查找格式 -- select * from 表名 limit start=0,count;
-- 查询前3行男孩信息 select * from students where gender=1 limit 0,3;
-- 聚合函数 -- 查询学生总数 select count(*) from students;
-- max(列) 表示求此列的最大值 -- 查询女生的编号最大值 select max(id) from students where gender=2;
-- min(列) 表示求此列的最小值 -- 查询未删除的学生最小编号 select min(id) from students where is_delete=0;
-- sum(列) 表示求此列的和 -- 查询男生的总年龄 select sum(age) from students where gender=1;
-- avg(列) 表示求此列的平均值 -- 查询未删除女生的编号平均值 select avg(id) from students where is_delete=0 and gender=2;
-- 分组查询 -- 需求:先查出学生表,在将学生表以性别进行分组
查出所有学生
select * from students;
按gender字段来进行分组查询
select gender from students group by gender;
-- 根据分组结果,使用group_concat()存放每一个分组中某字段的集合 -- 需求:根据性别字段,列出性别所对应姓名的结合 select gender,group_concat(name) from students group by gender;
-- 聚合函数在和group by结合使用的时候 统计的对象是每一个分组 -- 分别统计性别为男/女的人年龄平均值 select gender,avg(age) from students group by gender;
-- 分别统计性别为男/女的人的个数 select gender,count(*) from students group by gender;
-- 连接查询 -- 连接查询语法 -- select * from 表1 inner或left或right join 表2 on 表1.列 运算符 表2.列
-- 使用内连接查询班级表与学生表 select * from students inner join classes on students.cls_id = classes.id;
-- 使用左连接查询班级表与学生表 select * from students left join classes on students.cls_id = classes.id;
-- 使用右连接查询班级表与学生表 select * from students right join classes on students.cls_id = classes.id;
然后准备文档
-- 创建名为python_test_1的数据库 create database python_test_1 charset=utf8;
-- 使用python_test_1数据库 use python_test_1;
-- 创建students学生表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default '', age tinyint unsigned default 0, height decimal(5,2), gender enum('男','女', '中性', '保密'), cls_id int unsigned default 0, is_delete bit default 0 );
-- 创建classes班级表 create table classes( id int unsigned primary key auto_increment not null, name varchar(30) not null );
| Field | Type | Null | Key | Default | Extra | +-----------+-------------------------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | | | | age | tinyint(3) unsigned | YES | | 0 | | | height | decimal(5,2) | YES | | NULL | | | gender | enum('男','女','中性','保密') | YES | | NULL | | | cls_id | int(10) unsigned | YES | | 0 | | | is_delete | bit(1) | YES | | b'0' | | +-----------+-------------------------------------+------+-----+---------+----------------+
-- 向学生表中插入数据 insert into students values (0,'张三',18,180.00,2,1,0), (0,'李四',18,180.00,2,2,1), (0,'王五',29,185.00,1,1,0), (0,'赵六',59,175.00,1,2,1), (0,'冯远征',38,160.00,2,1,0), (0,'金星',28,150.00,4,2,1), (0,'王刚',18,172.00,2,1,1), (0,'周杰伦',36,NULL,1,1,0), (0,'曹操',27,181.00,1,2,0), (0,'刘备',25,166.00,2,2,0), (0,'孙权',33,162.00,3,3,1), (0,'周瑜',12,180.00,2,4,0), (0,'鲁肃',12,170.00,1,4,0), (0,'马超',34,176.00,2,5,0);
-- 向班级表中插入数据
-- 数据准备就绪,开始查询 -- 查询编号大于3的同学 select * from students where id>3;
-- 查询编号不大于3的同学 select * from students where id<=3;
-- 查询姓名不是张三的同学 select * from students where name!='张三';
-- 查询编号大于3的男同学 select * from students where id>3 and gender='男';
-- 查询编号大于2或者没被删除的同学 select * from students where id>2 or is_delete=0;
-- 查询姓李的学生 select * from students where name like '李%';
-- 查询姓张且名字是一个字的学生 select * from students where name like '张_';
-- 查询姓马或者名字是超的学生 select * from where name like '马%' or name like '%超';
-- 查询编号是1或3或5的学生 -- in表示在一个非连续的范围内 select * from students where id in(1,3,5);
-- between ... and ...表示在一个连续的范围内 -- 查询编号为3到8的学生 select * from students where id between 3 and 8;
-- 查询编号是3到8的男生 -- between A and B在匹配数据的时候匹配的范围空间是 [A,B]
-- is null表示判断为空 -- 查询没有填写身高的学生 select * from students where height is null;
-- 判非空is not null -- 查询填写了身高的学生 select * from students where height is not null;
-- 当有数据重复时,可使用distinct对重复数据进行去重 -- 对性别进行去重 select distinct gender from students;
-- order by 排序查询 -- 排序的语法规则:select * from 表名 order by 列1 asc | desc, 列2 asc | desc, ...
-- 查询未删除男生信息,按学号降序 select * from students where is_delete=0 order by id desc;
-- 查询未删除学生信息,按名id升序 select * from students where is_delete=0 order by id asc;
-- 显示所有的学生信息,先按照年龄从大-->小排序,当年龄相同时 按照身高从高到低排序 select * from students order by age desc,height desc;
-- 分页查询 -- 查询前3行男同学信息 select * from students where gender=1 limit 0,3;
-- 聚合函数 -- 查询学生总数 select count(*) from students;
-- max(列) 表示求此列的最大值 -- 查询女生的编号最大值 select max(id) from students where gender=2;
-- min(列) 表示求此列的最小值 -- 查询未删除的学生最小编号 select min(id) from students where is_delete=0;
-- sum(列) 表示求此列的和 -- 查询男生的总年龄 select sum(age) from students where gender=1;
-- avg(列) 表示求此列的平均值 -- 查询未删除女生的编号平均值 select avg(id) from students where is_delete=2 and gender=2;
-- 分组查询 -- 需求:先查出学生表,在将学生表以性别进行分组
查出所有学生
select * from students;
按gender字段来进行分组查询
select gender from students group by gender;
-- 根据分组结果,使用group_concat()存放每一个分组中某字段的集合 -- 需求:根据性别字段,列出性别所对应姓名的结合 select gender,group_concat(name) from students group by gender;
-- 聚合函数在和group by结合使用的时候 统计的对象是每一个分组 -- 分别统计性别为男/女的人年龄平均值 select gender,avg(age) from students group by gender;
-- 在最后新增一行,来记录当前表中该字段对应的操作结果,一般是汇总结果 -- 分别统计性别为男/女的人的个数 select gender,count(*) from students group by gender with rollup;
-- 连接查询 -- 连接查询语法 -- select * from 表1 inner或left或right join 表2 on 表1.列 运算符 表2.列
-- 查询结果是返回两个表的交集 -- 使用内连接查询班级表与学生表 select * from students inner join classes on students.cls_id=classes.id;
-- 使用左连接查询班级表与学生表 select * from students left join classes on students.cls_id=classes.id;
-- 使用右连接查询班级表与学生表 select * from students right join classes on students.cls_id=classes.id;


下面是原始数据:
- 创建数据库
create database python_test_1 charset=utf8;

-- 使用数据库
use python_test_1;

-- students表
create table students(
   id int unsigned primary key auto_increment not null,
   name varchar(20) default '',
   age tinyint unsigned default 0,
   height decimal(5,2),
   gender enum('男','女','中性','保密') default '保密',
   cls_id int unsigned default 0,
   is_delete bit default 0
);

-- classes表
create table classes (
   id int unsigned auto_increment primary key not null,
   name varchar(30) not null
);
-- 向students表中插入数据
insert into students values
(0,'张三',18,180.00,2,1,0),
(0,'李四',18,180.00,2,2,1),
(0,'王五',29,185.00,1,1,0),
(0,'赵六',59,175.00,1,2,1),
(0,'冯远征',38,160.00,2,1,0),
(0,'金星',28,150.00,4,2,1),
(0,'王刚',18,172.00,2,1,1),
(0,'周杰伦',36,NULL,1,1,0),
(0,'曹操',27,181.00,1,2,0),
(0,'刘备',25,166.00,2,2,0),
(0,'孙权',33,162.00,3,3,1),
(0,'周瑜',12,180.00,2,4,0),
(0,'鲁肃',12,170.00,1,4,0),
(0,'马超',34,176.00,2,5,0);
-- 向classes表中插入数据
insert into classes values (0, "python_01期"), (0, "python_02期");
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-9 22:33:27 | 显示全部楼层

今天还是先复习了一下之前的内容 ,熟悉一下pymysql,熟能生巧



pymysql的使用

```python
from pymysql import connect
```

Connection 对象

```python
conn=connect(参数列表)

* 参数host:连接的mysql主机,如果本机是'localhost'
* 参数port:连接的mysql主机的端口,默认是3306
* 参数database:数据库的名称
* 参数user:连接的用户名
* 参数password:连接的密码
* 参数charset:通信采用的编码方式,推荐使用utf8
```

- 关闭连接    `conn.close()`
- 提交数据   `conn.commit()`
- 撤销数据   `conn.rollback()`
- 通过连接获取游标    `cur = conn.cursor()`返回Cursor对象,用于执行sql语句并获得结果



Cursor游标对象

- 获取Cursor对象

  ```
    # 调用Connection对象的cursor()方法   
    cur =conn.cursor()
  ```

目的: **执行sql语句**(使用频度最高的语句为select、insert、update、delete)

- 使用游标执行SQL语句

`execute(operation [, parameters ])` 执行SQL语句,**返回受影响的行数**,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句

- 关闭游标   `cur.close()`

- 获取结果集中的一条

    `cur.fetchone()`返回一个元组 形如 (1,'妲己',18)

- 获取结果集中的所有

    `cur.fetchall()`执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回 形如((1,'公孙离',20),(2,'妲己',18))



### pymysql完成数据查询

```mysql
import pymysql

# 创建和数据库服务器的连接 服务器地址   端口    用户名     密码  数据库名 通信使用字符和数据库字符集一致
conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python_test_1', charset='utf8')

# 获取游标
cursor = conn.cursor()

# 执行SQL语句 返回值就是SQL语句在执行过程中影响的行数
sql = """select * from hero;"""

row_count = cursor.execute(sql)
print("SQL语句执行影响的行数%d" % row_count)

# 取出结果集中一行  返回的结果是一行 (1, '妲己', 2)
# print(cursor.fetchone())

# 取出结果集中的所有数据  返回 ((一行数据),(),())
# ((1, '妲己', 2), (2, '李白', 1), (3, '程咬金', 3), (4, '亚瑟', 5), (5, '荆轲', 99))
for line in cursor.fetchall():
    print(line)

# 关闭游标
cursor.close()

# 关闭连接
conn.close()
```

### pymysql完成对数据库的增删改

```python
import pymysql

conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='mysql',db='python_test_1', charset='utf8')

# 通过连接获取游标
cursor = conn.cursor()


# sql = "delete from hero where id = 5;"
# sql = insert into hero (name) values ('西部大坏蛋孙悟空');
sql = "update hero set kongfuid=444 where id = 4;"

row_count = cursor.execute(sql)
print("SQL语句执行影响的行数%d" % row_count)

# 提交数据到数据库
# conn.commit()

# 回滚数据到什么都不做的状态 即撤销刚刚的修改
conn.rollback()

# 关闭游标和连接
cursor.close()
conn.close()
```

下面是今天心看的内容,聚合函数

今天看的是数据库中的聚合函数

聚合函数对一组值执行计算,并返回单个值。除了 COUNT 外,聚合函数都会忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用

特点

  聚合函数又称函数组,会把当前表当作一个组来统计

  不允许出现嵌套 比如sum(max(…))

count(*)函数

count(*) 表示计算总行数

查询学生总数

select count(*) from students;

max()和min()

max(列) 表示求此列的最大值

查询女生的编号最大值

select max(id) from students where gender=2;



min(列) 表示求此列的最小值

查询未删除的学生最小编号

select min(id) from students where is_delete=0;

sum()求和

sum(列) 表示求此列的和

查询男生的总年龄

select sum(age) from students where gender=1;

avg()求平均值

vg(列) 表示求此列的平均值

查询未删除女生的编号平均值

select avg(id) from students where is_delete=0 and gender=2;
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-10 23:25:05 | 显示全部楼层
-- 创建 "京东" 数据库
create database jing_dong charset=utf8;

-- 使用 "京东" 数据库
use

-- 创建一个商品goods数据表,创建一个商品goods数据表,有id字段,name字段,
-- cate_name字段,brand_name字段,price字段,
-- is_show 字段,is_saleoff字段
create table goods(
        id int unsigned primary key auto_increment not null,
        name varchar(150) not null,
        cate_name varchar(40) not null,
        brand_name varchar(40) not null,
        primary decimal(10,3) not null default 0,
        is_show bit not null default 1,
        is_saleoff bit not null default 0

);

# 插入数据

insert into goods values(0,'r510vc 15.6英寸笔记本','笔记本','华硕','3399',default,default);
insert into goods values(0,'y400n 14.0英寸笔记本电脑','笔记本','联想','4999',default,default);
insert into goods values(0,'g150th 15.6英寸游戏本','游戏本','雷神','8499',default,default);
insert into goods values(0,'x550cc 15.6英寸笔记本','笔记本','华硕','2799',default,default);
insert into goods values(0,'x240 超极本','超级本','联想','4880',default,default);
insert into goods values(0,'u330p 13.3英寸超极本','超级本','联想','4299',default,default);
insert into goods values(0,'svp13226scb 触控超极本','超级本','索尼','7999',default,default);
insert into goods values(0,'ipad mini 7.9英寸平板电脑','平板电脑','苹果','1998',default,default);
insert into goods values(0,'ipad air 9.7英寸平板电脑','平板电脑','苹果','3388',default,default);
insert into goods values(0,'ipad mini 配备 retina 显示屏','平板电脑','苹果','2788',default,default);
insert into goods values(0,'ideacentre c340 20英寸一体电脑 ','台式机','联想','3499',default,default);
insert into goods values(0,'vostro 3800-r1206 台式电脑','台式机','戴尔','2899',default,default);
insert into goods values(0,'imac me086ch/a 21.5英寸一体电脑','台式机','苹果','9188',default,default);
insert into goods values(0,'at7-7414lp 台式电脑 linux )','台式机','宏碁','3699',default,default);
insert into goods values(0,'z220sff f4f06pa工作站','服务器/工作站','惠普','4288',default,default);
insert into goods values(0,'poweredge ii服务器','服务器/工作站','戴尔','5388',default,default);
insert into goods values(0,'mac pro专业级台式电脑','服务器/工作站','苹果','28888',default,default);
insert into goods values(0,'hmz-t3w 头戴显示设备','笔记本配件','索尼','6999',default,default);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);
insert into goods values(0,'x3250 m4机架式服务器','服务器/工作站','ibm','6888',default,default);
insert into goods values(0,'商务双肩背包','笔记本配件','索尼','99',default,default);



import pymysql

class JD(object):
    def __init__(self):
        pass

```
def show_all_goods(self):
    #  建立连接
    conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='mysql', db='jing_dong',
                           charset='utf8')

    # 创建游标对象 
    cs = conn.cursor()

    # 执行sql语句
    sql = 'select * from goods'
    cs.execute(sql)

    # 获取数据
    content = cs.fetchall()
    for i in content:
        print(i)

    # 关闭连接,关闭游标
    cs.close()
    conn.close()

def run(self):
    print('欢迎来到京东商城')
    print('----------------------')
    print('输入数字1获取所有商品信息')

    num = input()

    if num =='1':
        # 展示商品信息
        self.show_all_goods()
    else:
        print('您输入有误')
```

if __name__ == '__main__':
    jd = JD()
    jd.run()
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-11 23:19:00 | 显示全部楼层
#ajax 技术

```
异步的javascript 和 xml

经常用于前端和服务器端的数据交互

优点:异步获取数据,局部刷新,对程序友好
```

#web服务器

```
客户端(展示数据)服务器端(存储数据)
browser《=》servers    b/s架构

mac 自带服务器 站点位置:资源库=》webServer=》Documents

        服务启动:终端=》sudo apacheCtl start=》输入密码
        服务停止:终端=》sudo apacheCtl stop
        重启服务:终端=》sudo apacheCtl restart

        启动服务之后,在浏览器中输入:localhost

window  需要安装appserver
        安装教程:https://wenku.baidu.com/view/60d25b126c175f0e7cd13766.html

        下载地址:https://www.appserv.org/en/

        站点位置:在安装目录中 www文件夹,进入以后将文件都删除,因为默认会打开index.html页面,所以将我们的文件都以文件夹形式存放

        启动服务:运行=》服务=》查看本地服务=》apache2.2=》右键单击

        启动服务以后,在浏览器中输入localhost:端口号
```

#url   http://localhost:8080/index.html
       

```
http://  http协议
域名:顶级域名,二级域名
端口:8080

协议     域名            服务器上的文件路径            参数
https://baike.baidu.com/item/App%20Server/3539420?fr=aladdin
```

**当你访问服务器的时候,如果服务器上的文件能被浏览器解析,浏览器就会解析它,如果不能,那么浏览器就会下载它**

# 查询IP:

```
window:  在cmd中输入 ipconfig
mac   :  在终端中输入 ifconfig | grep "inet " | grep -v 127.0.0.1
```

#使用ajax 四部曲
       

```
1.创建ajax实例对象
2.打开服务器进行连接
3.发送请求
4.接受返回数据

注意的问题:

        兼容问题
```

```
                try{
                        xhr=new XMLHttpRequest();
                }catch(e){
                        xhr=new ActiveXObject("Microsoft.XMLHTTP");
                }

```

```
        get请求的缓存问题
        可以在url后面追加时间戳
```

#ajax状态码
       

```
readyState从0-4变化,每一次变化都会调用onreadystatechange函数

status  200代表成功返回
```

#post 和 get的不同

```
get是获取数据,优先从缓存中读取数据
        参数拼接到url后面,不安全
        参数传递有大小的限制,最大1024kB
        速度快,一般来说,比post请求快一倍

post是提交数据,
        参数是放到send中去提交,比较安全
        参数传递量很大,缓存较轻
        时间较长
```







回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-4-12 23:25:33 | 显示全部楼层
今天练习的时候,发现对数据库中的英文不是很熟悉,就特意来整理一下
Connect方法
用于建立与数据库的连接 调用pymysql模块中的connect()方法
conn=connect(参数列表)
参数host:连接的mysql主机,如果本机是‘localhost等价于127.0.0.1'
参数port:连接的mysql主机的端口,默认是3306
参数user:连接的用户名
参数password:连接的密码
参数database:数据库的名称
参数charset:通信采用的编码方式,推荐使用utf8
Cursor游标对象
获取Cursor对象
        调用Connection对象的cursor()方法   
        cs =conn.cursor()
使用游标执行SQL语句
        cs.execute(sql) 执行SQL语句,对数据进行增删改查
获取数据
        获取数据 cs.fetchone() 或者 cs.fetchall()       
除此之外,我还看到了一篇关于如何验证索引查询速度的文章,其代码如下,感觉挺有用的
**使用python程序(ipython也可以)通过pymsql模块 向表中加入十万条数据**  

**注意: 可能当前终端在前面验证事务的时候已经关闭了自动提交。 因此最简单的方式就是重开mysql终端。**

```mysql
from pymysql import connect

def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='jing_dong',user='root',password='mysql',charset='utf8')
    # 获得Cursor对象
    cursor = conn.cursor()
    # 插入10万次数据
    for i in range(100000):
        cursor.execute("insert into test_index values('ha-%d')" % i)
    # 提交数据
    conn.commit()

if __name__ == "__main__":
    main()
```

#### 查询

- 开启运行时间监测:

```mysql
set profiling=1;
```

- 查找第1万条数据ha-99999

```mysql
select * from test_index where title='ha-99999';
```

- 查看执行的时间:

```mysql
show profiles;
```

- 为表title_index的title列创建索引:

```mysql
create index title_index on test_index(title(10));
```

- 执行查询语句:

```mysql
select * from test_index where title='ha-99999';
```

- 再次查看执行的时间

```mysql
show profiles;
```

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:38 , Processed in 0.017945 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表