《程序员修炼之道》这本书,算是计算机界的畅销书了,本书的价值是向你展示了最佳实践,无论新手还是老手,阅读中都会产生共鸣。正如书的封底所言,阅读本书,你将会:

  • 与软件腐烂作斗争;
  • 避开重复知识的陷阱;
  • 编写灵活、动态、可适应的代码;
  • 防止考巧合编程;
  • 通过合约、断言及异常使你的代码“防弹”;
  • 捕捉真正的需求;
  • 无情而有效的测试;
  • 让你的用户满意;
  • 建立注重实效程序员的团队,并且通过自动化使你的开发更严谨。

以需求为导向的开发

对于一个企业,唯一关心的是如何增加收入,降低成本。企业需要的并不是程序员,而是能够帮它们完成可以增加收入、降低成本的项目的人。花了很多时间,开发出来的产品,没有市场,那么企业难以在激烈的市场竞争中存活。

面向需求的开发,是软件开发的一条基本准则。

在项目开发中,很容易出现搜集需求、编写需求文档和系统交付割裂的情况,这难以快速的响应市场需求。实际上,需求手机、设计、以及实现,是交付高质量系统的不同方面,所有的步骤并非孤立的,采用瀑布模型进行开发,耗时、灵活度不足等问题,敏捷开发的兴起,解决了瀑布模型的弊端。

以需求为导向的开发,意味着项目更加靠近问题。

无论是用于配置和控制应用程序的简单语言,还是用于指定规则或过程的更为复杂的语言,你都应该考虑让你的项目更靠近问题领域。通过在更高的抽象层面上编码,你获得了专项解决领域问题的自由,并且可以忽略琐碎的实现细节。

注重实效的开发

软件开发需要实现时间、成本、范围三者的平衡,需要作出取舍,从而保证实效。在软件开发过程中,开发易于理解和维护的唯一途径是DRY原则—“系统中的每一项只是都必须具有单一、无歧义、权威的表示”。

我们想要在编写代码的时间更少,想要在开发的早期避免错误,需要进行深思熟虑的编程,遵循以下原则:

  • 总是意识到你在做什么,不要盲目编码,试图构建你不完全理解的应用,或者你不熟悉的技术。
  • 依靠可靠的事物,不要依靠巧合和假定,如果无法说出各种特定情景的区别,就假定是最坏的。
  • 为你的假定建立文档,有助于澄清你头脑中的假定,并且有助于把它们传达给别人。
  • 不要只是测试你的代码,还要测试你的假定,编写断言测试你的假定。
  • 按照计划行事,工作进行优先级排序,把时间花在重要的方法:很又可能,它们是最难的部分。
  • 不要作历史的奴隶,不要让已有的代码支配将来的代码,如果不适用,所有的代码都可被替换。

优雅的代码,简洁、抽象程度高,当代码不满足新的运用场景时,不要犹豫对其进行重构。重构是对代码进行重写、重做和重新设计。重构的场景包括:代码违背了DRY原则(单一、无歧义、权威的表示);非正交设计;代码过时,或者需求变了,原有代码难以满足新的运用情景;需要改善性能。

选择恰当的工具

一个趁手的工具很一个不趁手的工具相比,产生的价值差距不是1倍、2倍,而是百倍、千倍。

从开发语言、编辑器到Shell等等工具。工具并非越多越好,更重要的是熟练度和长时间适用性。

印象比较深刻的是作者提到的使用纯文本写文件。纯文本是指没有对文本进行任何修饰,没有任何粗体,下划线,斜体,图形,符号或特殊字符及特殊打印格式的文本。常见的纯文本格式文件的扩展:txt、htm、asp、bat、c、bas、prg、cmd、log等。与纯文本相对的富文本格式(Rich Text Format)即RTF格式,比如word。HTML则则超文本标记语言,通过一系列标签,可以将要网络上的文字格式统一。纯文本是最简单的文件,任何编译器都可以打开编辑,兼容性极强。坏处是文本过大,访问速度过慢。

依然是首选的职业

注重实效程序员身上有一些特质,比如:

  • 好奇心重。对任何事物保持好奇,喜欢研究新的东西。

  • 独立思考。批判性思维能力强,不人云亦云,不拘泥于规则,能够打破常规寻找解决方法。

  • 接地气。能从现实角度考虑问题,平衡预算,知道工作中最重要的事情,集中力量解决。

