python续
2023-03-20 18:24:28 0 举报
AI智能生成
python学习
作者其他创作
大纲/内容
正则表达式
定义
正则表达式,又称规则表达式。(Regular Dxpression,简写为re),是一种文本模式,包括普通字符(例:a到z的字母)和特殊字符(元字符),是计算机科学的一个概念
特点
正则表达式是一种特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配
正则表达式使用单个字符串描述、匹配一系列匹配某个语法规则的字符串
正则表达式是繁琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感
许多程序设计语言都支持利用正则表达式进行字符串操作
所有的数据解析都是用于 字符串 的
re模块的常用方法
r
前面的一个r表示字符串为非转义的原始字符串
match 方法
定义
从头开始尝试匹配字符串数据(注意:若开头就是不匹配直接返回None值,只匹配一次),我们可以使用group(num)或groups()匹配对象函数来获取匹配表达式
函数语法
import re
r.match(pattern, string, flags)
r.match(pattern, string, flags)
group()
可以将数据拿出来
pattern
匹配的正则表达式
string
要匹配的字符串
flags
标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
search 方法
定义
re.search 扫描整个字符串并返回第一个成功的匹配
函数语法
re.search(pattern,string,flags=0)
group()
可以将数据拿出来
span()
将数据的索引取值
匹配成功search方法返回一个匹配的对象,否则返回None
findall 方法
定义
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,若有多个匹配模式,则返回元祖列表,若没有找到匹配的,则返回空列表
函数语法
re.finall(pattern,string,flags=0)
注意:
match和search是匹配一次 findall 匹配所有
compile 方法
定义
compile函数用于编译正则表达式,生成一个正则表达式(pattern)对象,供match()和search()这两个函数使用
函数语法
re.compile(pattern,flags)
作用
实现更高效的匹配
split 方法
拆分字符串,和字符串当中的.split()作用一致,可以指定分割次数
函数语法
rel = re.split(r“分隔符”,maxsplit=1)
maxsplit
分割次数
sub 方法
定义
sub 方法类似字符串的replace()方法,用于指定内容替换匹配到字符,可以指定替换次数
函数语法
re.sub(r‘匹配内容’,‘替换内容’,字符串,count=0)
count
替换次数
正则字符
修饰符
re.l
使匹配对大小写不敏感
re.L
做本地识别化匹配
re.M
多行匹配,影响^和$
re.S
使.匹配,包括换行在内的所有字符
re.U
根据unicode字符集解析字符,这个标志会影响\w,\W\b,\B
re.A
ASCII字符模式
元字符
.
小数点可以匹配除了换行符\n以外的任意字符,只能匹配一个
|
逻辑操作符 - -或者的意思
[abc]
匹配字符集所包含的任意一个字符
注意:加了中括号会将每一个字符进行分割
[^abc]
匹配未包含的任意字符
[a - z]
字符范围。匹配指定范围内的任意字符
\
将紧跟后面的字符进行转义
()
对表达式进行分组,将圆括号的内容当做一个整体,并获得匹配的值
转义字符
\n
匹配一个换行符
\r
匹配一个回车符
\t
匹配一个制表符
\\
匹配一个斜杠
\^
匹配^符号
\$
匹配$符号
\.
匹配小数点
预定义匹配字符集
\d
匹配一个数字字符。等价于[0-9]
\w
匹配字母、数字、下划线。等价于‘[A-Za-z0-9_]’
\s
匹配空格字符
\D
匹配一个非数字字符。等价于[^0-9]
\W
匹配非字母、数字、下划线。等价于‘[^A-Za-z0-9_]’
\S
匹配任意非空白字符。等价于[^\f\n\r\t\v]
大写表示取反意思
重复匹配
*
匹配前面的子表达式零次或多次, 等价于{0,}
+
匹配前面的子表达式一次或多次, 等价于{1,}
?
匹配前面的子表达式零次或一次, 等价于{0,1}
{n}
n 是一个非负整数。匹配确定的 n 次
{n,}
n 是一个非负整数。至少匹配 n 次
{n,m}
m 和 n 均为非负整数。其中 n <= m 。最少匹配 n 次且最多匹配 m 次
注意:n 与 m 之间只有逗号,不能有空格
匹配电话号码,例子
位置匹配
^
匹配输入字符串的开始位置
$
匹配输入字符串的结束位置
贪婪与非贪婪
贪婪
在重复匹配时,尽可能多的去匹配,贪婪 .*
非贪婪
在重复匹配时,尽可能少的去匹配,非贪婪 .*?
MySQL基础
定义
MySQL 是一个关系型数据库管理系统,MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据防走丢一个大仓库内,这样就增加了速度并提高了灵活性
安装MySQL
初始化数据库
mysqld --initialize --console
修改密码:
mysoladmin -u用户名 -p旧密码 password新密码
安装数据库
mysqld install
启动服务
net start mysql
数据库的操作
查看数据库
语法:
show databaes;
创建数据库
语法:
create database 库名;
删除数据库
语法:
drop database 库名;
选择数据库
语法:
use 库名;
数据表的操作
创建数据表
创建MySQL数据需要信息
表名
表字段名
定义每一个表字段类型
语法:
create table 表名(
ID int auto_increment,
表字段名 类型,
表字段名 类型,
表字段名 varchar(字节长度)
)default charset=utf8;
ID int auto_increment,
表字段名 类型,
表字段名 类型,
表字段名 varchar(字节长度)
)default charset=utf8;
自增长
auto_increment
字符串
varchar(字节长度)
注意:
MySQL支持三种类型:数值、日期/时间和字符串(字符)类型
删除数据\表
语法:
drop table 表名;
作用:删除表与数据
truncate table 表名;
truncate 只清除表数据,drop不光清除表数据还要删除表结构
delete from 表名 where id = '1';
表示删除id为'1'的数据
delete from 表名;
若不加where条件,则会删除表所有的数据
插入数据
语法
insert into 表名(name1,name2,name3) values (data1,data2,data3);
注意:
若数据是字符型,必须使用单引号或者双引号,如:‘data’
查询数据
语法
select * from 表名;
查看表中的所有数据
select name from 表名;
查看指定数据
desc 表名;
查看表结构
show tables;
查看所有的表
修改表名
语法
rename table 旧表名 to 新表名;
数据库的链接
python与MySQL交互
安装第三方模块 -- pymysql
pip install pymysql
pycharm 链接 MySQL
语法
import pymysql
# 创建连接
db = pymysql.Connect(
host="127.0.0.1",
port=3306,
user="root",
password="密码",
db="库"
)
# 创建游标,传递命令
cursor = db.cursor()
# 创建连接
db = pymysql.Connect(
host="127.0.0.1",
port=3306,
user="root",
password="密码",
db="库"
)
# 创建游标,传递命令
cursor = db.cursor()
创建数据库
create table func(
id int,
name varchar(20),
age int,
sex varchar(20)
)default charset=utf8;
desc func;
id int,
name varchar(20),
age int,
sex varchar(20)
)default charset=utf8;
desc func;
数据库插入操作
MongDB
MongDB操作
数据相关操作
创建数据库
语法
use database_name
注意
如果数据库不存在,则创建数据库,否则切换到指定数据库
use 就是表示选择数据库
当数据库中没有数据,则show dbs显示不了
查看在哪个数据库里
语法
db
删除数据库
语法
db.dropDatabase()
注意
删除数据库之前,先进入数据库,之后执行
是删除当前数据库的
增删改查操作
MongoDB中的一张表被称为一个集合
插入数据
语法
db.集合名.inser({}) # 数据格式为json
db.demo.insert({name:"坤哥"})
注意
集合没有的话就会自动生成集合,有则选择该集合
查看已经存在的集合
show collections
show tables
查询数据
语法
db.集合名.find()
查找所有
db.集合名.find(name:"坤哥")
条件查询
查看下一页
it
设置查看一页数据的条数
DBQuery.shellBatchSize= 数据条数
修改数据
语法
db.集合名.update({键:值},{$set:{原键:新值}})
删除数据
语法
db.集合名.remove({name:"张三"})
删除集合
db.集合名.drop()
注意
不管是那种增删改查,都得先进入到数据库里
MorgoDB与python的交互
创建连接
插入一条数据
语法
insert_one()
插入多条数据
语法
insert_many()
查看数据
查看单条数据
find_one()
查看多条数据
find()
修改数据
修改单条数据
update_one({"键":"值"},{"$set":{"原键":"新值"}}}
修改多条数据
update_many({"键":"值"},{"$set":{"原键":"新值"}})
多线程
定义
程序同时执行多个任务
使用线程可以把占据长时间的程序中任务放到后台去处理
程序的运行速度可能加快
线程实现方法
定义
线程是CPU分配资源的基本单位,当一程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或多个线程。当没有多线程编程时,一个进程相当于一个主线程;当有多线程编程时,一个进程包含多个线程(含主线程)。使用线程可以实现程序大的开发
注意
线程是执行单位,也是最小的资源分配单位
单线程执行程序
多线程执行程序
import threading
t1= threading.Thread(target=demo1)
t2 = threading.Thread(target= demo2)
t1.start()
t2.start()
t1= threading.Thread(target=demo1)
t2 = threading.Thread(target= demo2)
t1.start()
t2.start()
主线程与子线程
传参
args = ()
继承
线程的常用方法
threading.current_thread()
获取当前线程对象
threading.enumerate()
获取当前线程的信息
注意:
程序执行本身会有一个主线程,因此加上主线程与创建的子线程才是程序执行时的线程数量
getName()
获取线程名称
setName(name)
设置线程名称
共享全局变量资源竞争
多个线程同时在完成一个任务的时候发生资源竞争
锁机制
解决多线程访问全局变量的安全性问题
访问全局变量无序加锁,修改时需要加锁,修改后完毕之后要释放锁
加锁步骤
创建加锁对象 threading.Lock()
加锁 acquire()
解锁 release()
多线程和队列
线程安全队列
定义
python内置的线程安全队列模块叫queue
python的Queue模块中提供了同步、线程安全的队列类
FIFO(先进先出)队列Queue
LIFO(后进先出)Lifo Queue
可以使用队列来实现线程间的同步
队列的常用方法
form queue import Queue
模块导入
创建对象
queue = Queue(范围大小)
qsize()
返回队列大小
empty()
判断队列是否为空
full()
判断队列是否为满
get()
从队列中获取先插入的数据
put()
将一个数据放到队列中
随机函数(额外补充)
random.randint
在多线程当中使用
Queue是线程安全的队列,在使用时无须加锁,可以再多线程当中真理使用
队列也是实现线程间同步的方式
生产者与消费者模式
产生数据的模块,就形象地称为生产者:而处理数据的模块,就称为消费者, 以及作为暂时存放数据起缓冲作用的缓冲区
缓冲区
如果制造的速度时块时慢,缓冲区的好处就体现出来了,当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉
队列既是缓冲区
可以在局部修改全局变量,但不局部不能创建全局变量
多进程
认识进程
进程和程序
进程:正在执行的程序
程序:还没有执行的代码,处于静态
进程的状态
使用进程实现多任务
multiprocessing模块就是跨平台的多进程模块提供了有个Process类来代表一个进程对象,这个对象可以理解为一个独立的进程,可以执行另外的事情
进程和线程之间的对比
进程
能够完成多任务,相当于一台电脑可以开多个浏览器(基于操作系统)
线程
能够完成多任务,相当于一个浏览器可以打开多个页面(基于程序)
根本区别
进程是操作系统资源分配的基本单位,而线程,则是任务调度和执行的基本单位
线程是资源分配的最小单位
内存分配
系统为每个进程分配不同的内存空间
而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
进程实用于小型数据,爬大型数据还是得线程
进程之间的通信 -- Queue
进程池
from concurrent.futures import ProcessPoolExecutor
模块导入
selemiun
认识selenium
Seienium是一个用于web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样
支持的浏览器包括IE(7,8,9,10,11),Mozilla Firefox,Safari, Google, Chrome, Opera, Edge等
浏览器驱动
Selenium需要驱动程序与所选浏览器进行交互
Chrome: http://chromedriver.storage.googleapis.com/index.html
Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox: https://github.com/mozilla/geckodriver/releases
Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/
selenium入门
导入模块
from selenium import webdriver
使用谷歌浏览器
driver = webdriver.Chrome()
使用Edge浏览器
driver = webdriver.Edge()
打开百度页面
driver.get(“https://www.baidu.com”)
窗口最大化
driver.maximize_window()
获取页面源代码
driver.page_source
获取所有cookie
driver.get_cookies()
页面元素定位
模块导入
from selenium.webdriver.common.by import By
通过id 值定位
driver.find_element(By.ID, "id值")
输入
send_keys("输入内容")
通过class值定位
driver.find_element(By.CLASS_NAME,"class值").send_keys('输入内容')
通过name值定位
driver.find_element(By.NAME,"name值").send_keys("输入内容")
通过tag_name值定位
driver.find_element(By.TAG_NAME,"tag_name值").send_keys("输入内容")
通过xpath 定位
driver.find_element(By.XPATH,"xpath路径").send_keys("输入内容')
通过css_selector定位
driver.find_element(By.CSS_SELECTOR, "css_selector值").send_keys("输入内容")
点击
click()
关闭页面
close()
quit()
回车
导入模块
from selenium.webdriver.common.keys import Keys
Keys.ENTER
driver.find_element(By.CSS_SELECTOR,“css_selector值”).send_keys(Keys.ENTER)
操作表单元素
输入内容
send_keys("输入内容")
清除输入内容
clear()
鼠标操作
点击但不松开
click_and_hold()
右键点击
context_click()
双击
double_click()
单击
click()
行为链
在用selenium操作页面时,有时要分为很多步骤,那么这个时候可以用鼠标行为链类ActionChains来完成
导入模块
from selenium.webdriver.common.action_chains import ActionChains
建立行为链
actions = ActionChains(driver)
将鼠标移动到指定位置
actions.move_to_element(input_data)
输入
- actions.send_keys_to_element(inpurt_data,"输入的数据")
点击
actions.click(submit)
执行链
actions.perform()
动作链
ActionChains方法列表
单击鼠标左键
click (on_element = None)
点击鼠标左键,不松开
click_and_hold()
单击鼠标右键
context_click()
双击鼠标左键
double_click()
拖拽到某个元素然后松开
drag_and_drop(起始位置, 松开位置)
按下某个键盘上的键
key_down(value, element=None)
松开某个键
key_up(value, element=None)
鼠标移动到某个元素
move_to_element()
执行链中的所有动作
perform()
在某个元素位置松开鼠标左键
release()
发送某个键到当前焦点的元素
send_keys()
发送某个键到指定元素
send_keys_to_element(element, “keys_to_send”)
鼠标移动
鼠标拖拽
单击操作
页面等待
当selenium打开一个页面要进行操作,但是浏览器还是处于加载状态,所以需要等待加载完毕之后在操作
显示等待
显示等待是您定义的代码,用于等待待定条件发生,然后再继续执行代码。这种情况的极端情况是 time.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法来帮助您编写只等待所需的代码,WebDriverWait 与 ExpectedCondition 结合使用时实现此目的的一种方式
模块导入
- from selenium.common import TimeoutException
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_condtions as EC
等待
webDriverWait(driver, 10).until(EC.presence_of_element_located(By.ID, "id值"))
隐式等待
隐式等待告诉WebDriver在尝试查找任何不立即可用的元素(或多个元素)时轮询DOW一段时间,默认设置为0(零)。设置后,将为WebDriver对象的生命周期设置隐式等待
字体加密
认识
某一些网站的文字会进行了加密处理,但其字体的的转换包依然在网站中,因此可以通过获取字体文件,使用fontTools进行获取我们需要的字体,从而达到解密的(翻译的)效果
TTFont入门
模块的导入
from fontTools . ttLib import TTFont
打开文件
font = TTFont('文件名')
保存为xml文件
font . saveXML("取文件名 . xml")
找到glyf标签
glyf = font["glyf"]
读取字体,获取对应的关系
content = font.getBestCmap()
字体替换
scrapy入门与实战
下载第三方模块(换源下载)
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
流程
Scrapy 架构图
https://www.processon.com/view/link/635a41afe0b34d36fd119eda
组件介绍
Scrapy Engine(引擎)
负责Spider、ltemPipline、Downloader、Scheduler中间的通讯,信号、数据传送
Scheduler(调度器)
它负责接受引擎发送过来的Ruquest请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎
Downloader(下载器)
负责下载(引擎)发送的所有requests请求,并将其获取的Responses交给Scrapy Engine(引擎),由引擎交给Spider来处理
spider(爬虫)
他负责处理所有Responses从中分析提取数据,获取item字段需要的数据,并将需要跟进的URL提交给引擎,再次进人Scheduler
item Pipeline(管道)
他负责处理Spider中获取的item,并进行后期处理(详细分析、过滤、存储等)的地方
Downloder Middlewares(下载中间件)
一个可以自定义扩展下载功能的组件
Spider Middlewares (Spider 中间件)
一个可以自定义扩展和操作引擎和Spider中间通信的功能组件
scrapy 入门
scrapy 自带xpath
创建一个scrapy项目
scrapy startproject name # name 为项目名
创建一个spider
dir
查看目录里的文件名
cd ..
回到上级目录
cls
清空cmd
Ctrl + c
强制暂停
scrapy startproject name
# name是自己取的名字
创建项目
cd name
# 进入创建的项目 指定创建位置
注意
只要先cd到项目路径里面才能创建我们的spider爬虫
scrapy genspider spider_name url
# spider_name 为爬虫名,url为要抓取的目标网站
创建爬虫spider
scrapy crawl spider_name
# 执行爬虫
spider
手动创建的spider文件
name
标识spider。它在一个项目中必须是唯一的,即不能为不同的爬行器设置相同的名称
allowed_domains
允许爬取url的域名
start_urls
一个url列表,spider从这些网页开始抓取
parse()
一个方法,当start_urls里面的网页抓取下来之后需要调用这个方法解析网页内容
items
定义抓取的字段名
pipeline
数据存储的位置
settings
项目配置文件
extract()
多个数据
extract_first()
单个数据
实战案例 -- 链家的爬取
lianjia_spider
items
settings
scrapy-redis分布式
- 中间件
中间件的使用
下载中间件(Downloader Middleware)核心方法有3个:
process_request(request, spider)
设置headers, proxy
process_response(request, reponse, spider)
设置response编码等信息
process_exception(request, exception, spider)
异常报错
测试网址
http://httpbin.org/user-agent
显示user-agent的网站
scrapy_redis
定义
scrapy是一个基于redis的scrapy组件,用于快速实现scrapy项目的分布式数据爬取
安装redis
pip install scrapy_redis
执行流程
代码修改
开启redis服务
cd到安装路径,输入 redis-server.exe redis.windows.conf
改写爬虫代码
在spider里面 from scrapy_redis.spiders import RedisSpider
类继承RedisSpider
注释start_urls ,添加redis_key = 键
添加配置信息
1、启用调度将请求存储进redis
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
2、确保所有spider通过redis共享相同的重复过滤
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
可选,不清理redis队列,允许暂停/恢复抓取。允许暂定,redis数据不丢失
SCHEDULER_PERSIST = True
3、指定连接到Redis时要使用的主机和端口
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
启动爬虫
js逆向
md5加密
单向加密(只加密不解密)
模块为
hashlib
创建对象
md5_js = hashlib.md5()
加密
md5_js.update(('加密内容').encode())
js逆向流程(加图)
点击发现程序
点击里面的超文本链接
点击{ }自动换行
ctrl+F 查找data字典中的变化变量名
筛选出能打上断点,且输出新内容能出现暂停的
从中判断出md5加密(md5是单向加密)
打上断点,输入翻译内容,出现调试程序暂停
将对应变量复制
粘贴到控制台,点击回车
判断出其中的规律
js逆向的核心
打不过就加入
"加入"流程
创建一个js代码文件, 将需要的网页加密代码,复制粘贴的js文件里面
1、打上断点
2、将鼠标停放在js函数上, 点击跳转到函数的位置
3、点击运行
4、直到跳转到其他代码,从中可以明白加密代码,后复制加密代码
在py代码里面,进行对js代码的调用
1、读取js文件代码
content = open(‘js文件地址’,‘r’,encoding=‘utf-8’).read()
2、导入模块
execjs
模块下载方法:pip install pyexecjs -i https://pypi.tuna.tsinghua.edu.cn/simple
3、创建对象
data_js = execjs.compile(content)
4、执行函数
sign = data_js.call(‘js函数名’,‘参数’)
可变类型
修改之后,内存地址没有发生变化
字符串、int、浮点数
不可变类型
列表、集合、元组、字典
拉姆达表达式
as
app数据抓取
Fiddler 抓包工具
HTTP代理
Fiddler
app抓包
0 条评论
下一页