Python一个月实训记录

文章目录

  • Python一个月实训
    • 0701
    • 0702
    • 0703
    • 0706
    • 0707
    • 0708
    • 0709
    • 0710
    • 0713
      • 1.爬虫介绍
        • 1.1 大数据时代
        • 1.2 什么爬虫?
        • 1.3 爬虫如何爬取网页数据
        • 1.4 为什么选择python
        • 1.5 Python爬虫技术详解
      • 2.通用爬虫
        • 2.1 通用爬虫: 搜索引擎用的爬虫系统
      • 3.聚焦爬虫
        • 3.1 聚焦爬虫: 爬虫程序员针对某种内容的爬虫
        • 3.2 User-Agent历史
        • 3.3 HTTP和HTTPS
        • 3.4 HTTP工作原理
        • 3.5 请求报头
      • 4.Requests模块:
    • 0714
    • 0715
      • 1.XML的节点关系
      • 2.XPath开发工具
        • 2.1 选取节点
        • 2.2 谓语(Predicates)
        • 2.3 选取未知元素节点 通配符
      • 3.lxml库
    • 0716
      • 1.lxml和bs4以及re之间的优缺点
      • 2.对象种类
      • 3.遍历文档树
      • 4.搜索文档树
      • 5.CSS选择器
    • 0717
      • 1.JSON
      • 2.JsonPath
      • 3.编码问题
      • 4.Python与MySql的链接与增删改查
    • Python+Flask大项目
      • 0720
      • 0721

Python一个月实训

0701

  1. pycharm和Anaconda的安装

  2. pycharm环境配置和运行

  3. 类型 :type()

  4. 注释 :

    • 单行 #
    • 多行 ‘’‘ ’‘’
    • 文档注释 “”“ ”“”
  5. 地址:id()

  6. 关键字

  7. 输出

    • 普通输出 print
    • 格式化输出 占位符 %s
      • 常用格式:%d,%f,%s,%c,/n
      • *有乘法也有赋值的意思
      • ‘姓名:{},身份证:{}’.format(name,id)
  8. 输入

    input() 默认字符串

  9. 运算符

    1. 算数运算符
      • 取整除:a//b
      • 幂运算:2**3
  10. 强制类型转换

  11. 判断语句 if

  12. 比较运算符和逻辑运算符

  13. 循环语句

0702

  1. 猜数字游戏

    num=random.randint(0,100)

import random
num = random.randint(0,100)
while True:
    x=int(input("请输入一个数字"))
    if x==num:
        print("恭喜你,猜对了,数字是"+str(num))
        break
    elif x>num:
        print("大了,请重新输入")
    else:
        print("小了,请重新输入")
  1. while循环

    • 九九乘法表
    • 打印*
    i=0
    j=0
    while i < 6:
        while j < i:
            print("*"*j)
            j+=1
        i+=1
    j-=1
    while j>0:
        print("*"*j)
        j-=1
    
  2. for循环

  3. break和continue

  4. 字符串

    • 下标

    • 切片

      [起始:结束:步长] 开始<= x <结束

  5. 字符串常见操作

    • find():有下标,没有-1

    • index():有下标,没有报错

      count():统计字符数量

    • replace 替换

      s.replace("wuhu","hefei")

    • split() 分割,返回列表形式

      name.split(" ")

    • capitalize() 字符串首字母大写

    • title() 每个首字母大写

    • startswith() 以obj开头,返回True

      name.startswith("hello")

    • endswith() 以obj结尾,返回True

    • lower() 全部小写

    • upper() 全部大写

    • ljust() 返回原字符串左对齐,并用空格填充新字符

      s.ljust(10)

    • rjsut() 右对齐,空格填充

    • center() 中心对齐,空格填充

    • lstrip() 删除字符串左边的空白字符

    • rstrip() 删除右边空白

    • strip() 删除两边空白

    • rfind() 从右往左找

    • rindex() 从右往左找

    • partition() 以str分割字符串 str前,str,str后

    • rpartition() 从右往左分割

    • splitlines() 按行分割,返回列表

    • isalpha() 判断是否全是字母

    • isdigit() 判断是否都为数字

    • isalnum() 判断是数字和字母

    • isspace() 判断只包含空格

    • join() 每个字符后插入一个str

      name = " "
      li = ["my","name","is","John"]
      print(name.join(li))
      
  6. 列表 []

    1. 列表的循环遍历
    2. 列表的相关操作
      • 添加元素
        • append(): 添加到最后\
        • insert(): 根据下标插入 l.insert(1," ")
        • extend(): 列表添加列表
      • 修改元素:通过下标方式
      • 查找元素
        • in Jhon in names 在返回True
        • not in Jhon not in names
        • index() names.index("Jhon")
        • count() names.count("Jhon")
      • 删除元素
        • del del names[0] 根据下标删除
        • pop() 删除最后一个元素
        • remove() 根据元素删除
    3. 列表的嵌套

