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

这篇具有很好参考价值的文章主要介绍了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 Thread

def 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,ProcessPoolExecutor

def 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 asyncio

async  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文件文章来源地址https://www.toymoban.com/news/detail-577134.html

到了这里,关于python正则+多线程(代理)+线程池+协程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Python系列] 线程、协程、进程和分布式

            我们在写脚本的时候,经常是单线程跑完了全部,毕竟自顶向下按照我们约定的方法运行下去是最规范的。但是很多时候,比如说合法地爬取一些网页信息,图片和资料啊,或者说一些合法的网络请求,读写文件之类的。如果还是单线程地one by one,那么将会影响我们

    2024年02月16日
    浏览(25)
  • 【Python爬虫与数据分析】进程、线程、协程

    目录 一、概述 二、进程的创建 三、线程的创建 四、协程的创建 五、全局变量的共享问题 六、消息队列与互斥锁 七、池化技术 进程是系统分配资源的基本单位,线程是CPU调度的基本单位。 一个进程可包含多个线程,一个线程可包含多个协程,协程就是最小的任务执行单位

    2024年02月13日
    浏览(31)
  • Python渗透测试编程基础——线程、进程与协程

    目录  一、进程与线程的概念 1.进程 2.线程 3.进程和线程的关系 4.任务执行方式 二、Python中的Threading模块 1.线程模块介绍 2.Threading介绍 (1)方法和属性 (2)类方法 三、线程简单编写 1.流程 2.创建线程 (1)方法一 (2)方法二 3.例子 四、守护线程 五、线程同步技术 1.线程

    2024年02月01日
    浏览(40)
  • [python] 协程学习从0到1,配合案例,彻底理解协程,耗费资源不增加,效果接近多线程

    多进程和多线程在实际编程中用的已经非常多了,这篇文章的作用是记录下学习协程的心得体会,争取一篇文章搞定. 协程的好处不多说了,可以说是I/O密集型的利器.其实对于IO密集型任务我们还有一种选择就是协程。协程,又称微线程,英文名Coroutine,是运行在单线程中的“并

    2024年02月02日
    浏览(37)
  • Python 华为面试手撕代码 + 八股文,机器学习参数调节,损失函数,激活函数,线程、进程和协程

    一、手撕代码:力扣原题905 二、八股文部分:有点紧张,忘了好多东西 1.深度学习模型优化的方法有哪些? 深度学习模型的优化策略包括以下几个方面: (1)选择合适的激活函数:激活函数对模型的表达能力和收敛速度有很大影响,常用的激活函数包括ReLU、Sigmoid、Tanh等。

    2024年02月09日
    浏览(32)
  • Python爬虫|基础知识点详细汇总(requests、urllib、re、bs4、xpath、PyQuery、jsonpath、多线程、协程、数据保存、selenium)

    1. 请求数据 ① requests (1) 基本使用 参数 对响应内容的操作 (2) Requests进阶:使用Session 为什么要用 Session? Session代表服务器与浏览器的一次会话过程,Session对象存储了特定用户会话所需的信息 例如:一定时间内记录账号密码 (自动登录) 可以加快 requests请求速度 需要客户端登录的

    2023年04月08日
    浏览(38)
  • 探索Python编程的技巧:多线程魔法、网络舞台、正则魔法阵与递归迷宫

    进程: 就是一个程序,运行在系统之上,称这个程序为一个运行进程,并分配进程ID方便系统管理。 线程:线程是归属于进程的, 一个进程可以开启多个线程,执行不同的工作,是进程的实际工作最小单位。 操作系统中可以运行多个进程,即多任务运行 一个进程内可以运行

    2024年02月12日
    浏览(37)
  • 什么是进程、线程、协程

    我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。 进程是一个具有一定独立功能的程序在一个数据集上

    2024年02月13日
    浏览(26)
  • 线程 进程 协程 区别

    在并发编程中,\\\"线程\\\"和\\\"协程\\\"都是用于实现并发执行的概念,但它们有一些重要的区别。 线程(Thread): 线程是操作系统的概念,是操作系统调度的最小执行单位,是进程中的一个实体,表示程序执行的基本单元。 线程由操作系统内核调度和管理,它拥有自己的执行上下文

    2024年02月04日
    浏览(54)
  • 进程,线程,协程

    1、进程 进程是具有一定独立功能的程序关于某个​​数据集​​合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包