分类目录归档:技术

2020 最新可用的两种豆瓣 API

2020 最新可用的两种豆瓣 API

简明说明

目前可以通过两种形式访问:

    1. 旧的 API (api.douban.com),更换 apikey 为

054022eaeae0b00e0fc068c0c0a2102a

暂时可以访问,如

GET https://api.douban.com/v2/book/isbn/9787536692930?apikey=054022eaeae0b00e0fc068c0c0a2102a

完整参考);

    2. 新的 API (frodo.douban.com),包含了复杂的登录状态、时间戳、加密,在第一种方法被封的时候可以使用这种方式(相关讨论 1 / 相关讨论 2 / 相关实现)。

过程和细节

八月底在使用 calibre 的时候发现元数据(meta data) 获取错误,检查了一下查错、验证了网络请求,发现似乎 API失效。

经网络检索(相关讨论 1 / 相关讨论 2 ),网上常见的 apikey

0df993c66c0c636e29ecbb5344252a4a

已经在八月被豆瓣封禁。

根据讨论中的线索,在这里找到了对应的可用 API,故作此录。

借此机会还成为了著名开源软件 calibre 的开发者呢! 😎

使用 Cloudflare 自选 IP 优化移动宽带下 Notion 访问

简明操作

  1. 下载 Cloudflare 边缘节点批量测试工具 (https://github.com/olixu/cloudflare-ip-ping)
  2. 解压压缩包用 Python 运行 pingip.py,需要设定两个参数看说明即可;
  3. 批量测试结束过后根据目录内生成的 log 文件选择几个不丢包的 IP ,写入系统 hosts 文件,例如西南地区移动家宽可以直接使用:
# Notion
104.19.3.15 notion.so
104.19.3.15 www.notion.so
104.19.3.15 msgstore.www.notion.so

注意事项

  • notion.so, www.notion.so, msgstore.www.notion.so 这三个域名都需要加入
  • 应该是需要管理员权限才能 ping;
  • 其他运营商亦可使用这种方法优化访问但是电信联通可能没什么必要;
  • 请勿滥用。

使用效果

经西南某地区移动家宽测试,notion 访问时间从20+s (包含复杂的 dashboard 和数据库载入),变为几秒钟内全部加载完成。简单的页面几乎秒开,推荐使用。

原理阐释

Notion 使用 Cloudflare 作内容分发与攻击防御,但该服务在中国的情况比较复杂。

Cloudflare 通过 anycast 技术智能分配边缘节点,但是中国网络状况复杂,自动分配的节点可能会遭遇较高的丢包(特别是在移动宽带之下),甚至有人直接无法直连 notion。

在这里,我们通过测试不丢包的服务器地址并将其在 hosts 文件中指向 notion 即可实现经由最佳服务器的流畅访问。

Chrome 滚动条美化:在 Overlay Scrollbars 被取消之后

自从取消了 overlay ,滚动条实在有碍观感。

参考 reddit 网友做法,用 stylus 对任意网站美化 Chrome 滚动条:

  1. 在 Chrome 中安装 stylus 插件以自定义状态栏样式
  2. 在 stylus 中新建下列样式并“应用于所有页面”
::-webkit-scrollbar {
    width: 5px;
    height: 5px;
    background: #dddddd00;
}

::-webkit-scrollbar-button {
    width: 5px;
    height: 5px;
    background: #dddddd00;
}

::-webkit-scrollbar-button:hover {
    background: #d1d1d188;
}

::-webkit-scrollbar-thumb {
    background: #cccccc88;
}

::-webkit-scrollbar-thumb:hover {
    background: #88888888;
}

::-webkit-scrollbar-track {
    background: #dddddd00;
}

这样就可以了 ?

Pandas 已不允许使用“存在缺失标签的列表”进行索引(Indexing with list with missing labels is deprecated)

为了 .reindex 这一方法,自 0.21.0开始,pandas 不再支持使用 .loc[] 方法对存在一个或多个缺失标签的列表 (a list with one or more missing labels) 进行索引。

Starting in 0.21.0, using .loc or [] with a list with one or more missing labels, is deprecated, in favor of .reindex.

引自官方文档

例如对这一 数据:

s = pd.Series([1, 2, 3])
In [99]: s
Out[99]: 
0    1
1    2
2    3
dtype: int64

更改前

在此之前,我们可以直接:

s.loc[[1, 2, 3]]

得到:

Out[4]:
1    2.0
2    3.0
3    NaN
dtype: float64

在上面的操作中,尽管并不存在 3 这样一个索引,pandas 还是正确选取了存在的索引并用 NaN 对不存在的索引对应的值进行填充 (上述输出中的 3 NaN)。

更改后

现在我们只能得到:

In [4]: s.loc[[1, 2, 3]]
Passing list-likes to .loc with any non-matching elements will raise
KeyError in the future, you can use .reindex() as an alternative.
See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
Out[4]:
1    2.0
2    3.0
3    NaN
dtype: float64

在这里 pandas 跑出了错误和解决指引。但是这个指引对不熟悉 pandas 的人来说并不友好,下面给出类似结果的简单操作。

简单实现相同的操作

在当前版本(>0.21.0),我们可以根据官方指引,使用 .reindex 得到相同结果:

s.reindex([1, 2, 3])

在 DataFrame 中,也类似; 若需使用列而非行,则需要指定 axis:

df.reindex([1, 2, 3], axix=1) # 列

更多样例可参见原文档

Pandas 真是更新狂魔。

击败 98.93% 的 Python 解法

觉得生活即将失控的时候,总喜欢做点自己能掌控的事情——例如玩游戏,又如码代码。

与变幻莫测的人生不一样,在机械键盘上敲下一个又一个的字母,就能换来确定无疑的运行结果(哪怕是报错),确实应该被视作一件极其令人欣慰的事。

今天在群里看到一道简单算法题,做了做,没想到超过了 98.93% 的 Python 解法,这已经足够让我自欺欺人了。

题目

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。如:输入: s = “anagram”, t = “nagaram”输出: true

我的解法

def isAnagram(self, s: str, t: str) -> bool:
# 定义默认布尔值参与后续运算
    result = True
# 利用 Python 数据结构 set 去重去序
    set_tmp = set(s)
# 先判断组成字符串的各个字符元素是否一致
if set_tmp == set(t):
for i in set_tmp:
# 利用逻辑运算符判断各个字符元素的数量一致,均为 True 才输出 True
            result = result and (s.count(i) == t.count(i))
else:
        result = False
return (result)

主要利用了 set 的内置优化和特性减少运算,以及使用布尔运算提高效率。

执行用时 : 48 ms, 在所有 Python3 提交中击败了 98.93% 的用户

内存消耗 : 14 MB, 在所有 Python3 提交中击败了 29.70% 的用户“

举凡与意志相违、相妨、相抗,即一切不快不幸之事,总是立刻引起我们重视”,记录下这个小确幸或许,是重要的。