标签归档:Python

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 的开发者呢! 😎

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% 的用户“

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

网易云音乐爬虫

网易云音乐爬虫

在逆向网易云音乐API的基础上,利用Python爬取网易云音乐歌单信息和评论。由于爬虫是IO密集型任务,还用到了异步爬取框架。

暂不开源。

Sublime 解决 Anaconda 模块自动补全问题

问题:
在Sublime中安装了Anaconda后,再导入模块(module)的时候只能显示出当前的模块而不能像语法一样随着输入的字母自动补全。

原因:
官方这么说:

Auto-complete for import behaves badly.
Sublime Text 3’s default Python package cancels the auto-completion when some words are detected (for example def or class). This list of words includes import.

Work-around: Create a new Python directory in your Packages directory and copy the contents of the file Completion Rules.tmPreferences there with the same name. Delete your Sublime Text Cache file Cache/Python/Completion Rules.tmPreferences.cache .

翻译:

Sublime Text 3 的默认Python包会在检测到某些词语(比如def或class)的时候取消自动补全。“import”就在这个取消自动补全的关键词列表里。

解决办法:
在插件目录 Packages 里新建目录 Python
新建文件并将其命名为 Completion Rules.tmPreferences (中间有空格),其内容为:
[ccMODE_xml]

scope source.python
settings

cancelCompletion
^(.*\b(and|or)$)|(\s*(pass|return|and|or|(class|def)\s*[a-zA-Z_0-9]+)$)

[/ccMODE_xml]
3. 重启Sublime即可成功解决: