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