保罗 · 格雷厄姆在《如何创造财富》一章中提到致富的方法是创立公司。当然创立公司的失败率非常高,并不适合所有人,创业公司的本质是以小团体的形式满足客户需求,在大公司工作可以理解为个体集中在一起共同满足客户需求。自然而然的,要想致富,工作应当是可测量、可放大的。

  • 可测量量。个人的回报应体现在为客户创造了多大价值,但是在大公司中个人工作无法分开测量,显然不具有可测量性。可测量性工作的理想状态是小团体及工作对组织的依赖性不强。
  • 可放大。流水线上计件工资可以测量,但是依然无法带来个人财富,因为工作性质不具有可放大性。

那么哪些行业、哪些职位的工作成果更具有上述两个特性呢?主要集中在知识密集型行业(高科技行业)、设计行业、程序员、公司高层,其本质是能以小团体形式服务客户,可借助外界资源放大该优势。

从保罗 · 格雷厄姆的回答中可以看出,程序员依然是首选的职业。虽然996、秃顶等词语是大众对程序员的刻板印象,但程序员却是少有的高薪行业,工资的起点已经是很多行业的天花板了。更重要的是,程序员使用的语言是国际化的,其信息流动性,远远高于传统行业。

End.

人均GDP不同增长阶段,一个国家农产品需求结构、农业从业人员结构、农业发展的主要矛盾及农业对经济的贡献呈现不同的特点。一般而言,人均GDP3000美元,1万美元是两个非常重要的参考指标。

农产品需求结构随人均GDP的变化规律

人口的增长或者人均收入的增加都会导致农产品需求结构发生变化。一般情况下,人口增长会导致对农产品的需求增加。随着人均收入的增加,消费的食品重点会从芋类、谷类等淀粉质食品逐渐转向畜禽等高蛋白食品。但对食品的消费量不会随着收入的增加而无限增加,当人均GDP超过1万美元时,对增加食品消费的欲望逐渐趋近于零。

上述现象可以发现食品领域的几个趋势:(1)当前农产品是相对过剩,过多的低品质农产品与人们对高品质农产品需求增长之间的矛盾;(2)人们对畜禽等高蛋白的需求会持续增加;(3)随着收入增加,食品消费中支付给加工、流通、饮食服务部门的费用将会增加,带动农产品供应链体系建设、农产品深加工、冷链、食品研发及营销创新等赛道发展。

农村劳动力结构随人均GDP的变化规律

农村劳动力结构包括:劳动力数量、劳动力质量、劳动力生产效率、劳动力收入等方面。

工业化及城市化的发展,促进农业人口向非农人口转移,农村劳动力会持续流出。农村劳动力持续流出的动力在于,非农收入大大超过农业领域的收入,如果农业领域和其他领域没有足够大的收入差距,农民不会轻易离开农业。

一项研究表明,发达国家年农村劳动力以2.2%的速度减少,但农业生产以年均1.2%的速度增加(2002年数据)。为什么劳动力减少了,农业仍然在发展?根本原因是技术的进步弥补了劳动力减少带来的影响。

经济发展水平越高,伴随农村劳动力的减少,农业的增加对技术的依赖越来越大。技术运用于农业生产需要人才及建设相应的农业技术推广体系,培养适合农业现代化发展的人才,政府及高校建立农业技术推广体系显得尤为必要。

农业领域的主要矛盾的转移规律

发展中国家工业化初期,农业发展的主要矛盾是满足粮食供给。该阶段,通过剪刀差从农业领域积累资本,此时以发展工业为工作重心。而当工业化发展到一定阶段,会面临着城乡二元结构,导致农村贫困问题进一步恶化。此时,农业政策的中心任务是如何解决农村贫困问题。当进入到工业化后期,如何实现城乡协同发展,保护农民权益变成了政策核心。

这本书《为什么精英都是Excel控》建议倒着看,先看附录,然后看最后一章的案例,接着在从第一章看。

学习Excel重要的不是Excel本身,而是Excel背后体现的思维。

重要的并不是操作技术

首先来做道面试题。

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  

