BLCL的博客小馆

标签 · Python

首页

关于

归档

Python爬虫

一日一技:方法不对,代码翻倍。Requests如何正确重试?

程序员是一个需要持续学习的群体,如果你发现你现在写的代码跟你5年前的代码没什么区别,说明你掉队了。我们在做Python开发时,经常使用一些第三方库,这些库很多年来持续添加了新功能。但我发现很多同学在使用这些第三方库时,根本不会使用新的功能。他们的代码跟几年前没有任何区别。举个例子,使用Request发起HTTP请求,请求失败时,不管什么原因,原地重试最多3次。很多人主要有下面3种写法来重试。常见的老方法使用第三方库这类同学会使用一些专业做重试的第三方库,例如tenacity。详见我的这篇文章:Tenacity——Exception Retry 从此无比简单手动写装饰器这类同学会使用装饰器,所以一般会手写装饰器从而复用,例如:123456789101112131415def retry(func): ..

更多
loading..
Python

Python读取XML并修改导出

Foreword SES的排除编译文件非常蠢,他不能将这个设置继承给其他配置文件,这就导致如果配置文件很多,每次变动需要把每个配置文件重新设置一次,手动的话很容易设置漏了,所以写个脚本来直接处理这个事情 XML 简单说现在有4个主配置,基于他们每个衍生出来2个配置,也就是一共12个配置,目标是每次只要配置这四个主配置,其他配置就能自动同步他们的排除编译文件的配置。 想了想用批处理或者shell实现,有点麻烦,还是XML,光是分析什么的写起来就很复杂,所以干脆用python写了,CI调用 XML DOM基础 DOM将XML以树状的方式进行构建或者展示,所以每个节点都有子节点或者父节点 <collection shelf="New Arrivals"> <m ovie..

更多
loading..
PythonHoudini

Houdini python 入门

Foreword 很久之前写过一次导出,但是代码找不到了,然后新版本的Houdini很多东西都变了,老代码很多地方不兼容了 新版的Houdini我选了19.5 python3.7,很多东西和以前的python2.7 不同了 Houdini Houdini有三种脚本语言,python,Vex,C++,类似Maya 有MEL、python、C++等 传统的python,由于单线程,很多地方都有瓶颈 C++,效率级别,但是开发起来比较麻烦 而Vex 有点类似C或者C++的语言设计,是直接编译运行的,并且可以并发多线程,所以效率上比python高很多,同时程序写起来也比较简单,算是既要又要的结合体。 当然这里Vex性能这么高,也是有代价的,Vex能干的事情是有限的,python和C++能够使用的A..

更多
loading..
Python装饰器

一日一技:Python装饰器的执行顺序

说到Python装饰器的执行顺序,有很多半吊子张口就来:靠近函数名的装饰器先执行,远离函数名的装饰器后执行。这种说法是不准确的。但是这些半吊子多半还会不服,他们会甩出一段代码给你,来『证明』自己的观点:123456789101112131415161718def decorator_outer(func): print("我是外层装饰器") def wrapper(): func() return wrapperdef decorator_inner(func): print("我是内层装饰器") def wrapper(): func() return wrapper @decorator_outer@decorator_innerdef..

更多
loading..
PythonOpenAI语音转文字

轻声低语,藏在光芒下的语音转文字模型Whisper

ChatGPT的模型gpt-3.5-turbo发布当天,OpenAI还开源了一个语音转文本的模型:Whisper。但由于ChatGPT本身太过于耀眼,很多人都忽略了Whisper的存在。我当时也是这样,我一度以为,Whisper也是一个API,需要发送POST请求到OpenAI的服务器上,然后它传回识别的结果。所以我很长一段时间一直都没有试用过这个模型。直到前几天,我看到有人在少数派上面发了一篇文章,介绍他刚做的语音识别App,并且说这个App基于Whisper,完全不需要联网。我当时还奇怪,不联网你怎么调Whisper的API?于是我终于去认真了解了一下Whisper,发现它是OpenAI开源的语音转文字的模型,并不是API服务。这个模型只需要有Python就能本地离线运行,不需要联网。Whisper的..

