转自:https://mp.weixin.qq.com/s/UokHMMWmW_GFEJcpsCuiSg
分享个人经验,保留阅读记录,做时间的朋友
转自:https://mp.weixin.qq.com/s/UokHMMWmW_GFEJcpsCuiSg
1
疫情冲击下,企业破产倒闭,居民降薪裁员生活困难, 早已经不是什么新闻
毕竟封城之下,企业停工停产,破产裁员,居民失业降薪,企业和居民陷入困境,很容易理解
但现在连政府也没钱了
有些地方,甚至连债都还不起了——只能启动财政重整
其实也不难理解,企业没有收入,居民没有收入,政府的税收自然就会减少。为应对疫情冲击,还要给企业和居民减免税费,政府的收入下降得更快。毕竟政府本身不直接创造财富,政府所有的收入都是从企业和居民那收来的各种税费。
6月16日,财政部公布了2022年5月财政收支情况。财政部数据显示,1-5月累计,全国一般公共预算收入86739亿元,扣除留抵退税因素后增长2.9%,按自然口径计算下降10.1%。全国税收收入72459亿元,扣除留抵退税因素后增长1.4%,按自然口径计算下降13.6%
财政部数据显示,从财政收入看,扣除留抵退税因素后,5月份全国一般公共预算收入下降5.7%,降幅与4月份基本相当,按自然口径下降32.5%
不可否认的是,政府的财政收入的确在下降,财政压力已经非常严重
地方政府最大的一个收入来源,土地拍卖收入,也下降得非常厉害
1-5月,国有土地使用权出让收入18613亿元,比上年同期下降28.7%。
土地收入大幅下降,那与土地相关的税费收入也大幅下降,财政部的数据可以看到,土地和房地产相关税收中,契税2341亿元,比上年同期下降28.1%;土地增值税3053亿元,比上年同期下降9.4%
大家来看看今年各地政府卖地收入,一片惨绿,全面下滑
除了深圳之外,各地政府卖地收入全部下滑,其中天津下降达91.29%,武汉下降88.52%,帝都北京都下滑了56.75%
这两年,税收下滑,加上卖地收入下滑,各地政府,也没钱了
政府财政,关系到政府运行、政策实施、民生保障,其重要性不言而喻
2
没钱了,怎么办
不管是企业,个人,还是政府,没钱了,只有两个办法:开源和节流
开源,就是增加税收,但在目前这种情况下,增加税收就别想了,企业和居民都等着救济呢
那剩下的办法只能是节流了
各地方政府要过紧日子了
有些地方事业编,公务员的年终奖已经降了,有些还没降
在财政收入下降的大背景下,削减公务员福利已经是“势在必行”,哪怕现在没降的,将来也肯定会降。因为没有别的办法,困难情况下只能同舟共济,一起渡过难关
刚刚,随手百度了一下公务员降薪,有1760万条信息
如果削减福利,还不能解决问题,那么下一步,可能就要精兵简政了
不知道那些疯狂考编,疯狂考公的人,等上岸后,发现自己每月所得,还不够考试的费用时,该做如何感想
还有那些体制内的,真精简到自己头上时,可有什么后手
在时代的冲击下,在疫情冲击下,没有什么是一定保险的,哪怕是体制内
所以才有千万人考公,也有人主动逃出体制
财政没钱,不仅仅影响体制内人员工资奖金,还影响大家的医保
本来医保就缺钱,疫情下有一部分还被拿来做核酸,医保就更缺钱了。医保缺钱,下一轮集采将更加猛烈,对医保资金的核查必将更加严格。接下来,肯定会严查医保套保,肯定会抓一批人。
据国家医保局官网消息,5月31日,国家医保局、财政部、国家卫生健康委、国家中医药局四部委发布《关于开展2022年度医疗保障基金飞行检查工作的通知医保函〔2022〕24号》(下称《通知》),开启2022年度医保基金飞行检查。
财政缺钱,还影响到基建投资,谁都知道基建投资可以拉动经济,但现在财政缺钱,必将影响到基建投资,也就影响到经济发展
财政缺钱,必将找各种办法回补,那些以前偷税漏税的,要小心了,平时政府睁一只眼闭一只眼,现在估计也要找回来了,这两年各地严查偷税漏税的新闻,不少吧。
财政缺钱,肯定想办法多卖点地,所以大家看到,这段时间,关于楼市的政策层出不穷,从地方到中央,从中央到央行,都在想尽一切办法刺激楼市,刺激房地产,想着拉动经济,想着多卖点地。所以刺激楼市的政策不会停止。
可以说,财政缺钱的一系列连锁反应刚刚开始,不管是对体制内人员,还是对普通老百姓,不管是对中国经济,还是对居民的收入,都会带来深刻的影响
3
短期内,财政紧张的局面不会得到根本的改变
1、经济下行压力很大,短期内仍未看到经济好转的迹象。经济没有变好,税收就上不来,税收上不来,财政紧张的日子难以结束
2、中小企业仍然需要救助,税费减免措施还得实行,经济落后地区的转移支付压力仍在
3、收入在下降,但很多刚性支出无法避免。比如核酸检测费用,抗疫物资费用,教师公务员基本工资等等
4、当前楼市持续低迷,居民收入下降,对房地产的预期仍保持悲观,房地产企业没有拿地的意愿,各地方政府的卖地收入仍然保持负增长态势
疫情当下,经济困难重重,不只是企业在负重前行,不仅是居民收入下降,现在政府的财政收入也在下降。企业、居民、政府都在过紧日子,而且在短期内仍然看不到改善的希望
有些地方政府,已经无力清偿到期债务了,甚至到了“准破产”状态,类似于企业的暴雷
通告说白了,就是长期入不敷出,可能还不了债了
如果企业还不了债,大不了破产倒闭,但政府总是要运行吧,肯定不能破产倒闭,那就整个好听的名词吧——财政重整
但与企业破产不一样的是,地方政府财政重整后,债务可能由上级政府偿还,子债父偿
就如上图通告中所说的:相关本息或由省政府代偿
或由的意思是可能,可能还,也可能不还,可能由省政府还,可能用其他方式还
说白了,就是政府进入准“破产状态”
看到了吧,在疫情冲击下,不仅仅企业和居民破产裁员,降薪失业,连政府也没钱了
甚至有些地方政府也进入财政重整状态,进入“准破产”
大家且行且珍惜吧,现在唯一希望是疫情早点过去,经济可以早点重启。
疫情什么时候过去咱们不知道,经济什么时候能好转也不太清楚
那咱就做自己能做的吧
疫情什么时候结束、经济危机什么时候过去,这些咱都管不了。咱们做自己能做的吧:锻炼身体,学习知识,关心家人
好好锻炼身体,健健康康的,不但对自己好,对自己家人好,也为国家医保做了贡献,为国家财政做了贡献
祝大家健康
转自:https://mp.weixin.qq.com/s/0ZC9bN_4kUYw8ef70-hU2Q
从网站中抓取数据是开发者的一个典型“用例”。无论它是属于副业项目,还是你正在成立一个初创公司,抓取数据似乎都很有必要。
举个例子,倘若您想要创建一个比价网站,那么您会需要从各种电商网站上抓取价格信息;或者您想要构建一个可以识别商品并在亚马逊上自动查找价格的“人工智能”。类似的场景还有很多。
但是您有没有注意到,获取所有页面信息的速度有多慢呢?您会选择一个接一个地去抓取商品吗?应该会有更好的解决方案吧?答案是肯定的。
抓取网页可能非常耗时,因为您必须花时间等待服务器响应,抑或是速率受限。这就是为什么我们要向您展示如何通过在 Python 中使用并发来加速您的网页数据抓取项目。
为了使代码正常运行,您需要安装 python 3[1]。部分系统可能已经预装了它。然后您还需要使用 pip install
安装所有必要的库。
pip install requests beautifulsoup4 aiohttp numpy
如果您了解并发背后的基础知识,可以跳过理论部分直接进入实际操作环节。
并发是一个术语,用于描述同时运行多个计算任务的能力。
当您按顺序向网站发出请求时,您可以选择一次发出一个请求并等待结果返回,然后再发出下一个请求。
不过,您也可以同时发送多个请求,并在它们返回时处理对应的结果,这种方式的速度提升效果是非常显著的。与顺序请求相比,并发请求无论是否并行运行(多个 CPU),都会比前者快得多 — 稍后会详细介绍。
要理解并发的优势。我们需要了解顺序处理和并发处理任务之间的区别。假设我们有五个任务,每个任务需要 10 秒才能完成。当按顺序处理它们时,完成五个任务所需的时间为 50 秒;而并发处理时,仅需要 10 秒即可完成。
除了提高处理速度之外,并发还允许我们通过将网页抓取任务负载分布于多个进程中,来实现在更短的时间内完成更多的工作。
这里有几种实现并行化请求的方式:例如 multiprocessing
和 asyncio
。从网页抓取的角度来看,我们可以使用这些库来并行处理对不同网站或同一网站不同页面的请求。在本文中,我们将重点关注 asyncio
,这是一个 Python 内置的模块,它提供了使用协程编写单线程并发代码的基础设施。
由于并发意味着更复杂的系统和代码,因此在使用前请考虑在您的使用场景中是否利大于弊。
在做出选择之前,我们有必要了解一下 asyncio
和 multiprocessing
之间的区别,以及 IO 密集型与 CPU 密集型之间的区别。
asyncio[2] “是一个使用 async/await 语法编写并发代码的库”,它在单个处理器上运行。
multiprocessing[3] “是一个支持使用 API 生产进程的包 […] 允许程序员充分利用给定机器上的多个处理器”。每个进程将在不同的 CPU 中启动自己的 Python 解释器。
IO 密集型意味着程序将受 I/O 影响而变得运行缓慢。在我们的案例中,主要指的是网络请求。
CPU 密集型意味着程序会由于 CPU 计算压力导致运行缓慢 — 例如数学计算。
为什么这会影响我们选择用于并发的库?因为并发成本的很大一部分是创建和维护线程/进程。对于 CPU 密集型问题,在不同的 CPU 中拥有多个进程将会提升效率。但对于 I/O 密集型的场景,情况可能并非如此。
由于网页数据抓取主要受 I/O 限制,因此我们选择了 asyncio
。但如果有疑问(或只是为了好玩),您可以使用 multiprocessing
尝试这个场景并比较一下结果。
我们将从抓取 scrapeme.live
作为示例开始,这是一个专门用于测试的电子商务网站。
首先,我们将从顺序抓取的版本开始。以下几个片段是所有案例的一部分,因此它们将保持不变。
通过访问目标主页,我们发现它有 48 个子页面。由于是测试环境,这些子页面不会很快发生变化,我们会使用到以下两个常量:
base_url = "https://scrapeme.live/shop/page"
pages = range(1, 49) # max page (48) + 1
现在,从目标产品中提取基础数据。为此,我们使用 requests.get
获取 HTML 内容,然后使用 BeautifulSoup
解析它。我们将遍历每个产品并从中获取一些基本信息。所有选择器都来自对内容的手动审查(使用 DevTools),但为简洁起见,我们不会在这里详细介绍。
import requests
from bs4 import BeautifulSoup
def extract_details(page):
# concatenate page number to base URL
response = requests.get(f"{base_url}/{page}/")
soup = BeautifulSoup(response.text, "html.parser")
pokemon_list = []
for pokemon in soup.select(".product"): # loop each product
pokemon_list.append({
"id": pokemon.find(class_="add_to_cart_button").get("data-product_id"),
"name": pokemon.find("h2").text.strip(),
"price": pokemon.find(class_="price").text.strip(),
"url": pokemon.find(class_="woocommerce-loop-product__link").get("href"),
})
return pokemon_list
extract_details
函数将获取一个页码并将其连接起来,用于创建子页面的 URL。获取内容并创建产品数组后返回。这意味着返回的值将是一个字典列表,这是一个后续使用的必要细节。
我们需要为每个页面运行上面的函数,获取所有结果,并存储它们。
import csv
# modified to avoid running all the pages unintentionally
pages = range(1, 3)
def store_results(list_of_lists):
pokemon_list = sum(list_of_lists, []) # flatten lists
with open("pokemon.csv", "w") as pokemon_file:
# get dictionary keys for the CSV header
fieldnames = pokemon_list[0].keys()
file_writer = csv.DictWriter(pokemon_file, fieldnames=fieldnames)
file_writer.writeheader()
file_writer.writerows(pokemon_list)
list_of_lists = [
extract_details(page)
for page in pages
]
store_results(list_of_lists)
运行上面的代码将获得两个产品页面,提取产品(总共 32 个),并将它们存储在一个名为 pokemon.csv
的 CSV 文件中。 store_results
函数不影响顺序或并行模式下的抓取。你可以跳过它。
由于结果是列表,我们必须将它们展平以允许 writerows
完成其工作。这就是为什么我们将变量命名为list_of_lists
(即使它有点奇怪),只是为了提醒大家它不是扁平的。
输出 CSV 文件的示例:
id | name | price | url |
---|---|---|---|
759 | Bulbasaur | £63.00 | https://scrapeme.live/shop/Bulbasaur/ |
729 | Ivysaur | £87.00 | https://scrapeme.live/shop/Ivysaur/ |
730 | Venusaur | £105.00 | https://scrapeme.live/shop/Venusaur/ |
731 | Charmander | £48.00 | https://scrapeme.live/shop/Charmander/ |
732 | Charmeleon | £165.00 | https://scrapeme.live/shop/Charmeleon/ |
如果您要为每个页面 (48) 运行脚本,它将生成一个包含 755 个产品的 CSV 文件,并花费大约 30 秒。
time python script.py
real 0m31,806s
user 0m1,936s
sys 0m0,073s
我们知道我们可以做得更好。如果我们同时执行所有请求,它应该花费更少时间,对吧?也许会和执行最慢的请求所花费的时间相等。
并发确实应该运行得更快,但它也涉及一些开销。所以这不是线性的数学改进。
为此,我们将使用上面提到的 asyncio
。它允许我们在事件循环中的同一个线程上运行多个任务(就像 Javascript 一样)。它将运行一个函数,并在运行时允许时将上下文切换到不同的上下文。在我们的例子中,HTTP 请求允许这种切换。
我们将开始看到一个 sleep 一秒钟的示例。并且脚本应该需要一秒钟才能运行。请注意,我们不能直接调用 main
。我们需要让 asyncio
知道它是一个需要执行的异步函数。
import asyncio
async def main():
print("Hello ...")
await asyncio.sleep(1)
print("... World!")
asyncio.run(main())
time python script.py
Hello ...
... World!
real 0m1,054s
user 0m0,045s
sys 0m0,008s
接下来,我们将扩展一个示例案例来运行一百个函数。它们每个都会 sleep 一秒钟并打印一个文本。如果我们按顺序运行它们大约需要一百秒。使用 asyncio
,只需要一秒!
这就是并发背后的力量。如前所述,对于纯 I/O 密集型任务,它将执行得更快 – sleep 不是,但它对示例很重要。
我们需要创建一个辅助函数,它会 sleep 一秒钟并打印一条消息。然后,我们编辑 main
以调用该函数一百次,并将每个调用存储在一个任务列表中。最后也是关键的部分是执行并等待所有任务完成。这就是 asyncio.gather[4] 所做的事情。
import asyncio
async def demo_function(i):
await asyncio.sleep(1)
print(f"Hello {i}")
async def main():
tasks = [
demo_function(i)
for i in range(0, 100)
]
await asyncio.gather(*tasks)
asyncio.run(main())
正如预期的那样,一百条消息和一秒钟的执行时间。完美!
我们需要将这些知识应用于数据抓取。遵循的方法是同时请求并返回产品列表,并在所有请求完成后存储它们。每次请求后或者分批保存数据可能会更好,以避免实际情况下的数据丢失。
我们的第一次尝试不会有并发限制,所以使用时要小心。在使用数千个 URL 运行它的情况下……好吧,它几乎会同时执行所有这些请求。这可能会给服务器带来巨大的负载,并可能会损害您的计算机。
requests
不支持开箱即用的异步,因此我们将使用 aiohttp [5] 来避免复杂化。 requests
可以完成这项工作,并且没有实质性的性能差异。但是使用 aiohttp
代码更具可读性。
import asyncio
import aiohttp
from bs4 import BeautifulSoup
async def extract_details(page, session):
# similar to requests.get but with a different syntax
async with session.get(f"{base_url}/{page}/") as response:
# notice that we must await the .text() function
soup = BeautifulSoup(await response.text(), "html.parser")
# [...] same as before
return pokemon_list
async def main():
# create an aiohttp session and pass it to each function execution
async with aiohttp.ClientSession() as session:
tasks = [
extract_details(page, session)
for page in pages
]
list_of_lists = await asyncio.gather(*tasks)
store_results(list_of_lists)
asyncio.run(main())
CSV 文件应该像以前一样包含每个产品的信息 (共 755 个)。由于我们同时执行所有页面调用,结果不会按顺序到达。如果我们将结果添加到 extract_details
内的文件中,它们可能是无序的。但我们会等待所有任务完成然后处理它们,因此顺序性不会有太大影响。
time python script.py
real 0m11,442s
user 0m1,332s
sys 0m0,060s
我们做到了!速度提升了 3 倍,但是……不应该是 40 倍吗?没那么简单。许多因素都会影响性能(网络、CPU、RAM 等)。
在这个演示页面中,我们注意到当执行多个调用时,响应时间会变慢,这可能是设计使然。一些服务器/提供商可以限制并发请求的数量,以避免来自同一 IP 的过多流量。它不是一种阻塞,而是一个队列。你会得到服务响应,但需要稍等片刻。
要查看真正的加速,您可以针对延迟[6]页面进行测试。这是另一个测试页面,它将等待 2 秒然后返回响应。
base_url = "https://httpbin.org/delay/2"
#...
async def extract_details(page, session):
async with session.get(base_url) as response:
#...
这里去掉了所有的提取和存储逻辑,只调用了延迟 URL 48 次,并在 3 秒内运行完毕。
time python script.py
real 0m2,865s
user 0m0,245s
sys 0m0,031s
如上所述,我们应该限制并发请求的数量,尤其是针对单个域名。
asyncio 带有 Semaphore[7],一个将获取和释放锁的对象。它的内部功能将阻塞一些调用,直到获得锁,从而创建最大的并发性。
我们需要创建尽可能最大值的信号量。然后等待提取函数运行,直到 async with sem
可用。
max_concurrency = 3
sem = asyncio.Semaphore(max_concurrency)
async def extract_details(page, session):
async with sem: # semaphore limits num of simultaneous downloads
async with session.get(f"{base_url}/{page}/") as response:
# ...
async def main():
# ...
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
它完成了工作,并且相对容易实现!这是最大并发设置为 3 的输出。
time python script.py
real 0m13,062s
user 0m1,455s
sys 0m0,047s
这表明无限并发的版本并没有全速运行。如果我们将限制增加到 10,总时间与未限制的脚本运行时间相近。
aiohttp
提供了一种替代解决方案,可提供进一步的配置。我们可以创建传入自定义 TCPConnector[8] 的客户端会话。
我们可以使用两个适合我们需求的参数来构建它:
limit
– “同时连接的总数”。limit_per_host
– “限制同时连接到同一端点的连接数”(同一主机、端口和 is_ssl
)。max_concurrency = 10
max_concurrency_per_host = 3
async def main():
connector = aiohttp.TCPConnector(limit=max_concurrency, limit_per_host=max_concurrency_per_host)
async with aiohttp.ClientSession(connector=connector) as session:
# ...
asyncio.run(main())
这种写法也易于实施和维护!这是每个主机最大并发设置为 3 的输出。
time python script.py
real 0m16,188s
user 0m1,311s
sys 0m0,065s
与 Semaphore
相比的优势是可以选择限制每个域的并发调用和请求的总量。我们可以使用同一个会话来抓取不同的站点,每个站点都有自己的限制。
缺点是它看起来有点慢。需要针对真实案例,使用更多页面和实际数据运行一些测试。
就像我们之前看到的那样,数据抓取是 I/O 密集型的。但是,如果我们需要将它与一些 CPU 密集型计算混合怎么办?为了测试这种情况,我们将使用一个函数,该函数将在每个抓取的页面之后 count_a_lot
。这是强制 CPU 忙碌一段时间的简单(且有些愚蠢)的方法。
def count_a_lot():
count_to = 100_000_000
counter = 0
while counter < count_to:
counter = counter + 1
async def extract_details(page, session):
async with session.get(f"{base_url}/{page}/") as response:
# ...
count_a_lot()
return pokemon_list
对于 asyncio 版本,只需像以前一样运行它。可能需要很长时间⏳。
time python script.py
real 2m37,827s
user 2m35,586s
sys 0m0,244s
现在,比较难理解的部分来了:
直接引入 multiprocessing
看起来有点困难。实际上,我们需要创建一个 ProcessPoolExecutor
,它能够“使用一个进程池来异步执行调用”。它将处理不同 CPU 中每个进程的创建和控制。
但它不会分配负载。为此,我们将使用 NumPy
的 array_split
,它会根据 CPU 的数量将页面范围分割成相等的块。
main
函数的其余部分类似于 asyncio
版本,但更改了一些语法以匹配 multiprocessing
的语法风格。
此处的本质区别是我们不会直接调用extract_details
。实际上是可以的,但我们将尝试通过将 multiprocessing
与 asyncio
混合使用来获得最好的执行效率。
from concurrent.futures import ProcessPoolExecutor
from multiprocessing import cpu_count
import numpy as np
num_cores = cpu_count() # number of CPU cores
def main():
executor = ProcessPoolExecutor(max_workers=num_cores)
tasks = [
executor.submit(asyncio_wrapper, pages_for_task)
for pages_for_task in np.array_split(pages, num_cores)
]
doneTasks, _ = concurrent.futures.wait(tasks)
results = [
item.result()
for item in doneTasks
]
store_results(results)
main()
长话短说,每个 CPU 进程都会有几页需要抓取。一共有 48 个页面,假设你的机器有 8 个 CPU,每个进程将请求 6 个页面(6 * 8 = 48)。
这六个页面将同时运行!之后,计算将不得不等待,因为它们是 CPU 密集型的。但是我们有很多 CPU,所以它们应该比纯 asyncio 版本运行得更快。
async def extract_details_task(pages_for_task):
async with aiohttp.ClientSession() as session:
tasks = [
extract_details(page, session)
for page in pages_for_task
]
list_of_lists = await asyncio.gather(*tasks)
return sum(list_of_lists, [])
def asyncio_wrapper(pages_for_task):
return asyncio.run(extract_details_task(pages_for_task))
这就是神奇的地方。每个 CPU 进程将使用页面的子集启动一个 asyncio(例如,第一个页面从 1 到 6)。
然后,每一个都将调用几个 URL,使用已知的 extract_details
函数。
上述内容需要花点时间来吸收它。整个过程是这样的:
aiohttp
会话并创建页面子集的任务下面是本次的执行时间。虽然之前我们没有提到它,但这里的 user
时间却很显眼。对于仅运行 asyncio 的脚本:
time python script.py
real 2m37,827s
user 2m35,586s
sys 0m0,244s
具有 asyncio
和多个进程的版本:
time python script.py
real 0m38,048s
user 3m3,147s
sys 0m0,532s
发现区别了吗?实际运行时间方面第一个用了两分钟多,第二个用了 40 秒。但是在总 CPU 时间(user
时间)中,第二个超过了三分钟!看起来系统开销的耗时确实有点多。
这表明并行处理“浪费”了更多时间,但程序是提前完成的。显然,您在决定选择哪种方法时,需要考虑到开发和调试的复杂度。
我们已经看到 asyncio
足以用于抓取,因为大部分运行时间都用于网络请求,这种场景属于 I/O 密集型并且适用于单核中的并发处理。
如果收集的数据需要一些 CPU 密集型工作,这种情况就会改变。虽然有关计数的例子有一点愚蠢,但至少你理解了这种场景。
在大多数情况下,带有 aiohttp
的 asyncio
比异步的 requests
更适合完成目标工作。同时我们可以添加自定义连接器以限制每个域名的请求数、并发请求总数。有了这三个部分,您就可以开始构建一个可以扩展的数据抓取程序了。
另一个重要的部分是允许新的 URL/任务加入程序运行(类似于队列),但这是另一篇文章的内容。敬请关注!
python 3: https://www.python.org/downloads/
[2]
asyncio: https://docs.python.org/3/library/asyncio.html
[3]
multiprocessing: https://docs.python.org/3/library/multiprocessing.html
[4]
asyncio.gather: https://docs.python.org/3/library/asyncio-task.html#asyncio.gather
[5]
aiohttp
: https://docs.aiohttp.org/
[6]
延迟: https://httpbin.org/delay/2
[7]
Semaphore: https://docs.python.org/3/library/asyncio-sync.html#asyncio.Semaphore
[8]
TCPConnector: https://docs.aiohttp.org/en/stable/client_reference.html#tcpconnector
[9]
参考原文: https://www.zenrows.com/blog/speed-up-web-scraping-with-concurrency-in-python
– EOF –
转自:https://mp.weixin.qq.com/s/pPpc7CH4Rr9WTa4p8ue2Iw
1行代码,生成动漫头像。
听说某宝需要50块钱一张?别再去交智商税了!
安装很简单,在有python环境的电脑上,只需要执行下面这一行命令。
“ 如果你之前使用过python-office这个库,也需要执行一下,可以下载到最新版本~
安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-office -U
如果你的电脑里还没有安装python环境,可以看一下下面这个6分钟的傻瓜式安装教程,有电脑就能操作~
作者:程序员晚枫
链接:https://zhuanlan.zhihu.com/p/531681488
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
直接上代码!
代码
# 导入这个库:python-office,简写为office
import office
# 1行代码,实现 人像转动漫头像
office.image.img2Cartoon(path = 'd://image//程序员晚枫.jpg')
# 参数说明:
# path:存放自己真人照片的位置 + PDF的文件名,例如:d://image//程序员晚枫.pdf
直接运行以上代码,就会得到一张转化后的动漫头像了。
“ 程序可能需要运行20秒左右。
1行代码实现复杂功能,是不是使用起来很方便?
“ 项目已被收录进【开源中国】、【Python官网】等平台,所有功能,免费给大家使用:GitHub
顺利的人,有什么特征?
轻装前进、快速通过。
我其实一直在强调一个概念,你能够快速通过的,要快速通过。
我本身也是出生小地方,出生在三四线城市,我们这些小地方的人,有一个什么特征呢?就是我们特别看重硬气,什么事我都硬来,靠我自己的实力来,我们都是直男,纯粹的钢铁直男。靠父母,对不起,我们觉得不硬气,走弯路我们不硬气,我们要靠什么?要靠自己的硬实力。
比如说高考,我们就认高考,高考还就认两个学科,理科就是物理,文科就是中文,考不上觉得天都塌了;比如工作,我们就认公务员,而且一定要考上去的,不能走后门,我们很多人都有这种心理。
我年轻的时候,其实特别特别直,就是这种心理,所有的走弯路走捷径都看不上,不正义,我是天秤座的,听起来有点玄学,但是我天生就是喜欢公平,就是看见不平的,一定想着要拉平。
我讲一个案例,我高中的时候碰见了一个同学,他到郑州去上郑州外国语学校,当时我爸就跟我提了一嘴,说你要不要也上这个郑州外国语学校。因为我当时成绩还可以,我中考,严格来说是我们整个市第一名,加上体育的话,就是第一名,不加体育,可能比第一名差0.5还是一分,反正就是前三的这么一个水平。
当时我爸就问我,你要不要也去,然后我就说不用,我去哪儿都可以保证我上985。当然咱那时候更狂,说的不是上985,说的是去哪儿都可以上清华,当时就这么一种想法。我们这个地方每年考上清华的就一个,每年考上北大的也就一个,稍微有一点意外,你就可能考不上清华,考不上北大。
而这种意外就是发生了,但是我那个上郑州外国语学校的同学,他后来直接去了美国的一个州立大学,可是等到我上了一个985,上了四年的本科出来后。比如说我想去国外留学的时候,我面临一个问题,我甚至上不了他高中毕业以后,就可以去的那个州立大学。
这就是一个现实,相当于他就走了一个捷径,走了一个快速通过的路子,然后他就比你快很多。
我们很多人都知道,走路要架桥。但是实际上很多人有一个偏执就是,我走路要硬走,但是,你完全可以造一个桥,甚至你有一个热气球的话,完全也可以飞过去。
不是说国外就有多好,或者说不是一定要去做什么,我并不认为人生上了清华或者藤校就能怎样。
而是说一个人生思路,在你可以绕过,可以走捷径的时候,这不是不正义不是不正当,你不要偏执,一定要想着怎么快速通过,怎么快速把这个事情给过去。
像高考,你如果看清楚了以后,它就是一个游戏,包括你进入社会后找工作,你看透了以后它就是游戏,比如说你父母可以给你介绍一个特别好的工作,你不借用人脉吗?
我们前几年说过,现在找工作靠什么?靠拼爹,你有好的父母,你非要说你不用,当然现在这样的人很少了,但是实际上就是你有捷径就要走,你要有牛刀杀鸡的气魄,杀鸡的时候,就要用牛刀,把这个鸡杀了了事,赶紧走下一步。
我们人生是一个阶段一个阶段的,你过了这个阶段,你总想在这个地方刷到第一,是没有意义的,其实,你刷到第一,你高考用十年的时间刷到750分,这没有意义。
你要用十年的时间,研究通一个行业,这是有意义的,但是你要是说在一个游戏里面把它刷到100分,刷到满分没有意义,你刷到满分的这个时间,你可以玩很多很多游戏了。
你能快速通过的时候,一定要快速通过。
我社群里有学员问我个问题,如果30万可以上清华,要不要上?
我给他的回答是什么?愿意花30万上清华的人,一定能够把这30万挣回来,觉得30万上清华贵的同学,那么你就要承受上不了清华的代价。
知乎上的类似问题,给你100w和上清华北大,你怎么选?不少人都选择,我先拿100w,明年再来复读考上清华。
都是屌丝思维。
什么意思呢?就是你能够用30万去买到一个快速通行的通行证,那么你一定要买,因为你以后会发现,你要再补回来这么一个通行证很难。
但是,所有掏不起30万的人,觉得30万很多的人,即使上了清华也没有用。对于有些人来说,清华或者北大,可能就是一个985,就是一个符号,但是,有些人可以用这么一个符号把它玩出花来。
而且你要知道,能够拿30w出来的人,如果你是小地方的一个千万富豪,你的孩子学习不好,上不了985,上不了国内的名校,那么对你来说,对你的个人品牌都是一个伤害。如果你的孩子连一个好的学校都上不了,说明:第一,你孩子确实不中用。这对你这个孩子的伤害,对你这个家族的伤害,是非常非常大的。第二,你确实也没人脉。我要找你借钱或者你要找我借钱,我都要考虑考虑,你的背景到底行不行,你说你其他的这些背景,这就相当于现在说的排面,你连个排面都没有。
同样一个普通家庭的人,即使你花了30万上清华,结果出来以后,比如说到了今天他要去考城管,要去当老师,那么上清华的意义对他确实不大,那当时不如去买一套房,在十几年前,30万块确实可以在北京快买一套房了,如果当时你能在北京买一套房,绝对比你上清华强,对他来说,上清华、上北大就是没用,上985没用,你反正是出来要当城管的,那就完全没有用。
但是同样有些人可以借这个名号触发各种可能性。这就是咱们要说的第二点,你要怎么人生顺遂?你能不能快速通过到这个事情上,有些关口,有些难关,你不要总想内卷,所有想要内卷的人,他的人生都不可能太顺遂,所有你想要内卷的人,他的人生都不可能太顺遂。
因为一旦你想内卷,你会发现你的人生会走到磕磕绊绊,所以想办法去快速通过这个游戏,一定要想办法去快速通过。
内卷就是什么,内卷就是很多人都在竞争一件事情,有一万人、十万人去竞争,这就叫内卷。一旦你陷入内卷了以后,你会发现什么?有的是聪明的脑瓜,像中国这个地方,有的是聪明的脑瓜,千万不要觉得就自己很聪明,自己很厉害,在中国这个地方,不管他上二本也好、三本也好,甚至是上大专或者高中都没毕业,他的智商、他的生活经验都是够用的,你未必能整过那些人家没有上过大学的人。
人家智商都是可以的,生存智慧都是有的,这是内卷的一个必然的情况,你说我考大学可能不如你,那我排队要插队,还能不如你?一个车翻了,我抢西瓜还能比你慢?
没有这样的人,这是一个基本的生存智慧。
我们都有先天的一个生存本能,有一个先天的嗅觉。你接触过这些人就知道,那些没有上过大学的,干木匠、开挖掘机、颠大勺的人不见得智商比你差,所以千万不要看不起别人,在生存面前,你一旦去跟人家在同一个平台竞争,你未必竞争的过人家,要相信这一点,不要陷入内卷,能够竞争的时候去竞争。
现在考公的、考教师编制的多,但你未必就考得过那些当初上三本、上二本甚至上专科的这些同学,博士也不见得就考得过上二本的同学,只要大家在一个门槛上竞争,都去刷题,还真不见得,你考的分数就最高。
擅长考试的人,中国多的是,或者说你花两个月,人家花两年、三年去准备这样一个考试,那未必见得比你差,所以这时候能够快速通过就快速通过。这不是说教你造假,也不是说教你走后门,而是说我们这个社会相对来说,是一个本身竞争力度就很强的社会。那么你在这个社会里,你能够快速通过,进去了就进去了。
也同样给学历低的同学一个启示,你进去以后,你在里面还真不见得就干不过那些博士、硕士,不要把自己给吓住了,那些硕士博士,真的进到一个游戏内,真的进到一个什么单位不见得干得过你,如果说真的是纯粹的技术岗位,可能就高学历确实有高优势,但是大部分岗位其实真的不见得你学历低,就是劣势。
END
转自:https://mp.weixin.qq.com/s/5Q2GlKhp3voKf9OYwfAE-g