|

你是一家汉堡店的经营者,汉堡店生意很好,下个月的销售量预计比这个月增加10%  
同时,你也可以提高汉堡的售价,如果售价提高10%的话,预计下个月的销售量,应该会和这个月差不多  
  
请问:  
  
A:维持现在的价格,让销售量增加10%  
  
B:售价提高10%,维持现在的销售量  
  
那个策略才能带来更多利润?  
  
不考虑其他因素答案选择B。原因:利润=收入-成本。A和B的成本虽然相同,但A会增加制作成本。  
  

—|—

但是商业世界远比这个复杂,你需要考虑售价提高后,销量的减少,或者销量提高后边际成本的减少。

但你可以你定出一个基本的公示*:利润=单价 * 数量 复购率 - 成本

所以在对商业进行思考时,我们都可以简单的拆分成收入、费用、成本,然后在把影响这些的因素进一步细分,找到企业经营的核心要素,然后把资源投入到核心要素上。

下面这张图就是一个拆解的案例:

image-20201010203450916

而且你在对收益模拟时,可以采用极限模拟法:分为乐观、维持原状、悲观三个层次。这样思考的作用是确定临界点。

接下来讲讲操作技术

下面这张表是制作Excel时的注意事项。

附录里面也有一张类似的表,比我下面这张好看多了,只是当时没发现:)。

image-20201010203648708

下面的操作技术是改变数字或背景的颜色。下面这几点蛮有启发的,特别是第一点,第一点说明了一个工作中非常重要的原则:区分原始数据和修改数据,不要污染原始数据。 当你把原始数据污染了,如果后面需要找到最原始的记录但没有,这会增加额外的成本甚至带来巨大的损失。

  1. 使用颜色区分不同的数字:手动输入的数字(蓝色)、计算公式的数字(黑色)、参照其他工作表的数字使用不同的颜色。

  2. 一个Excel表格的颜色,最好不要超过3种。

  3. 不需要填入数字的用N/A,表示”not applicable ”。N/M表示”not meaningful ”。

  4. 在公司内部贯彻格式,降低沟通成本。

还有和协作有关的操作技术

团队协作,最重要的是共享规则和共识,团队内部Excel协作只是一个场景,核心是简单计算、团队内部共享同一规则。

具体包括:

  • 避免在算式中手动输入数字(输入的数字含义他人难以看懂)。可把手动输入的数字和计算的数字分开。

  • 避免使用太长的算式。

  • 为工作表绘制架构图。

  • 同一工作簿中工作表按逻辑排列,相同的最好标上类似的数据,工作表越少越好。

  • 标明数据的出处,写明附注,让自己和别人能够看懂。

  • 交给别人时,确保想给别人看的信息,确定使用隐藏。

  • 团队内部协作时遵循:第一负责人原则;只使用一个文件。

  • 存档时不要覆盖原文件,做好版本管理,采用另存为的方法(重要)。

作者还有一章专门讲了Excel的快捷键,如果用Excel比较多,常用的快捷键建议用熟。

这本书比较浅显,其他学习资料建议首选秋叶团队出版的Excel,把秋叶的那本书弄懂,工作的绝大部分场景就可以解决了,这本书里面还推荐了很多学习资源,可以延伸学习。

最后,我在使用办公工具时的一个感想:工具的好坏影响工作的质量,比具体技术更重要的是思维,不要一味的追求技术的高大上,关键是用工具场景化解决问题。最后,工具宁愿少而精,不要频繁换工具增加成本。

end.

他很完美,但是

在别人的眼中,他是一个完美的人。从小成绩优异,工作顺利,听父母的话,老师夸奖,老板欣赏,周围的人都很羡慕他的生活。

但是,他并不快乐。已近中年的他,越来越不知道自己想要什么,在工作、家庭的压力下,失去了方向。他发现,这不是真实的自我,只是在做别人眼中的自我,没有自主感、胜任感和归属感。

理解真实的自我,需要理解「真实」和「自我」两个词。

自我可以理解为整合的中心,整合是指人们把外在环境和内在感受形成内在秩序的过程。自我是根据周围环境和自己的情绪感受等形成的对自己是谁、自己喜欢什么、自己想做什么、自己与社会的关系等问题,发展出的一套体系。