0703

  1. 元组 () 元组不可以修改

    • 查询 下标进行访问
    • 修改 不可修改
    • 内置函数:
      • index() 返回下标
      • count()
  2. 字典 {}

    student={"name":"xujihong"}

    • 修改 根据key值修改value

      student["name"]="John"

    • 添加 存在修改,不存在添加

    • 常见操作

      • len() 查找键值对数量
      • keys() 返回所有key key是唯一的
      • values() 所有values
      • items() 返回所有key:values的元组列表 不可修改
    • 字典的遍历

      • 遍历字典的key

        for key in dict.keys():

      • 遍历字典的values

        for value in dict.values():

      • 遍历key-values

        for item in dict.items():

      • 遍历key和values

        for key,value in dict.items()

      • 枚举遍历形式 enumerate 下标索引遍历

        for i,char in enumerate(chars):

  3. 公共方法

    • 运算符
      • +:合并 字符串,列表,元组
      • *: 赋值 字符串,列表,元组
      • in: 是否存在 字符串,列表,元组,字典
      • not in 不存在 字符串,列表,元组,字典
    • 内置函数
      • len() 元素个数
      • max() 最大值
      • min() 最小值
      • del() 删除变量
  4. 引用 字符串判断是否为同一引用

  5. 函数 提高代码块重复

    • 有参函数
      • 形式参数:函数后面的参数列表
      • 实际参数:调用函数的参数列表
    • 有返回值函数
      • python中的的返回值可以拥有多个返回值
    • 函数嵌套
  6. 局部变量和全局变量

    • 局部变量:函数内部变量
    • 全局变量:定义在函数外部
      • 局部改全局用global声明
    • 可变类型全局变量 lsit dict
      • 函数中不能修改全局变量的,加global声明修改数据指向
      • 全局变量不可变类型修改需要加global
      • 全局变量可变类型修改不需要加global

