pycharm和Anaconda的安装
pycharm环境配置和运行
类型 :type()
注释 :
地址:id()
关键字
输出
输入
input() 默认字符串
运算符
强制类型转换
判断语句 if
比较运算符和逻辑运算符
循环语句
猜数字游戏
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("小了,请重新输入")
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
for循环
break和continue
字符串
下标
切片
[起始:结束:步长] 开始<= x <结束
字符串常见操作
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))
列表 []
l.insert(1," ")
Jhon in names
在返回TrueJhon not in names
names.index("Jhon")
names.count("Jhon")
del names[0]
根据下标删除元组 () 元组不可以修改
字典 {}
student={"name":"xujihong"}
修改 根据key值修改value
student["name"]="John"
添加 存在修改,不存在添加
常见操作
字典的遍历
遍历字典的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):
公共方法
引用 字符串判断是否为同一引用
函数 提高代码块重复
局部变量和全局变量
函数的返回值
返回多个返回值时使用的元组,本质是元组、
函数的参数
缺省值参数 def info(name,age=18)
注:带默认值的放到形参列表最后
不定长参数
f(a,b,*args)
*是元组()
f(a,b,**args)
**是以缺省值参数传递到形参 中,用dict字典保存{}
引用参数
不可变类型参数传递 a=1
可变参数类型传递 alist = [1,2]
注:python函数传递是引用传递(不是值传递)
不可变类型:变量不能修改,所以运算不会影响自身
可变类型:函数内部的运算会更改传入的参数变量
递归函数
匿名函数
lambada x,y:x**y
lambada :小型匿名函数,省略了def声明函数
注意:匿名函数能接收任何数量的参数,但只能返回一个表达式的值
匿名函数不能直接调用print,因为需要一个表达式
sum = lambada
函数总结
自定义函数
参数 返回值
调用函数
作用域
文件操作
打开文件 open()
规则:open(“文件名”,访问模式) 存在:打开;不存在:新建文件
访问模式:
r:只读, 默认,文件指针会放在开头
w:写入 存在覆盖,不存在新建文件
a:追加 存在:指针放在末尾,不存在创建
rb: 以二进制格式只读,文件指针会放在开头
wb: 以二进制格式打开,存在覆盖,不存在新建文件
ab: 以二进制追加写入,存在:指针放在末尾,不存在创建
r+: 打开一个文件用于读写 ,文件指针会放在开头
w+: 打开一个文件用于读写
a+: 追加末尾
rb+: 二进制,读写,指针再开头
wb+ 二进制开大文件读写
ab+ 二进制追加 指针结尾
总结:r读,w写,a追加写入,b二进制格式,+读写模式
f = open(“test.txt”,‘w’)`
关闭文件 close()
注:有开就要有关
文件读写
写数据(write)
注:文件不存在创建,文件存在先清空在写入
读数据(read)
读取数据:txt = f.read()
读取指定长度数据:txt = f.read(5)
读前五个
注:读取一次后,文件指针会到结尾。数据类型为字符串str类型
读数据(readlines) 读所有行
content = f.readlines()
注:类型为list型
读数据(readline) 读单行
文件备份
文件的定位读写
获取当前读写的位置 tell()
position = f.tell()
定位到某个位置 seek(offset,from)
注:python3.x要加b open(" ",'wb')
f.seek(5,0)
文件的重命名和删除
重命名 rename()
os 模块中 import os
os.rename("test.txt","new.txt")
删除 remove()
os.remove("new.txt")
文件夹的相关操作
创建文件夹 os.mkdir(路径,名称) 默认当前文件夹
os.mkdir("AHNU")
获取当前目录 os.getcwd()
改变当前目录 os.chdir()
os.chdir("../")
…/是上层目录
获取目录列表 os.listdir()
默认是./ 当前目录
删除文件夹 os.rmdir()
批量修改文件名
面向对象
面向过程:从业务逻辑从上到下写代码
面对对象:数据和函数封装在一起,减少代码重复
类 类名(父类)
#定义类
class Student():
def eat(self):
pass
def run(self):
pass
#初始化
if __name__ == '__main__':
student = student()
好处:每个对象只完成其中一部分功能
init 函数
初始化函数 ,相当于JAVA中的构造函数
只能执行一次,创建对象的时候
语法规则:__init__(self)
self
隐藏数据
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()
私有属性和函数
私有设置:__为私有保护
注意: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("张三")
del函数
当删除一个对象时,python解释器会默认调用一个函数__del__
函数
不写del函数,python解释器会自动创建该函数
当多个引用指向同一个对象时,对象引用计数就会加1,删除对象时只会修改引用计数减1,当对象没有任何变量指向的时候才会调用del函数删除对象
单继承
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()
多继承
class A:
pass
class B:
pass
class C(A,B):
...
实例:满天星
实例:圣诞节
数据获取方式
企业生产的用户数据:
大型互联网公司有海量用户,积累大量数据 有天然优势
中小型企业,有意识的积累数据
淘宝 京东 拼多多=>66条=>大数据分析 大数据挖掘
==数据就是金钱=
数据管理咨询公司:
专门用来挖掘数据、数据采集团队, 市场调研 问卷调查 样本检测=>出卖给企业
=>提供方案=>研发市场认可的饮料以及包装
政府/机构 公开数据: 政府的 各地政府统计上报的数据并且合并
机构都是第三方权威机构
安徽省合肥市 平均薪资 6000元 ===>税务部门 地级市…
本科毕业生 平均薪资 … 三方协议
第三方数据平台购买数据:各个数据交易平台 获取数据 价格不同
A数据平台(报警) B数据平台(自己收集数据以外 爬虫爬取A数据平台的数据信息)
22岁 23-25岁 婚姻网站 … 需不需要对象 介绍
房产中介 租房子 买房子 房地产开发商
房子买了 开发商 数据 卖给 装修公司
装修好了 婚姻介绍所 …
4S店 … 要不要买车
结婚了 医院(妇产医院) 社居委 准生证(宣传彩页 某某妇产医院)
卖房子 …保护好自己的数据
新建数据库=>收集所有能收集数据信息==>就在数据库中
爬取数据:市场上没有需要的数据 不愿高价购买的 招聘 爬虫工程师 定向数据采集
爬虫:爬取网页数据的程序
三大特征:
1.网页都有自己唯一的URL(统一资源定位符)进行定位
2.网页都使用HTML(超文本标记语言)来描述页面信息
3.网页都使用HTTP/HTTPS(超文本传输协议)来传输HTML数据
爬虫设计思路:
1.首先确定需要爬取的网页URL地址(地址栏中URL地址 未必是真实地址 URL地址重定向)
2. 通过HTTP/HTTPS协议来获取对应的HTML页面
3. 提取页面有用数据
需要数据 保存起来
页面URL 执行第二步
爬虫语言: PHP,JAVA,C/C++,Python
PHP:多线程、异步支持不够好 并发处理能力弱 速度和效率比较高
Java:爬虫生态圈很完善,本身很笨重、代码量比较大、成本较高、爬虫需要经常修改部分代码
C/C++: 效率和性能最高 学习成本比较高 代码成型比较慢
Python:语法优美 代码简介 开发效率高 支持模块多 HTTP请求和HMTL解析模块非常丰富
还有强大爬虫Scrapy 成熟高效scrapy-redis 分布式策略 接口非常方便
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年
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.不能理解人类语义上的检索
小米 小爱音响
面向需求、面向主题、针对某种特定内容、保证信息和需求尽可能相关
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
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
HTTP协议:(超文本传输协议):发布和接收HTML页面的方法(已经很容易被爬虫)
HTTPS协议(安全版超文本传输协议):HTTP中添加了SSL层 安全套接层(不太容易被爬虫)
SSL(安全套接层)主要用户WEB安全传输协议,在传输层中对网络连接进行加密 保障Internet上数据安全传输
HTTP端口号:80
HTTPS端口号:443
网络爬虫:抓取过程模拟浏览器操作过程
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:锚(跳转到页面指定的位置)
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 传输结束
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参数来配置单个请求
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边界匹配(不消耗待匹配字符串中的字符)
^ 匹配字符串 ^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
再指定一个额外的别名
匹配到的字符串 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])
XML 可扩展标记语言====>存储数据显示数据
HTML 超文本标记语言===>网页设置
XML:传输数据
XML:标签是自定义的
XML: W3C推荐标准
XML 可扩展标记语言 为传输和存储数据 焦点是数据的内容
HTML 超文本标记语言 显示数据以及如何更好的显示数据
HTML DOM 文档对象模型 可以访问HTML元素 包含文本和属性 修改和删除 创建新元素等
HTML DOM模型示例 :以树结构表达HTML文档
Document
Root element
Element Element
bodyElement Attribute Element Element
hrefText Text Text
“My title” My link My header
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等元素
XPath是一门xml文档查找信息的语言 XML文档中对元素和属性进行遍历
开源表达式可编辑工具 XMLQuire(XML格式文件可用)
Chrome插件 XPath Helper
Firebox插件 XPath Checker
表达式 描述
nodename 选取此节点所有子节点 book
/ 从根节点选取 bookstore
// 从匹配选择当前节点选择文档的节点
. 选取当前节点
… 选取当前节点的父节点
@ 选取属性
路径表达式
boostore 选取bookstore元素所有子节点
/boostrore 选取根元素booostore 注意:起始于/ 则此路径代表某元素的绝对路径
bookstore/book 选取boostore的子元素的所有book元素
//book 选取所有的book子元素不管它的位置
bookstore//book 选取属于boostore元素的后代的所有book元素 不管它的位置
//@lang 选取名为lang的所有属性
谓语:查找某个特定的节点或者包含某个指定的值的节点,被嵌入方括号中
路径表达式
/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格式
通配符
* 匹配任何元素节点
@* 匹配任何属性节点
node() 匹配任何类型的节点
路径表达式
/bookstore/* 选取bookstore元素的所有子元素
//* 选取文档中所有元素
//tile[@*] 选取所有带有属性title元素
2.4 XPath的运算符
运算符 描述 实例 返回值
| 计算两个节点集 //book|//cd 拥有book和cd的节点集
+
-
*
div
=
!=
<
<=
>
>=
or
and
mod
所有的XPath的原发内容,都是运用在Python抓取时候要先转换为xml格式
lxml是HTML/XML的解析器,主要功能是如何解析和提取HTML/XML数据
BeautifulSoup4
定义:bs4也是HTML/XML解析器,主要功能也是如何解析HTML/XML数据
lxml:只会局部遍历,而bs4是基础HTML DOM的整个文档遍历,解析整个DOM树,bs4内存会大很多
bs4:用来解析HTML比较简单,API非常人性化,支持CSS选择器、Python标准库中HTML解析器,也支持lxml的XML解析器
注意:bs4需要将html文件转换成HTML DOM文档 让lxml解析器去处理
解析工具 速度 使用难度 安装难度
正则 最快 困难 无(内置)
BeautifulSoup 慢 最简单 简单
lxml 块 简单 一般
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.1 直接子节点 .contents.children属性
.content:将TAG子节点以列表的方式返回
.children:将TAG子节点以迭代器的方式返回
3.2 子孙节点 .descendants属性
.descendants:TAG子孙节点进行递归循环与children相似
3.3 节点内容 .string属性
.string:如果标签里面没有子标签,.string返回标签里面的内容。如果标签里面有《一个子标签》,那么.string返回最里面的内容
注意:一个子标签有效 多个子标签无效
4.1 find_all(name,attrs,recursive,text,kwargs)
name参数:
a)过滤器字符串,查找与字符串匹配的内容 查找文档中所有的标签
b)正则表达式 bs4会通过正则表达式match()匹配内容 匹配查找字符串头部 起始位置匹配一次
c)列表参数 将于列表中任一元素匹配的内容返回
keyword参数:
以(id="*")形式进行查找 如果没有id则无法查找
text参数:
可以搜索文档中的字符串内容,与name参数的可选值一样,text参数接受该字符串
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选择器
搜索文档树
文档树
对象种类
数据的提取 JSON与JsonPATH
JSON(JavaScript Object Notation) 是一种轻量级数据交换格式,容易阅读以及编写
方便机器进行解析和生成,数据的交互场景,前台和后台的数据交互
JSON:JavaScript中的对象和数组
1.对象: {}括起来的内容 {key:value,key:value…}键值对结构
2.数组: []括起来的内容 [‘Python’,‘Javascript’,‘C’]
功能模块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类型
JsonPath信息抽取类库,从JSON文档中抽取指定信息的工具,提供多种语言版本
JsonPath与XPath语法类似 ,JSON结构清晰,可读性高,复杂度低,容易匹配
XPath JSONPath 描述
/ $ 根节点
. @ 当前节点
/ . or [] 取子节点
… n/a 取父 节点 JsonPath不支持
// … 不管什么位置,选择符合条件的节点
* * 匹配所有元素节点 通配符
@ n/a 根据属性访问,Json不支持 KEY-VALUE 不需要
[] [] 迭代器表示(可以做简单的迭代 数组下标 内容选值等)
| [,] 支持迭代器多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组 ,JSONPATH不支持
Json格式字符串解码转换成Python对象 Json字符串解码格式
MySQL(不要钱)=>Oracle甲骨文(收费)
4.1 操作流程
开始=>创建Connection=>获取Cursor游标=>执行查询、命令、获取数据、处理数据
==>关闭cursor=>关闭Connection=>结束
4.2 查看驱动模块是否下载 PyMySql
4.3 下载Navicat 新建文本文档是注册码
名字和组织名随便乱填
数据库名:AHSF
编码格式:UTF-8
所有保存表格后 长度为0 重新设置 Interger
mysql 尽量不要太高(python 对应的mysql驱动模块)
电影管理系统(后台)
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
=========================
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’