真实则是指本来的样子,客观事实,不是假的。可见真实的自我是指个体引发的行为和调节,能够自我予以调节,感到自主。

德西在《内在动机》一书的第一章中提到:

这本书阐述人类动机,围绕着某一行为是自主的还是被控制的这一重要区别来组织内容。……这本书的目的很简单:利用全面的动机研究来探究自主和责任之间的关系,并且反思如何在疏离的世界中促使人们负起责任。

德西和瑞安从有机的,人本主义的假设出发,认为人们在主动与身边世界交互过程中,通过有机整合而发展,探索、发展和接受挑战是人的天性。他们指出了人类有这样一种基本趋势:

他们在内心世界的组织中朝着更加一致和更加完善的方向发展。这意味着,人类发展的内在本质是向内心深处的一致性与和谐迈进。

而追求内心深处的和谐离不开内在动机。

社会价值观的内化

社会价值观内化分为内摄和整合两种类型。内化是人们强制接受观念的过程,整合则是主动接受社会所要求的观念的过程。

当通过内摄接受社会价值观(观点、观念)时,比如告诉孩子你应该好好学习,不然父母和老师就不喜欢你了;告诉员工,你不按照某某要求做工作时,就不要来公司了;社会中的人告诉你,必须结婚生子,不然你就是异类。通常这种让人感受不到自主的行为,会导致三种后果:死板的顺从、半心半意的坚持、反抗。不管哪一种后果,带来的都是压力,焦虑,较差的表现,甚至诱发心理疾病。典型的如父母压制孩子天性,导致叛逆,厌学。

而通过整合接受社会价值观(观念、观念)时,即满足基本心理需求的同时内化社会价值观和规则。比如在让孩子做作业时,给予孩子自主,而非通过压力让孩子做作业,并且当孩子遇到学业困难时,能够给予帮助和解答。孩子会认为学校活动很重要,愿意承担更多的责任。孩子对价值观的内化和整合越充分,即把在学校表现出色(做更多的家务等)内化,孩子会有更强的责任感和幸福感。

人们认为你是一个自律的人,你会想方设法在有人的时候“表现”出自律,维护你的形象。心理学家用“自我卷化”来定义“人们感觉自身价值依赖于特定结果的过程”,当你的自我价值感来自于从工作中积累财富,你就自我卷入于工作;当孩子的自我价值感来自于考高分时受到夸奖,孩子就自我卷入考试得高分。

在德西看来:

这种”自我是由社会定义的观点”,其问题在于没有它没有区分真正的和虚假的自我,没有认识到我们每个人都从内在的自我(尽管它是新生的)开始,也没有意识到我们有能力不断完善和提升那个自我。因此,自我可以按照其本性发展,也可以由社会来“编程”,但这两个过程产生的自我将迥然不同。

| 社会价值观内化类型 | 产生环境 | 心理需求满足程度 | 获得的自尊
—|—|—|—|—
真实自我 | 整合 | 支持自主+设定界限+无条件的爱 | 满足基本心理需求自主、胜任、归属 | 真正的自尊(自由与责任相伴;尊重他人,接受他人缺点)
虚假自我 | 内摄 | 控制性环境+有条件的爱 | 放弃自主和真实的自我;追求归属感(得到他人认可),缺乏自主感和胜任感 | 有条件的自尊(不稳定,根本价值感缺乏安全感)

理解了内摄和整合,在看下面的自我决定论图解,动机越偏向内部,越依赖自我调节,越看重做事情本身的兴趣、享受和内在满足。

img

给予自主,减少控制

自主是人类的核心心理需求。

自主意味着可以按照自己的意愿做事,并感到自由。相反,则会感到行为被控制。被控制的行为可分为两种:顺从和反抗。顺从,即按照别人的意愿,做别人告诉(命令)你做的事;反抗,即违背别人的意愿,采取反向或者对抗等方式做事。

奖赏和惩罚都会有损内在动机,但我们不能认为奖赏都不好。奖赏并不一定会伤害内在动机,瑞安提出奖赏对人们的影响取决于:奖赏者的动机、奖赏的方式、被奖赏者的感受。当奖赏者并没有控制的意图,只把奖赏当作是一种表扬,那么接受者可能不觉得是一种控制和损坏内在动机。