0706

  1. 函数的返回值

    返回多个返回值时使用的元组,本质是元组、

  2. 函数的参数

    • 缺省值参数 def info(name,age=18) 注:带默认值的放到形参列表最后

    • 不定长参数

      f(a,b,*args) *是元组()

      f(a,b,**args) **是以缺省值参数传递到形参 中,用dict字典保存{}

    • 引用参数

      不可变类型参数传递 a=1

      可变参数类型传递 alist = [1,2]

      注:python函数传递是引用传递(不是值传递)

      不可变类型:变量不能修改,所以运算不会影响自身

      可变类型:函数内部的运算会更改传入的参数变量

  3. 递归函数

  4. 匿名函数

    lambada x,y:x**y

    lambada :小型匿名函数,省略了def声明函数

    注意:匿名函数能接收任何数量的参数,但只能返回一个表达式的值

    匿名函数不能直接调用print,因为需要一个表达式

    sum = lambada

  5. 函数总结

    1. 自定义函数

      参数 返回值

    2. 调用函数

      1. 方式 函数名([实参列表])
      2. 写不写实参在于形参
      3. 调用时,实参个数和先后顺序要和形参要求一致
      4. 如果函数有返回值,那么可以使用一个变量保存
    3. 作用域

      1. 一个函数中定义的变量,只能在本函数中用(局部变量)
      2. 函数外定义的变量可以在所有的函数中使用(全局变量)
  6. 文件操作

    • 打开文件 open()

      规则:open(“文件名”,访问模式) 存在:打开;不存在:新建文件

      访问模式:

      • r:只读, 默认,文件指针会放在开头

      • w:写入 存在覆盖,不存在新建文件

      • a:追加 存在:指针放在末尾,不存在创建

      • rb: 以二进制格式只读,文件指针会放在开头

      • wb: 以二进制格式打开,存在覆盖,不存在新建文件

      • ab: 以二进制追加写入,存在:指针放在末尾,不存在创建

      • r+: 打开一个文件用于读写 ,文件指针会放在开头

      • w+: 打开一个文件用于读写

      • a+: 追加末尾

      • rb+: 二进制,读写,指针再开头

      • wb+ 二进制开大文件读写

      • ab+ 二进制追加 指针结尾

      总结:r读,w写,a追加写入,b二进制格式,+读写模式

      f = open(“test.txt”,‘w’)`

    • 关闭文件 close()

      注:有开就要有关

  7. 文件读写

    • 写数据(write)

      注:文件不存在创建,文件存在先清空在写入

    • 读数据(read)

      读取数据:txt = f.read()

      读取指定长度数据:txt = f.read(5) 读前五个

      注:读取一次后,文件指针会到结尾。数据类型为字符串str类型

    • 读数据(readlines) 读所有行

      content = f.readlines()

      注:类型为list型

    • 读数据(readline) 读单行

  8. 文件备份

  9. 文件的定位读写

    1. 获取当前读写的位置 tell()

      position = f.tell()

    2. 定位到某个位置 seek(offset,from)

      • offset:偏移量
      • from:方向 0 文件开头 1 当前位置 2文件末尾

      注:python3.x要加b open(" ",'wb')

      f.seek(5,0)

  10. 文件的重命名和删除

    1. 重命名 rename()

      os 模块中 import os

      os.rename("test.txt","new.txt")

    2. 删除 remove()

      os.remove("new.txt")

  11. 文件夹的相关操作

    1. 创建文件夹 os.mkdir(路径,名称) 默认当前文件夹

      os.mkdir("AHNU")

    2. 获取当前目录 os.getcwd()

    3. 改变当前目录 os.chdir()

      os.chdir("../") …/是上层目录

    4. 获取目录列表 os.listdir()

      默认是./ 当前目录

    5. 删除文件夹 os.rmdir()

  12. 批量修改文件名

0707

  1. 面向对象

    面向过程:从业务逻辑从上到下写代码

    面对对象:数据和函数封装在一起,减少代码重复

    1. 类 类名(父类)

      #定义类
      class Student():
      	def eat(self):
      		pass
      	def run(self):
      		pass
      #初始化		
      if __name__ == '__main__':
      	student = student()
      

    好处:每个对象只完成其中一部分功能

  2. init 函数

    初始化函数 ,相当于JAVA中的构造函数

    只能执行一次,创建对象的时候

    语法规则:__init__(self)

    1. 只在创建对象时调用,没有也不能用返回值
    2. 默认的构造函数里只有一个self函数,里面什么也没有
    3. 在生成对象时类名后面的括号里就是构造函数的参数
  3. self

    1. self可以理解为自己 C/java this
    2. self中存储的 当前类对象的引用地址
    3. python解释器会将该对象作为第一个参数给self
    4. 传递其他参数就在self之后
  4. 隐藏数据

    class npy():
        def __init__(self):
            self.height=175
            self.weight=100
            self.money=200
            self.__mt=3000
        def showInfo(self):
            print('身高%d,体重%d,钱%d'%(self.height,self.weight,self.money))
            print('mt:',self.__mt)
        def setHeight(self,height):
            self.height=height
    if __name__ == '__main__':
        npy=npy()
        npy.money=500
        npy.showInfo()
        npy.setHeight(165)
        npy.showInfo()
    
  5. 私有属性和函数

    私有设置:__为私有保护

    1. 私有属性以__开头
    2. 私有函数也是以__开头
    3. 私有属性和私有函数最重要的是安全

    注意:Python的私有其实是一种伪私有,本质上只是自动把成员的名字改成了_类名__(前1后2),我们完全可以通过改变后的名字来访问。

    class People():
        def __init__(self,name):
            #设置姓名   私有属性/保护属性
            self.__name = name
        def getName(self):
            return self.__name
        def __getSex():
            pass
        
    if __name__ == '__main__':
        pl = People("张三")
        
    
  6. del函数

    当删除一个对象时,python解释器会默认调用一个函数__del__函数

    不写del函数,python解释器会自动创建该函数

    当多个引用指向同一个对象时,对象引用计数就会加1,删除对象时只会修改引用计数减1,当对象没有任何变量指向的时候才会调用del函数删除对象

  7. 单继承

    1. 当子类继承父类的时候,可以使用父类的公有属性以及公有函数
    2. 当子类初始化对象的时候,子类会默认调用父类的init函数
    3. 子类的继承定义类,小括号为父类名字
    class Cat(object):
        def __init__(self,name,color="白色"):
            self.name = name
            self.color = color 
        def run(self):
            print("%s====>在跑"%self.name)
            
    class Bosi(Cat):
        def setNewName(self,newName):
            self.name = newName
        def eat(self):
            print("%s===>在吃"%self.name)
    
    bs = Bosi("中国猫")
    pirnt(bs.name)
    print(bs.color)
    bs.eat()
    bs.setNewName("波斯猫")
    bs.run()
    
  8. 多继承

    1. python可以多继承
    2. 父类中的函数、属性子类都会继承
    3. 可以使用多个父类函数以及属性
    class A:
        pass
    class B:
        pass
    class C(A,B):
        ...
    
  9. 实例:满天星

  10. 实例:圣诞节

0708

  1. 实例:打字游戏
  2. 实例:汤姆猫
  3. 实例:移动图片和放大缩小图片

0709

  1. 实例:雷霆战机

0710

  1. 实例:雷霆战机完善

0713

1.爬虫介绍

1.1 大数据时代

数据获取方式

  1. 企业生产的用户数据:

     	大型互联网公司有海量用户,积累大量数据  有天然优势
     中小型企业,有意识的积累数据
     淘宝  京东  拼多多=>66条=>大数据分析 大数据挖掘
     ==数据就是金钱=
    
  2. 数据管理咨询公司:

    专门用来挖掘数据、数据采集团队, 市场调研 问卷调查 样本检测=>出卖给企业
    =>提供方案=>研发市场认可的饮料以及包装

  3. 政府/机构 公开数据: 政府的 各地政府统计上报的数据并且合并

     	   机构都是第三方权威机构
    

    安徽省合肥市 平均薪资 6000元 ===>税务部门 地级市…
    本科毕业生 平均薪资 … 三方协议

  4. 第三方数据平台购买数据:各个数据交易平台 获取数据 价格不同

     A数据平台(报警)   B数据平台(自己收集数据以外   爬虫爬取A数据平台的数据信息)
    

    22岁 23-25岁 婚姻网站 … 需不需要对象 介绍
    房产中介 租房子 买房子 房地产开发商
    房子买了 开发商 数据 卖给 装修公司
    装修好了 婚姻介绍所 …
    4S店 … 要不要买车
    结婚了 医院(妇产医院) 社居委 准生证(宣传彩页 某某妇产医院)
    卖房子 …保护好自己的数据
    新建数据库=>收集所有能收集数据信息==>就在数据库中

  5. 爬取数据:市场上没有需要的数据 不愿高价购买的 招聘 爬虫工程师 定向数据采集

1.2 什么爬虫?

爬虫:爬取网页数据的程序

1.3 爬虫如何爬取网页数据

​ 三大特征:
1.网页都有自己唯一的URL(统一资源定位符)进行定位
2.网页都使用HTML(超文本标记语言)来描述页面信息
3.网页都使用HTTP/HTTPS(超文本传输协议)来传输HTML数据

​ 爬虫设计思路:
1.首先确定需要爬取的网页URL地址(地址栏中URL地址 未必是真实地址 URL地址重定向)
2. 通过HTTP/HTTPS协议来获取对应的HTML页面
3. 提取页面有用数据
需要数据 保存起来
页面URL 执行第二步

1.4 为什么选择python

​ 爬虫语言: PHP,JAVA,C/C++,Python
PHP:多线程、异步支持不够好 并发处理能力弱 速度和效率比较高
Java:爬虫生态圈很完善,本身很笨重、代码量比较大、成本较高、爬虫需要经常修改部分代码
C/C++: 效率和性能最高 学习成本比较高 代码成型比较慢
Python:语法优美 代码简介 开发效率高 支持模块多 HTTP请求和HMTL解析模块非常丰富
还有强大爬虫Scrapy 成熟高效scrapy-redis 分布式策略 接口非常方便

1.5 Python爬虫技术详解

​ 1.如何抓取HTML页面:
urllib,urllib2,requests:HTTP请求处理,模拟浏览器发送请求,获取服务器响应文件
2.如何解析响应文件
re,xpath,bs4,jsonpath,pyquery:提取响应文件数据的匹配规则
3.如何采集动态HTML、验证码处理
Selenium+PhantomJS:模拟真实浏览器加载JS,AJAX等非静态页面数据
Tesseract:机器学习库、机器图像识别系统、简单验证码 专门的打码平台
(12306 验证码 防止爬虫工程师爬取 车辆信息 数据)
(崩溃:浏览器 插件 抢票软件 多线程 发送浏览器请求)
4.Python支持爬虫框架
Scrapy、Pyspider、twisted:高性能 异步网络框架 数据下载非常快、数据存储、提取规则等组件
5.分布式策略
scrapy-redis: redis数据库为核心组件(分布式服务器---->数据库在1台 解析2台 获取3台)
redis数据库 存储 列表、HashMap非常快 No SQL DB /SQL DB
MongoDB===>文档数据库 db2
6.爬虫与反爬虫斗争
网站开发工程师:防爬虫机制 User-Agent、验证码、动态数据加载、加密数据
网络爬虫工程师: 验证码打码平台、 数据是否值得去反反爬虫机制

​ 违法操作:安徽新华学院 门板上 联系方式 修改成绩
服务器=>学员信息=>各科成绩=>
Linux+Windows server 2003 =>服务器 安全机制非常差=>admin=>admin*****
获取获取数据库 成绩 信息
新闻 职业 计算机 没有充值饭卡 (后台) 充值 报警学生

​ 黑客=>攻破学校服务器 =>选课时候=>最容易攻破=>漏洞 内存溢出
黑客=>坐牢=>熊猫烧香=>中专生=>自学编程 黑客=>呆了10年

2.通用爬虫

2.1 通用爬虫: 搜索引擎用的爬虫系统

​ a:目标=>将互联网上所有的网页都下载下来,服务器进行备份,解析、提取关键字、去掉广告、用户检索接口
b:抓取流程=>
1.选取有效URL进行爬取队列
2. 队列中获取URL解析成IP 下载服务器中HTML页面 保存到搜索引擎服务qaq
3.解析网页内容 解析URL 解析关键字等
c:主动获取
1.主动获取网页地址https://ziyuan.baidu.com/linksubmit/url
2.其他网站设置网站外链
3.搜索引擎和DNS服务商合作 ip地址=>URL=>匹配
云服务 服务器=>使用ip地址 =>URL路径地址不同=>200块
DNS:域名解析成IP的一种技术

​ d:通用爬虫不是万物皆可爬 遵守规则: Robots协议(建议) 大型搜索引擎都会遵守
个人爬虫 <万物皆可爬>
https://www.taobao.com/robots.txt

​ User-agent: Baiduspider 用户代理 百度浏览器
Disallow: / /只能够爬取淘宝网的首页数据信息

​ User-agent: baiduspider
Disallow: /

​ e: 通用爬虫流程: 爬取网页-存储数据-内容处理-提供检索/排名服务
f: 搜索引擎排名:
1.PageRank值:根据网站流量(点击量、浏览量、人气)统计 流量越高 网站越值钱 排名越靠前
2.竞价排名 谁钱多 谁排名就高 (莆田系医院) 水军 刷点击流量 网络爬虫工程师 模拟IP进行刷流量
g:通用爬虫的缺点:
1.只能提供和文本相关的内容(HTML,word,PDF)等等不能提供多媒体文件(音乐、图片、视频)和程序
2.千篇一律 无法针对特定的数据搜索
3.不能理解人类语义上的检索
小米 小爱音响

3.聚焦爬虫

3.1 聚焦爬虫: 爬虫程序员针对某种内容的爬虫

​ 面向需求、面向主题、针对某种特定内容、保证信息和需求尽可能相关
a) User-Agent:爬虫的第一步 发送请求带User-Agent (希望使用谷歌和火狐浏览器)
b)reponse:服务器响应的文件 响应码
200:正常
404/405:服务器页面出错
500:服务器问题
获取响应码 response.getcode()
c) 实际数据的请求URL 防止重定向可以
获取实际URL response.geturl()
d) 数据响应HTTP报头:
response.info()

​ %E5%8C%BB%E9%99%A2&rsv_spt=1:医院

​ Request URL: https://www.baidu.com/s?wd=%E5%8C%BB%E9%99%A2&rsv_spt=1&rsv_iqid=0xe6967b5e000b0284&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&oq=%25E5%25BC%25A0%25E5%259F%25B9%25E5%259F%25B9&rsv_btype=t&inputT=2111&rsv_t=d4f6mDzGxDfX%2FkjdUorITw0iRvHFt5jo7IyyrWxv5YUaSiwpyoFvytc8VHDqTY6yXjan&rsv_pq=b655e41f0000b393&rsv_sug3=110&rsv_sug1=62&rsv_sug7=100&rsv_sug2=0&rsv_sug4=2112

3.2 User-Agent历史

​ Mosaic:世界第一个浏览器:美国国家计算机应用中心
Netscape网景:Netscape(支持框架) 第一款支持框架的浏览器
Microsoft微软: IE 也支持框架
第一次浏览器大战 网景失败消失
Mozilla基金组织:FireFox火狐-(Gecko内核) 第一款浏览器内核
User-Agent决定用户的浏览器 为了更好获取HTML页面效果
IE浏览器 内核使用IE的东西 外皮是Mozilla
Microsoft微软: IE
Opear公司: Opera
Mozilla基金组织: Firefox-Gecko
Linux组织:KHTML-Gecko
Apple公司:Webkit-KHTML
Google公司:Chrome-webkit
其他浏览器一般都是IE/Chrome内核

注意事项:每一种浏览器获取响应内容解析效果不尽相同
建议使用:1024*768 使用火狐或者谷歌浏览器

12306:遨游、猎豹、搜狗…只有用处抢票

HTML标签以及JS/JQuery/AJAX等等前端框架以及技术支持最全面 向下兼容

IE:6\7\8\9 10之间区别太大

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36

3.3 HTTP和HTTPS

HTTP协议:(超文本传输协议):发布和接收HTML页面的方法(已经很容易被爬虫)
HTTPS协议(安全版超文本传输协议):HTTP中添加了SSL层 安全套接层(不太容易被爬虫)
SSL(安全套接层)主要用户WEB安全传输协议,在传输层中对网络连接进行加密 保障Internet上数据安全传输

HTTP端口号:80
HTTPS端口号:443

3.4 HTTP工作原理

网络爬虫:抓取过程模拟浏览器操作过程

HTTP请求方式:
GET:参数会放到地址栏统一资源定位符上
POST:安全 form直接将参数传递服务器端
Response:image文件 CSS文件 JS文件 多媒体文件等等

=URL统一资源定位符解析=
scheme://host[:port#]/path/…/[?query-string][#anchor]
scheme:传输协议(HTTP,HTTPS,FTP)
host:服务器IP地址
port:端口号(默认走传输协议的端口号)
path:访问资源路径
query-string:参数列表
anchor:锚(跳转到页面指定的位置)

3.5 请求报头

​ 1.Host 主机和端口号
URL中WEB名称和端口号
2.Connection(链接类型)
默认Connection:keep-alive
server支持keep-alive 回复响应 Connection:keep-alive 不关闭链接
server不支持keep-alive 回复响应Connection:close 关闭链接

​ 自动的让你重新登录

​ 优点:重用链接,减少资源消耗,缩短响应时间,不必每次请求建立链接

​ 3.Upgrade-Insecure-Requests(升级HTTPS请求)

​ Upgrade-Insecure-Requests:请求加载http资源的时候回更换HTTPS
4.Accept(传输文件类型)
Accept:浏览器和客户端可以接受的类型
Accept: / 表示什么都可以接收
Accept:image/gif 客户端只接收GIF图像格式资源
Accept:text/html,application/xhtml+xml;q=0.9,image/*;q=0.8
表示可以接受所有html文本、xhmtl和xml文档,所有的图像格式资源
__q是权重稀疏 0-1之间 q值越大 请求越倾向 没有指定q则默认为1
text:标准化文本信息
application:用于传输应用程序数据或者二进制数据

​ 5.Referer(页面跳转)
Referer:表明网页来自哪个URL
6.Accept-Encoding(文件解码格式)
Accept-Encoding:浏览器可以接受的编码方式
Accept-Encoding:gzip;q=1.0,identity;q=0.5,*;q=0_
支持gzip,identity压缩编码

​ 7.Accept-Language(语言种类)
Accept-Language:浏览器可以接受的语言种类 en或者 en-us zh或者zh-cn

​ 8.Accept-Charset(字符编码)
Accept-Charset:浏览器可以接受的字符编码
Accept-Charset:iso-8859-1,gb2312,utf-8

​ 9.Cookie(Cookie)
Cookie:浏览器属性想服务器发送Cookie 小型数据体
注意事项:Cookie禁用 容易报错

​ 10.Content-Type(Post数据类型)
Conntent-type:POST请求方式的内容类型

​ Cookie和Session
Cookie:通过客户端记录的信息确认用户身份
Seesion:通过服务器端 记录信息确认用户的身份

备注:
1.GMT 格林尼治时间 1970-1-1 0:0:0
英国天文台 格林尼治
2.Transfer-Encoding:chunked
告诉客户端 服务器发送资源按照分块发送
每块都是独立的 最长一块是0的长度 客户端读取到0 传输结束

4.Requests模块:

python中标准库 urllib、urllib2、urllib3 使用API 不是太好用
requests模块继承所有urllib的特性,requests支持HTTP连接保持和连接池,支持Cookie保持回话
支持文件上传 支持自动响应内容编码 支持国际化URL和POST数据的自动编码

requests模块底层是urllib3
requests支持2.6-3.6版本

安装requests模块
cmd===>pip install requests
安装之后截图

4.1 GET请求
response.text 中requests模块会基于HTTP响应的文本编码自动解码响应内容,大多数Unicode字符集都可以被无缝解码
reponse.content中 返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件

4.2 POST请求

4.3 使用代理 通过任意请求方法提供proxies参数来配置单个请求

0714

1.Requests模块中Cookie
1.1 获取Cookie
response.cookies
1.2 解析Cookie
requests.utils.dict_from_cookiejar(cookiejar)

2.Requests模块中的Session
requests模块中,Session是非常常用的对象,保持一次用户会话,从浏览器端开始到结束为止
保持某些参数

2.1 实现人人网的登录效果
人人网注册一个账号

3.处理HTTP请求SSL验证
Requests模块可以为HTTPS请求验证SSL证书


网络爬虫 解析部分
爬虫四部分
1.明确目标
2.爬(内容全部爬下来)
3.取(解析 去掉没用的)
4.处理数据(存储)

1.正则表达式
1.1 定义: 规则表达式 通过用来检索、替换那些符合某个模式(规则)文本
1.2注意事项:正则表达式 对《字符串》操作的逻辑公式,定义好一些特定的字符以及组合
1.3 优点:
a) 字符串是否符合正则表达式的过滤逻辑(‘匹配’)
b)正则表达式难学 但匹配效率高 准备也高
1.4 流程:
正则表达式引擎=>(正则表达式文本)编译=>正则表达式对象=>需要匹配(response.text)
===>匹配结果

正则表达式匹配规则
语法 说明 表达式实例 完整匹配的字符串
一般字符 匹配自身 abc abc

. 匹配任意除换行符外的字符 a.c abc

\ 转义字符 a.c a.b
字符串中有字符*需要匹配 * a\c a\c

[…] 字符集(字符类) 范围 a[bcd]e abe
^取反 [^abc] 不是abc的其他字符 ace
ade
预定义字符集(可以写在[…])
\d 数字:[0-9] a\dc a1c
\D 非数字:[^\d] a\Dc abc
\s 空白字符:[<空格>\t\r\n\f\v] a\sc a c
\S 非空白字符:[^\s] a\Sc abc
\w 单词字符:[A-Za-z0-9] a\wc abc
\W 非单词字符:[^\w] a\Wc a c

数量词(字符或(…)之后)

  •   	匹配前一个字符0次或无限次		abc*						ab
      														abcccc
      		匹配前一个字符1次或无限次		abc+					abc
      														abcccc
      		匹配前一个字符0次或1次			abc?						ab
      														abc
    
    m} 匹配前一个字符m次 ab{2}c abbc
    m,n} 匹配前一个字符m至n次 ab[1,2]c abc
    m和n可以省略 abbc
    若省略m,则匹配0-n次
    若省略n,则匹配m至无限次
    ?+? ??{m,n}? 使* + ?{m,n} 编程非 贪婪模式 下文中介绍

边界匹配(不消耗待匹配字符串中的字符)
^ 匹配字符串 ^abc abc
在多行模式中匹配每一行的开头
$ 匹配字符串末尾
在多行模式中匹配每一行的末尾 abc$ abc
\A 仅匹配字符串开头 \Aabc abc
\Z 仅匹配字符串末尾 abc\Z abc
\b 匹配\w和\W之间 a\b!bc a!bc
\B 匹配非\w和\W之间[^\b] a\Bbc abc

备注:\w ===>\W之间 特殊字符 () []{}等等这些字符

逻辑、分组
| 代表左右表达式任意匹配一个 abc
先尝试左边 再匹配右边 abc|def def

(…) 表达式分组,表达式左边开始 (abc){2} abcabc
表达式一个整体 可以接数量词 a(123|456)c a123c
表达式中 |仅仅在该组中有效 a456c

(?P…) 分组,除了原有的编号外 (?Pabc){2} abcabc
再指定一个额外的别名

引用编号为分组 (\d)abc\1 1abc1
匹配到的字符串 5abc5

(?P=name) 引用别名的分组 (?P\d)abc(?P=id) 1abc1
匹配到字符串 9abc9

特殊构造(不作为分组)
(?..) (…)不分组版 (?:abc){2} abcabc
使用 | 或后接数量词
(?iLmsux) iLmsux每个字符代表一个匹配规则 (?i)abc AbC
只能用正则表达式开头 可选多个
(?#…) #后的内容作为注释被忽略 abc(?#comment)123 abc123
(?=…) 之后字符串内容需要匹配表达式 a(?=\d) 后面是的数字a
才能成功匹配 a123
(?!..) 之前字符串内容不需要匹配才能成功 a(?!\d) 后面不是数字
不消耗字符串内容 abc
(?<=…) 之前字符串内容需要不匹配 (?<=\d)a 前面是数字的a
表达式才能成功
(?

1.5 正则表达式 使用步骤
a)使用compile()函数将正则表达式的字符串形成编译为Pattern对象
b)通过Pattern对象 提供一系列的方法对文本进行匹配查找,获取Match对象
c)通过match对象提供的属性和方法获得信息 根据需要进行其他操作

1.6 Pattern对象常用方法如下:
match方法: 从起始位置开始查找,一次匹配 从头部查找
group==>获得一个或多个分组匹配的字符串默认group() group(0)
start([group])方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符索引)
参数默认值值为0
end([group])方法用于获取分组匹配的子串在整个字符串结束位置
参数默认值为0

​ search方法:查找字符串的任何位置 只要找到一个匹配结果就返回
语法规则:search(String[,pos,endpos]])

​ findall方法: 查找字符串的全部返回全部能匹配的子串,如果没有匹配则返回空列表
语法规则:findall(String[,pos[,endpos]])

​ finditer方法:查找字符串的全部返回迭代器
语法规则:finditer(String[,pos[,endpos]])

​ split方法:按照匹配子串将字符串分割后返回列表
语法规则:split(String[,maxsplit])
maxsplit分割最大分割次数,不指定全部分割

​ sub方法: 替换一个字符串
语法规则:sub(repl,string[,count])

0715

XML 可扩展标记语言====>存储数据显示数据
HTML 超文本标记语言===>网页设置
XML:传输数据
XML:标签是自定义的
XML: W3C推荐标准

XML 可扩展标记语言 为传输和存储数据 焦点是数据的内容
HTML 超文本标记语言 显示数据以及如何更好的显示数据
HTML DOM 文档对象模型 可以访问HTML元素 包含文本和属性 修改和删除 创建新元素等

HTML DOM模型示例 :以树结构表达HTML文档
Document

​ Root element

Element Element

body

Element Attribute Element Element

href

Text Text Text
“My title” My link My header

1.XML的节点关系

​ 1.1 父(Parent)
book元素是 title author year price元素的父元素

<book>
	<title lang="en">EveryDaytitle>
	<author>zhangsanauthor>
	<year>2005year>
	<price>30.00price>
<book>

1.2.子(children)
元素节点可能是0个或者一个或者多个
title author year price元素就是book元素的子元素

1.3 同胞(Sibling)
title author year price元素都是同胞

1.4 先辈(Anicestro)
title的元素先辈是book元素和bookstrore元素

1.5后代(Descendant)
某个节点的子,子的子等等
bookstore的后代是 book,title,author,year,price等元素

2.XPath开发工具

​ XPath是一门xml文档查找信息的语言 XML文档中对元素和属性进行遍历

开源表达式可编辑工具 XMLQuire(XML格式文件可用)
Chrome插件 XPath Helper
Firebox插件 XPath Checker

2.1 选取节点

​ 表达式 描述
nodename 选取此节点所有子节点 book
/ 从根节点选取 bookstore
// 从匹配选择当前节点选择文档的节点
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性

​ 路径表达式
boostore 选取bookstore元素所有子节点
/boostrore 选取根元素booostore 注意:起始于/ 则此路径代表某元素的绝对路径
bookstore/book 选取boostore的子元素的所有book元素
//book 选取所有的book子元素不管它的位置
bookstore//book 选取属于boostore元素的后代的所有book元素 不管它的位置
//@lang 选取名为lang的所有属性

2.2 谓语(Predicates)

谓语:查找某个特定的节点或者包含某个指定的值的节点,被嵌入方括号中
路径表达式
/bookstore/book[1] 选取bookstore子元素的第一个元素
/bookstore/book[last()] 选取bookstore子元素的最后一个元素
/bookstore/book[last()-1] 选取bookstore子元素的倒数第二个元素
/bookstore/book[position()❤️]选取最前面的两个属于bookstore元素的子元素的book元素
//title[@lang] 选取所有拥有名为lang的属性的title元素
//title[@lang=‘eng’] 选取所有的title元素,且元素拥有eng的lang属性
/bookstore/book[price>35.00]选取bookstore元素的所有book元素,且其中price元素的值必须大于35
/bookstore/book[price>35.00]/title 选取bookstore元素中的book元素的所有title元素,且其中的price元素值必须大于35

所有的XPath的原发内容,都是运用在Python抓取时候要先转换为xml格式

2.3 选取未知元素节点 通配符

​ 通配符
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点

路径表达式		
/bookstore/*		选取bookstore元素的所有子元素
//*				选取文档中所有元素
//tile[@*]		选取所有带有属性title元素

2.4 XPath的运算符
运算符	描述				实例					返回值
|		计算两个节点集	//book|//cd			拥有book和cd的节点集
+
-
*
div
=
!=
<
<=
>
>=
or
and 
mod

所有的XPath的原发内容,都是运用在Python抓取时候要先转换为xml格式

3.lxml库

​ lxml是HTML/XML的解析器,主要功能是如何解析和提取HTML/XML数据

0716

BeautifulSoup4
定义:bs4也是HTML/XML解析器,主要功能也是如何解析HTML/XML数据

1.lxml和bs4以及re之间的优缺点

lxml:只会局部遍历,而bs4是基础HTML DOM的整个文档遍历,解析整个DOM树,bs4内存会大很多
bs4:用来解析HTML比较简单,API非常人性化,支持CSS选择器、Python标准库中HTML解析器,也支持lxml的XML解析器

注意:bs4需要将html文件转换成HTML DOM文档 让lxml解析器去处理

解析工具 速度 使用难度 安装难度
正则 最快 困难 无(内置)
BeautifulSoup 慢 最简单 简单
lxml 块 简单 一般

2.对象种类

​ bs将复杂HTML文档转换成一个复杂树形结构,每个节点那都是Python对象,所有对象可以归纳为4种

2.1 TAG: HTML中一个个标签
name:标签名
attrs:标签属性 修改和删除以及获取标签属性

2.2 NavigableString:获取标签内部的文字 .string

2.3 BeautifulSoup:表示为文档的内容,也可以把bs4当做TAG对象,特殊TAG

2.4 Comment:是一种特殊类型NavigableString对象,其输出内容不包括注释符号

3.遍历文档树

​ 3.1 直接子节点 .contents.children属性
.content:将TAG子节点以列表的方式返回
.children:将TAG子节点以迭代器的方式返回

3.2 子孙节点 .descendants属性
.descendants:TAG子孙节点进行递归循环与children相似

3.3 节点内容 .string属性
.string:如果标签里面没有子标签,.string返回标签里面的内容。如果标签里面有《一个子标签》,那么.string返回最里面的内容
注意:一个子标签有效 多个子标签无效

4.搜索文档树

​ 4.1 find_all(name,attrs,recursive,text,kwargs)
name参数:
a)过滤器字符串,查找与字符串匹配的内容 查找文档中所有的标签
b)正则表达式 bs4会通过正则表达式match()匹配内容 匹配查找字符串头部 起始位置匹配一次
c)列表参数 将于列表中任一元素匹配的内容返回
keyword参数:
以(id="
*")形式进行查找 如果没有id则无法查找
text参数:
可以搜索文档中的字符串内容,与name参数的可选值一样,text参数接受该字符串

5.CSS选择器

​ CSS:标签名不加任何修饰,类名前加.,id名前加#

5.1 通过标签名查找

5.2 通过类名查找 .开头

5.3 通过id名查找

5.4 组合查找

5.5 属性查找

5.6 标签内容 get_text

注意事项:
标签内容 .text text() .string get_text()

​ re正则表达式
lxml解析器
bs4解析器
CSS选择器
搜索文档树
文档树
对象种类

0717

数据的提取 JSON与JsonPATH
JSON(JavaScript Object Notation) 是一种轻量级数据交换格式,容易阅读以及编写
方便机器进行解析和生成,数据的交互场景,前台和后台的数据交互

JSON:JavaScript中的对象和数组
1.对象: {}括起来的内容 {key:value,key:value…}键值对结构
2.数组: []括起来的内容 [‘Python’,‘Javascript’,‘C’]

1.JSON

功能模块dumps、dump、loads、load 用于字符串和python数据类型转换
1.1 loads() 把Json格式字符串解码转换成Python对象
JSON Python
object dict
array list
string unicode
number(int) int,long
number(real) float
true True
false False
null None

1.2 dumps 用于python类型转换为json字符串
Python JSON
dict object
list,tuple array
str,unicode string
int,long,float number
True true
False false
None null

1.3 dump() Python内置类型序列化json对象后写入文件

1.4 load() 读取json形式的字符串元素 转化成python类型

2.JsonPath

​ JsonPath信息抽取类库,从JSON文档中抽取指定信息的工具,提供多种语言版本
JsonPath与XPath语法类似 ,JSON结构清晰,可读性高,复杂度低,容易匹配
XPath JSONPath 描述
/ $ 根节点
. @ 当前节点
/ . or [] 取子节点
… n/a 取父 节点 JsonPath不支持
// … 不管什么位置,选择符合条件的节点
* * 匹配所有元素节点 通配符
@ n/a 根据属性访问,Json不支持 KEY-VALUE 不需要
[] [] 迭代器表示(可以做简单的迭代 数组下标 内容选值等)
| [,] 支持迭代器多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组 ,JSONPATH不支持

3.编码问题

​ Json格式字符串解码转换成Python对象 Json字符串解码格式

4.Python与MySql的链接与增删改查

MySQL(不要钱)=>Oracle甲骨文(收费)
4.1 操作流程
开始=>创建Connection=>获取Cursor游标=>执行查询、命令、获取数据、处理数据
==>关闭cursor=>关闭Connection=>结束

4.2 查看驱动模块是否下载 PyMySql

4.3 下载Navicat 新建文本文档是注册码
名字和组织名随便乱填
数据库名:AHSF
编码格式:UTF-8

所有保存表格后 长度为0 重新设置 Interger

mysql 尽量不要太高(python 对应的mysql驱动模块)

Python+Flask大项目

0720

电影管理系统(后台)

1.搭建项目架构
1.1 新建Flask项目
1.2 运行app.py 截图到群里面
1.3 SFMoive项目 新建manage.py文件
1.4 SFMoive项目 新建app文件夹
1.5 编写manage.py文件内容
1.6 编写app.init.py文件内容

2.设置数据库连接
2.1 MySQL数据库中 新建moive数据库
2.2 Navicat运行资料中 moive.sql文件
2.3 app/init.py文件中 设置连接数据库参数
2.4 pycharm=>database=>新建数据库连接
3.设置秘钥
4.设置缓存机制
5.设置DEBUG模式
6.获取数据库连接与缓存机制
7.导入和注册蓝图(后台管理系统蓝图)
8.新建admin蓝图中views.py文件
9.设置login请求
10.新建templates/admin/login.html 文件
11.设置manage.py文件Edit config… 添加 runserver

问题1:server returns invalid timezone.Go to ‘Advanced’ tab and set’serverTimezone’ property manually
服务器返回无效时区
在mysql命令窗口输入以下命令
show variables like ‘%time_zone%’;
set global time_zone=’+8:00’;

请求流程
manage.py=>app/init.py=>app/admin/init.py=>app/admin/views.py=>templates/admin/login.html

1.新建数据库映射文件app/admin/forms.py
1.1 forms /Loginform表单验证
2.新建app/admin/models.py
2.1 Admin 数据库表admin的映射模型层

3.复制粘贴资料
3.1 static文件夹下新建 粘贴 ionicons

0721

=========================
manage.py =>启动运行服务 管理加载Flask项目核心业务内容
app ===>存储所有的业务处理以及模块、视图路由

app/init.py =>设置框架名称、数据库连接、项目缓存机制、上传目录、DEBUG模式、注册蓝图
Host:127.0.0.1本机
192.168.0.1=>
互联网=>202.168.154.41
app/admin =>后台管理系统蓝图以及代码内容
app/admin/init.py=>设置admin蓝图名称以及调用蓝图的视图、路由
app/admin/views.py=>请求的路由以及业务处理代码
app/admin/forms.py=>表单验证、数据的获取

app/models.py=>各种数据库表的映射、数据转换
static = >静态文件夹、各种支持js、css、jQuery、img
templates=>模块文件夹 存储各种html文件

========================
问题1:始终在登录时候会报500错误 服务器出错
第一步:清除浏览器的所有的缓存cookie
第二步:关闭pycharm中所有服务器的启动
第三步:任务管理器中 关闭浏览器进程 关闭python.exe进程
第四步:关机重启
第五步:app/init.py 修改app.debug=True 显示错误的具体信息进行调试

问题2:1193,“Unknown system variable ‘tx_isolatio’”
下载MySQL数据库版本过高 没有对应驱动 transaction_isolation
解决方法:通过升级 sqlalchemy 的方法可以解决此问题,
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade sqlalchemy --ignore-installed

问题3:1130,“Host ‘*******’” is not allowed to connect to thhis MySQL server
解决方法:MySQL数据库=>mysql数据库=>user表中=>设置权限
root/localhost ===>可以使用全部的数据库权限

问题4:在flask框架中使用SQLALchemy插入数据时显示1366警告,警告信息如下:
Warning: (1366, “Incorrect string value: ‘\xD6\xD0\xB9\xFA\xB1\xEA…’ for column ‘VARIABLE_VALUE’ at row 481”) # cursor.execute(statement, parameters)
解决方法:下载数据库驱动:pip install mysql-connector

​ 数据库连接方式:

​ dialect+driver://username:password@host:port/database(‘数据库类型+数据库驱动名称://用户名:密码@机器地址:端口号/数据库名’)

​ ‘mysql+mysqlconnector://root:password@localhost/sqldb’

你可能感兴趣的:(Python学习,python,爬虫,Flask)