ARTS是什么?
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Techni:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章。
一、Algorithm
path sum(Easy)
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.
解法:递归法,从根开始,如果根存在,下一层应该存在sum-root.val的路径和
class Solution:
def hasPathSum(self, root: TreeNode, sum: int) -> bool:
if root == None:
return False
if root.left == None and root.right == None:
return root.val == sum
return self.hasPathSum(root.left, sum-root.val) or self.hasPathSum(root.right, sum-root.val)
拓展:如何用数组来表示二叉树?
二、Review
目的:找到低价机票
设定目的地和出行日期,在出行日期的前后3天,刷新是否有低价机票。集成的机票搜索平台有很多,比如Kayak,Monmondo,Skyscanner,Expedia等等,但是大部分都有reCaptchas验证,比较难搞。作者最终使用了Kayak,虽然也有验证码,但是如果4-6小时的间隔,是可以正常使用的。
开车了
- 输入城市和日期,开始搜索
- 获取搜索结果,然后在点击“获取更多结果”
- 另一个函数获取整个结果,然后解析出数据
- 然后重复上面两个步骤
- 把结果发送email,包含最低价格,平均价格,然后把原始数据保存到excel中
- 每隔几个小时跑一次上面的步骤
Selenium+chromedriver+pythoncrawler
XPath
如果快速定位到一个按钮的路径呢,XPATH。有一些id或者元素的名字,每次可能都会变化,所以我们要做匹配。
# This is what the copy method would return. Right click highlighted rows on the right side and select "copy > Copy XPath"
//*[[@id="wtKI-price_aTab"]/div[1]/div/div/div[1]/div/span/span
# This is what I used to define the "Cheapest" button
cheap_results = ‘//a[[@data-code = “price”]’
这个比较关键,如果没有这种正则匹配,url可能每次请求都会变化,代码如果不匹配,肯定就无法工作了。之后的无非就是写搜索和获取所有的结果,然后循环,整个代码其实是一个线性执行的过程,比较简单。
三、Tips
Python-100-Days
python100天从入门到放弃
有很多基础性的东西,有一定基础的可以看看。
四、Share
用户登录前,服务器需要生成一个会话唯一的 Token 并与 用户的“当前盐” 一起发送到客户端。客户端拿到Token和盐之后需要进行以下步骤的操作:
对用户输入的密码加盐后计算得到一个 HASH 值 p_hash;(如果用户输入的密码正确的话,这个值与数据库中存储的密码是一样的)
把上一步得到的 HASH 值 p_hash 与 用户名拼接后,以 Token 为 key 使用 hmac_sha256_hex 计算机得到一个新的哈希值 passwd。
把用户名和passwd 发送到服务器端进行密码验证
不过文章中上面一段话,其实不应该把用户的盐发送给用户,如果发送给用户,其实黑客就能拿到了,因为这个时候都没有做用户校验,所以最好的方式是只拿token对用户名和密码和时间戳加密,然后服务端解密,之后再做校验。