分析奖赏者的动机需要找到其奖赏的默认假设,确保不是因为做成了奖赏者想要做的事情而得到奖赏。比如家长激励孩子学习完某某课程,可以得到什么东西,表面上看是为了孩子好,实际上是跟随其他家长的步伐,这种行为会让孩子把关注焦点放在东西上,而非学习知识带来的愉悦上。老板给予员工奖赏目的是让员工有动机做更多的活,而非对员工做某事的行为真心表扬,员工可能会感受到受到了控制。

因此,需要慎重的使用奖励。在奖励他人时,有一个小小的方法可以尝试:少使用控制的语言(应该、必须),多给予自主选择的空间。

强迫别人做事,是非常难的,特别是当这件事情很无趣时,即使这件事情对当事人有好处。这时就需要换一个思路,给予当事人更多自主。包括三个步骤:

  • 承认他人的感受。理解和表达当事人做这件事情的感受。

  • 提供合理的理由。原因最好是向内,并非指向奖赏和惩罚。

  • 人际支持。遇到困难时,给予解决方式。

  • 提供选择。说话和做事时不给对方施压,少使用带有压制的词语,如必须、不得不、应该等。

当然,给予他人自主,并非等于放纵。支持自主需要清晰、一致,并且以理解和共情的方式设定界限。这个界限需要让当事人知道,以此更好的调节自身行为。

同理,亲密的人际关系也是如此。

成熟的人际关系的特点是两个人能够公开的交流,不受自我卷入、内摄信念或自我贬低的影响。在这种关系中,每一方能为对方付出而不受期待回报。

爱一个人很难,难在从已经建立的自我的中解放出来。良好的亲密关系,在于给双方都留有空间。

最成熟和令人满意的关系特征是,一个人的真实自我与另一个人的真实自我相关联。每个人都依赖对方,每个人都保持着他的自主、完整,以及自我意识。在某种程度上,每个人都是自主的,有真正的选择意识,这样的关系将是健康的,伴侣双方都将能够回应彼此的真实自我,并且支持彼此的个性和特质。

做自己的主人

当前社会剧烈变化,思潮涌动,给人带来很多压力、焦虑和无力感。每个人都想掌握自己的命运,做自己喜欢做的事情。

正如郝明义在《工作DNA》一书中写道:“我们怎么看待工作,就是怎么看待生命,如何善用工作,也就是如何善用生命。这不会因为行业或职位的相异而有所不同。每个人都有一份工作,每个工作都在诉说、启发其特有的意义。只看我们是否能够倾听,领会。”

做自己的主人,并非逃避现实,逃避责任,用“我不喜欢做XX,但不得不XX”,“我应该XX”去思考和行动。相反,你应该更加积极乐观的观察和改变处境,让每次选择拥有更大的自由度。

2020年10月3日

专家和新手的区别在哪里?

每一个程序员都有一个梦想,成为领域内的专家。专家和新手有什么不同?1970年代左右,德雷福斯兄弟通过对飞行员、国际著名象棋大师的技能习得进行研究,他们发现专家和新手在技能调用上有很大的不同,并提出了德雷福斯模型(Dreyfus model),把从新手到专家分为新手、高级新手、胜任者、精通者、专家五个阶段。

第一阶:新手

  • 在该技能领域经验很少或者根本没有经验

  • 严格按照指令行事(告诉行动清单时会做得很好)

  • 几乎无法感知情景

  • 无法判断行为的对错或处理问题

第二阶:高级新手

  • 可以独自尝试任务,但仍难以解决问题

  • 摆脱固定规则但仍需依赖行动准则

  • 情景感知依然有限,难以感知事情全貌

  • 难以区分工作权重及优先级

第三阶:胜任者

  • 能独立解决遇到的新老问题

  • 从全局角度(至少部分)审视行动,能区分工作权重

  • 有意识刻意的制定计划

  • 将流程标准化常规化

第四阶:精通者

  • 整体把握全局,而非局限在某一个方面

  • 正确区分权重,知道最重要的任务

  • 感知情景并反思纠偏

  • 使用原则灵活指导行动

  • 决策越来越轻松