更多
loading..
Python爬虫5秒盾

一日一技:【最新】再次突破CloudFlare五秒盾付费版

去年我写了一篇文章:一日一技:如何捅穿Cloud Flare的5秒盾 ,这篇文章使用的第三方库『cloudscraper』可以绕过免费版的五秒盾。但遇到付费版就无能为力了。最近在爬币圈的网站,其中有一个网站叫做:Codebase使用的就是付费版的CloudFlare五秒盾。当我们使用CloudScraper去爬时,报错如下:那么现阶段,付费版的CloudFlare五秒盾,有没有什么办法绕过呢?其实方法非常简单。只需要使用Docker运行一个容器就可以了。启动命令为:123456docker run -d \ --name=flaresolverr \ -p 8191:8191 \ -e LOG_LEVEL=info \ --restart unless-stopped \ ghcr.io/fla..

更多
loading..
PythonFlask

Flask中如何嵌套启动子线程?

如果你在Flask中启动过子线程,然后在子线程中读写过g对象或者尝试从request对象中读取url参数,那么,你肯定对下面这个报错不陌生:RuntimeError: Working outside of request context..例如下面这段Flask代码:123456789101112131415import threadingfrom flask import Flask, requestapp = Flask(__name__)def inner_func(): doc_id = request.args.get('doc_id', '') print(f'用户ID为:{doc_id}')@app.route('/start_thread')def start_thread()..

更多
Python上古代码漫游记

长见识,让大家看看什么是垃圾代码

在以前的文章中,在微信群中,我多次强调,写函数的时候,不要把所有参数放到一个大字典里面作为参数到处传,否则时间久了以后,根本不知道字典里面有哪些数据:1234def parse(data): name = data['name'] age = data['age'] xxx = data['xx']上面这样写,对原作者来说确实简单,但是如果代码还有别人来维护,他就根本不知道这个字典里面有哪些数据。必须要一层一层查找调用链,费时费力。但我是真的万万没想到,还有比上面这种写法更傻X的代码。真的可以称得上是垃圾中的垃圾。我们来看看下面这段代码。现在有一个类A,里面有两千多行代码。还有一个类B,里面有三千多行代码。这两个类里面有一些实例方法,有700多行代码。这些我都忍了。更要命的是,初始化类B..

更多
loading..
Python

一日一技:用一个奇技淫巧把字符串转成特定类型

我们有时候可能会需要把一个字符串转换成对应的类型。例如,把'123'转换为int类型的123;或者把'3.14'转成浮点数3.14。前提条件是不能使用eval或者exec。这是一个非常简单的功能,常规做法直接使用if判断就可以了:123456def convert(data, target_type): if target_type == 'int': return int(data) elif target_type == 'float': return float(data) ...有些同学觉得写if判断麻烦,也可能会用字典来处理:1234567def convert(data, target_type): type_map = { '..

更多
loading..
Python单元测试

一日一技:如何正确为历史遗留代码补充单元测试?

我们知道,在软件工程中,单元测试是保证软件质量的重要手段之一。一个优秀的代码,单元测试的代码量,经常会超过被测试的代码本身。一个理想化的开发团队,可能有三分之二的时间是在写测试,剩下的三分之一时间才是写业务代码。如果你的项目是从一开始就写单元测试,那么你写起来应该轻松又愉快,因为单元测试会促使你的代码自身变成可测试的代码。但如果你接手了一个大项目,里面已经有几十万行代码了,那么给这些代码补单元测试会让你知道什么叫做痛不欲生。你会发现有一些函数,它让你不知道怎么写测试代码。我们来看一个例子:我想测试的是business_code里面,check_data_dup分别返回True或者False的时候,下面代码的逻辑。也就是说,我只关心第18-27行的逻辑。这个时候不关心MySQL和Redis。但是每次测试都要..

更多
12345