python正则+多线程(代理)+线程池+协程

正则表达式

常用元字符

. 匹配除换行符以外的任意字符

\w 匹配字幕或数字或下划线

\s 匹配任意空白字符

\d 匹配数字

\n 匹配一个换行符

\t 匹配一个制表符

^	匹配字符串的开始 # 开发常用
$	匹配字符串的结尾

\W 匹配非字母或数字或下划线

\D 匹配非数字

\S 匹配非空白符

a|b 匹配字符a或b

() 匹配括号内的表达式,也表示一个组

[…] 匹配字符组中的字符

[^…] 匹配除字符组中字符的所有字符,**[ ]中的^**表示“非”

量词

* 	 重复0次或更多次
+ 	 重复1次或更多次
? 	 重复0次或1{n}	 重复n次
{n,} 重复n次或更多次
{n,m}重复n到m次

贪婪匹配,爬虫常用

.*	 贪婪匹配
.*?	 惰性匹配,尽可能间隔少的匹配

python-re

import re
# findall:匹配字符串中所有正则内容
lst = re.findall(r"\d+", "我的电话是10086,我孩子的电话是10010")
print(lst)
['10086', '10010']
# finditer:匹配字符串中所有的内容【返回是迭代器】,从迭代器中拿到内容需要.group()
# 最常用,效率高
it = re.finditer(r"\d+", "我的电话是10086,我孩子的电话是10010")
for i in it:print(i.group())10086
10010
# search:返回的是match对象,拿数据需要.group()
# 找到一个结果就返回,不找了
# 常用
s = re.search(r"\d+", "我的电话是10086,我孩子的电话是10010")
print(s.group())10086
# match:从头匹配,拿数据需要.group()
s = re.match(r"\d+", "10000我的电话是10086,我孩子的电话是10010")
print(s.group())10000
# 预加载正则,后面没有r''
obj = re.compile(r"\d+")
ret = obj.finditer("我的电话是10086,我孩子的电话是10010")
for j in ret:print(j.group())
# 可以反复用
bhq = obj.findall("疑是银河落九天,为啥不还10000000")
print(bhq)10086
10010
['10000000']
s = """
<div class='red'><span id='1'>西游记</span></div>
<div class='green'><span id='2'>三国演义</span></div>
<div class='blue'><span id='3'>水浒</span></div>
<div class='yellow'><span id='4'>红楼666</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='\d+'>.*?</span></div>", re.S)
obj2 = re.compile(r"<div class='.*?'><span id='\d+'>(?P<wahaha>.*?)</span></div>", re.S)# re.S  让.能匹配换行符
# (?P<分组名字>正则)  可以从正则匹配的内容中提取一部分
result = obj2.finditer(s)
for it in result:print(it.group("wahaha"))

代理

# 设置代理
proxies = {"https": "https://210.60.8.83:3129"
}
# 添加代理
resp = requests.get("https://www.baidu.com", proxies =proxies)
resp.encoding = 'utf-8'
print(resp.text)

多线程

进程 - 资源单位

线程 - 执行单位

每个进程里至少一个线程,启动一个程序,默认都有一个主线程

方法一:

from threading import Threaddef func():for i in range(1000):print("func", i)if __name__ == '__main__':t = Thread(target=func)  # 目标线程t.start()  # 多线程状态为开始工作状态,具体执行时间由cpu决定for i in range(1000):print("main", i)# 传参
def func(name):for i in range(1000):print(name, i)
if __name__ == '__main__':t = Thread(target=func, args=("周杰伦",))  # 目标线程,,args参数必须是 元组 传参t.start()  # 多线程状态为开始工作状态,具体执行时间由cpu决定for i in range(1000):print("main", i)

方法二:

# 传参时,定义构造函数,def __init__(self):
class myThread(Thread):def run(self):for i in range(1000): # 固定的 - > 当线程被执行的时候,被执行的就是run()print("子线程", i)if __name__ == '__main__':t = myThread()# t.run() # 此为方法的调用 - >仍然单线程进行t.start()  # 开启线程for i in range(1000):print("主线程", i)
# 多进程使用,创建多进程资源远远大于多线程
# 写法跟线程一模一样,降低开发者记忆成本,资源使用完全不一样from multiprocessing import Process 
def func():for i in range(1000):print("func", i)if __name__ == '__main__':p = Process(target=func)  # 目标线程p.start()  # 多线程状态为开始工作状态,具体执行时间由cpu决定for i in range(1000):print("main", i)

线程池

一般思路,先写单个实现,然后放到线程池

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutordef func(name):for i in range(1000):print(name, i)if __name__ == '__main__':# 创建线程池with ThreadPoolExecutor(50) as t:for i in range(100):# t.submit(func, name=f"线程-{i}")t.submit(func, name="changjiang")# 等待线程池中的任务全部执行完毕,才能继续执行(守护)print(123)

协程

当程序处于IO操作时,线程都会处于阻塞状态,cpu不为我工作

例如:input(),sleep() ,request.get(),等等

协程:当程序预见IO操作时,可以选择切换到其他任务上,为我工作!把cpu绑在我的程序上

在微观上,是一个任务一个任务的进行切换,切换条件一般就是IO操作

在宏观上,我们能看到其实是多个任务一起执行,多任务异步操作

# @desc : 写爬虫的模板,协程应用,效率极高,相当于单线程import asyncioasync  def download(url):print("准备开始下载")await asyncio.sleep(2)  # 网络请求; # requests.get() 是不行的print("下载完成")async def main():urls = ["http://www.baidu/com","http://www.bilibili.com","http://www.163.com"]tasks = []for url in urls:# d = download(url) # python3.11之后会被干掉d = asyncio.create_task(download(url))  # python3.8之后的写法tasks.append(d)await asyncio.wait(tasks)if __name__ == '__main__':asyncio.run(main())

爬虫视频处理

一般的视频网站怎么做的?

用户上传 -> 转码(把视频做成,2k,1080,标清) -> 切片处理(把单个的文件进行拆分) 60

用户在进行拉动进度条时候,处理方式

==================

需要一个文件记录:1.视频播放顺序。2.视频存放的路径。

M3U8 txt json =>文本

想要抓取一个视频:

  1. 找到m3u8(各种手段)

  2. 通过m3u8下载到ts文件

  3. 可以通过各种手段(不限于编程手段)把ts文件合并成一个mp4文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/2205.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Express.js】全局变量与配置文件

全局变量与配置文件 通常我们会将一些项目的配置信息写在一个文件内&#xff0c;然后读入内存并使用。在 express 中使用全局变量有多种方案&#xff0c;我们一起看看有哪些常用的方案 准备工作 拷贝第一节的HelloWorld项目 准备一个Resp.js模块&#xff1a; module.expor…

Mongodb 对嵌套文档数组进行查询操作

查询非嵌套文档数组 非嵌套文档的数组&#xff0c;数组由数字、字符串等元素组成。 以下方法对数组字段进行查询操作的示例&#xff0c;包括对数组匹配查询&#xff0c;元素的增、删、改操作&#xff0c;空数组、非空数组查询等。 测试数据 连接到 mongodb 数据库&#xff0…

Bean 作用域与生命周期

Bean 作用域与生命周期 ​ 对于 Spring 来说&#xff0c;核心操作对象就是存和取 Bean &#xff0c;接下来就 Bean 的作用域与生命周期进行探讨。 文章目录 Bean 作用域与生命周期一、作用域的定义1.1、Bean 的6种作用域1.2、Bean作用域设置方法 二、Bean 的生命周期2.1、Bean…

postgresql还原bak

1、第一步肯定是要新建自己还原的目标数据库&#xff0c;例如&#xff1a; 2、进入postgresql的安装目录下的bin目录下 然后地址栏输入cmd进入命令 输入以下 psql -h localhost -U postgres -p 5432 -d SamsinoYardStandard_karamay -f "D:\desktop\zk\20230628.bak&quo…

verilog实现数码管静态显示

文章目录 verilog实现数码管静态显示一、任务要求二、实验代码三、仿真代码四、仿真结果五、总结 verilog实现数码管静态显示 一、任务要求 六个数码管同时间隔0.5s显示0-f。要求&#xff1a;使用一个顶层模块&#xff0c;调用计时器模块和数码管静态显示模块。 二、实验代码…

将Spring Boot项目打包部署到阿里云linux服务器

首先 你要保证自己的服务器上有java环境 如果没有可以参考我的文章 linux服务器中安装java JDK1.8版本 然后 我们打开我们的Spring Boot项目 双击 package 生命周期进行打包 打包完成之后 我们找到 target 下面会有一个jar包 然后 我们右键它 如下图操作 系统就会帮你打开它所…

OpenCV for Python 学习第四天 :通道的获取与合并

上一篇博客&#xff0c;我们学习了如何通过更快的item()和itemset()的方法访问图片&#xff0c;以及了解了图像的兴趣位置的获取方法&#xff0c;那么今天&#xff0c;我们将学习通道的处理方法&#xff0c;通过通道的拆分和合并的实例&#xff0c;让大家更好的了解咱们有关于B…

STM32知识合集

目录 STM&#xff1a; GPIO&#xff1a; 串口通信协议&#xff1a; 1.USART&#xff1a; 2.I2C&#xff1a; 3.Modbus 4.RS232 5.RS485&#xff1a; SPI通信协议 万用表使用&#xff1a; 中断系统&#xff1a; NVIC&#xff1a; EXTI &#xff1a; 时钟系统&…

前端笔记_OAuth规则机制下实现个人站点接入qq三方登录

文章目录 ⭐前言⭐qq三方登录流程&#x1f496;qq互联中心创建网页应用&#x1f496;配置回调地址redirect_uri&#x1f496;流程分析 ⭐思路分解⭐技术选型实现&#x1f496;技术选型&#xff1a;&#x1f496;实现 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本…

JMeter做http接口功能测试

1. 普通的以key-value传参的get请求 e.g. 获取用户信息 添加http请求&#xff1b;填写服务器域名或IP&#xff1b;方法选GET&#xff1b;填写路径&#xff1b;添加参数&#xff1b;运行并查看结果。 2. 以Json串传参的post请求 e.g. 获取用户余额 添加http请求&#xff1b;…

设计模式-原型模式

目录 一、传统方式 二、原型模式 三、浅拷贝和深拷贝 克隆羊问题&#xff1a; 现在有一只羊tom&#xff0c;姓名为: tom,年龄为: 1&#xff0c;颜色为: 白色&#xff0c;请编写程序创建和tom羊属性完全相同的10只羊。 一、传统方式 public class Client {public static vo…

WMTS 地图切片Web服务 协议数据解析

1. WMTS 描述 WMTS(Web Map Tiles Service):地图切片Web服务。 2. 数据示例&#xff1a; arcgis online 导出的wmts xml&#xff1a; https://sampleserver6.arcgisonline.com/arcgis/rest/services/WorldTimeZones/MapServer/WMTS 内容解析&#xff1a; contents中可能包…

linux原生安装mongodb

1.下载tgz文件,解压缩并将文件夹重命名为mongodb wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.5.tgz 2.新建存储目录 #数据存储目录 mkdir -p /mongodb/single/data/db #日志存储目录 mkdir -p /mongodb/single/log 3.编辑配置文件(默认进去先…

J2EEJSP自定义标签库01out标签if标签

目录 一.什么是标签 二.JSP自定义标签库 2.1 JSP标签库是什么 2.2 处理流程 2.3 如何自定义标签 2.4 标签类型 三.开发示例 3.1 out标签 1.创建助手类 2.编写tld&#xff08;标签库的描述&#xff09;文件&#xff0c;&#xff08;必须放在WEB-INF目录或其目录下&a…

Jenkins升级指南 LTS2.361.1

近期要在Jenkins中新增jacoco&#xff0c;对老旧Jenkins进行升级&#xff0c;碰到的一些问题汇总。 jenkins配置说明 主目录&#xff0c;可在Configure System中查看&#xff0c;一般在&#xff1a;/var/lib/jenkinswar包目录&#xff0c;可在linux启动程序充查看&#xff0c…

XML简介及操作

目录 1.XML简介 2.XML解析-DOM4J 1.XML简介 XML&#xff08;EXtensible Markup Language&#xff09;,可扩展标记语言特点&#xff1a; XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换作用&#xff1a; 数据交换配置应用程序和网站Ajax基石 HTML 与 XML …

python爬虫-获取headers(报文头)关键参数实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;请求页面&#xff0c;得到响应。建议首次请求时headers内容都带着&#xff0c;调试…

react报错信息

报错信息 render函数里dom不能直接展示obj对象 取变量记得要有{} https://segmentfault.com/q/1010000009619339 这样在写的时候就已经执行方法了&#xff0c;所以此处用箭头函数&#xff08;&#xff09;》{}才会在点击时执行或者 遍历数据使用map来遍历&#xff0c;使用forea…

Docker【安装与基本使用】

【1】Docker的安装 注意&#xff1a;如果之前安装过docker其他版本&#xff0c;请删除干净。 docker-01 10.0.0.51 2G docker-02 10.0.0.52 2G docker-01 [rootdocker-01 ~]# cp -rp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime cp: overwrite ‘/etc/localtime’? …

如何查询企业诉讼信息?

如何免费查询企业诉讼信息&#xff1f; 企业的司法诉讼信息可以通过中国裁判文书网、中国执行信息公开网、中国庭审公告网去查询。 在这些网站上你可以通过输入企业名称或者注册号来查找相关的法律信息。大多数的法律诉讼信息都会在这些网站上公开&#xff0c;也会有一些特殊…