第五阶:专家

  • 根据训练后的直觉把握情景

  • 不再依赖规则、行动准则及原则

  • 出现新情况或发送问题才使用新方法

  • 预知未来

可以看出,新手和专家很重要的三个区别:全局意识及权重意识、情景化解决问题的能力、反思及纠偏的的能力。

一项统计显示,专家和精通者的数量不足超过20%,80%以上的人注定的在胜任者以下,并且高级新手占比最多。这说明了很多标榜有10年工作经验的人,实际上只是把一年的工作技能重复了9年。这也从一个侧面反映了,成为一个专家是多么的困难(约占1%-5%),程序员发展到一定阶段转型管理成功的概率远高于成为专家,而且公司也要不了那么多专家。

image-20230802212659113

任正非之前的一篇演讲中,提到把公司人员分为职员类、专家类、管理类,而对不同级别的专家任正非这么认为:

第二类是专家队伍,专家要快速适应社会变化,赶不上时代变化就会掉队,华为没有收容队。初级专家应该一专多知,做好本职的基础上,再想别的;中级专家一专多能或两专多能;高级专家要有场景化的合成作战能力。

可见,成为专家,并非仅仅局限在工具使用和技术能力提高上,在软件开发中程序设计语言、工具是十分必要的,但沟通能力、学习和思考能力更加重要,这往往是程序开发过程中容易忽视的能力,或者程序开发者不屑于注意的能力。

拥有场景化解决问题的能力是多么重要,要培养全局思考的能力,多问问为什么这么做,不要仅仅局限在自己的一亩三分地,导致思维受到束缚。

最后用网上看到的一篇文章里提到的,对新工程师入职企业的建议结尾。

  • 企业最关心的(或者说唯一在乎的)事情,就是增加收入、降低成本。

企业实际上需要的不是程序员,而是能够帮助它们增加收入、降低成本的人。

  • 企业雇佣你,是为了让你帮它们完成某个可以增加收入、降低成本的项目,而不是为了让你追求个人的软件成就。正确的做法是,你应该把自己描述成与增加收入、降低成本有关系的人,比如”xx产品的开发者”或”改进者”。有一个 Google Adsense 程序员的自我介绍,是这样写的:”Google 公司97%的收入,与我的代码有关。”

  • 我自己的体会是,写文档对一个人的锻炼是很大的。(1)可以熟悉项目;(2)可以提高表达能力;(3)可以提高技术能力,因为只有理解了代码才能表达出来,文档越清晰,就代表思路越清晰;(4)可以提高个人影响力,文档写得越好,看的人就越多。久而久之,你就会成为项目的代言人,别人有问题就会来找你。

End.

解析文本结构

1  
2  
3  
4  
5  
6  
7  
8  

|

import requests  
url = 'https://www.bilibili.com/ranking'  
  
# 发起网络请求   
response = requests.get(url)  
  
# 打印返回的文本  
print(response.text)  
  

—|—

打印标题

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  

|

import requests  
from bs4 import BeautifulSoup  
  
url = 'https://www.bilibili.com/ranking'  
  
# 发起网络请求  
response = requests.get(url)  
html_text = response.text  
soup = BeautifulSoup(html_text, 'html.parser') # html.parser为html页面解析工具  
  
# 打印返回的文本  
print(soup.title.text)  
  

—|—

提取列表

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  

|

import requests  
from bs4 import BeautifulSoup  
  
url = 'https://www.bilibili.com/ranking'  
  
# 发起网络请求  
response = requests.get(url)  
html_text = response.text  
soup = BeautifulSoup(html_text, 'html.parser')  
  
# 提取列表  
items = soup.findAll('li',{'class':'rank-item'}) # rank-item是其具体属性  
print(len(items))  
  

—|—

提取标题

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  

|

# 输入模块  
import requests  
from bs4 import BeautifulSoup  
  
url = 'https://www.bilibili.com/ranking'  
  
# 发起网络请求  
response = requests.get(url)  
html_text = response.text  
soup = BeautifulSoup(html_text, 'html.parser')  
  
# 提取列表  
items = soup.findAll('li',{'class':'rank-item'}) # rank-item是其具体属性  
  
for itm in items:  
  title = itm.find('a', {'class':'title'}).text  
  print(title)  
  

—|—

提取其他字段

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  

|

# 输入模块  
import requests  
from bs4 import BeautifulSoup  
  
url = 'https://www.bilibili.com/ranking'  
  
# 发起网络请求  
response = requests.get(url)  
html_text = response.text  
soup = BeautifulSoup(html_text, 'html.parser')  
  
# 提取列表  
items = soup.findAll('li',{'class':'rank-item'}) # rank-item是其具体属性,是总的分支  
  
for itm in items:  
  title = itm.find('a', {'class':'title'}).text  
  rank = itm.find('div', {'class':'num'}).text  
  score = itm.find('div', {'class':'pts'}).text  
  url = itm.find('a',{'class':'title'}).get('href') # 需要用get得到属性  
  print(f'{title}{rank}{score}{url}')  
  

—|—

创建提取数据的列表

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  

|

# 输入模块  
import requests  
from bs4 import BeautifulSoup  
  
url = 'https://www.bilibili.com/ranking'  
  
# 发起网络请求  
response = requests.get(url)  
html_text = response.text  
soup = BeautifulSoup(html_text, 'html.parser')  
  
# 创建用来储存信息的列表  
class Videos:  
  def __init__(self, title, rank, score, url):  
    self.title = title  
    self.rank = rank  
    self.score = score  
    self.url = url  
      
# 提取列表  
items = soup.findAll('li',{'class':'rank-item'}) # rank-item是其具体属性  
videos = []  
  
for itm in items:  
  title = itm.find('a', {'class':'title'}).text  
  rank = itm.find('div', {'class':'num'}).text  
  score = itm.find('div', {'class':'pts'}).text  
  url = itm.find('a',{'class':'title'}).get('href') # 需要用get得到属性  
  v = Videos(title, rank, score, url)  
  videos.append(v)  
    
print(len(videos))  
  

—|—

保存数据

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  

|

# 输入模块  
import requests  
from bs4 import BeautifulSoup  
import csv  
  
url = 'https://www.bilibili.com/ranking'  
  
# 发起网络请求  
response = requests.get(url)  
html_text = response.text  
soup = BeautifulSoup(html_text, 'html.parser')  
  
# 创建用来储存信息的列表  
class Videos:  
  def __init__(self, title, rank, score, url):  
    self.title = title  
    self.rank = rank  
    self.score = score  
    self.url = url  
      
  def to_csv(self):  
    return[self.title, self.rank, self.score, self.url]  
    
  def csv_title():  
    return(['标题', '排名', '分数', 'URL'])  
      
# 提取列表  
items = soup.findAll('li',{'class':'rank-item'}) # rank-item是其具体属性  
videos = []  
  
for itm in items:  
  title = itm.find('a', {'class':'title'}).text  
  rank = itm.find('div', {'class':'num'}).text  
  score = itm.find('div', {'class':'pts'}).text  
  url = itm.find('a',{'class':'title'}).get('href') # 需要用get得到属性  
  v = Videos(title, rank, score, url)  
  videos.append(v)  
    
file_name = 'Top100.csv'  
with open(file_name, 'w', newline='') as f:  
  pen = csv.writer(f)  
  pen.writerow(Videos.csv_title())  
  for v in videos:  
    pen.writerow(v.to_csv())  
  

—|—

ChangeLog

20200902 python实战

  • 通过各种途径认识牛人:

    • 通过社交媒体、行业会议等,主动认识各个领域的高手,最好能够建立信任关系。建立关系时,脸皮一定要厚,尊重、给别人提供你的价值,或者让别人看到你的潜力。注意,向别人请教时,一定要有所准备,问出高质量的问题。

    • 阅读牛人的传记,从中得到启发,具体参见阳志平-寻找牛人与智者清单

    • 整理牛人的公开演讲,或者阅读牛人写的书,进行学习。比如任正非对外演讲、高瓴资本张磊演讲、巴菲特致股东的信等。

  • 注意:

    • 高手的水平最好比你高2个level,这样高手的经验你才够得到。

    • 加入高质量社群,在潜在牛人做朋友,建立心理契约

阅读

实践

多经历大事,年轻时多做正确的难事,在实践中进行学习。

end.
2020年8月24日

0%