Mac 下使用 Python + Selenium 的几则避坑经验

最近研究 Mac 下运用 Python + Selenium,记录遭遇的几例经典避坑。

问题一:想自动控制的浏览器是 Safari,但问题是:Safari (版本号 13.1)默认仅会启动 Incognito(Private) Browsing 的独立新窗口(隐身模式),也就是不带任何浏览器的 cookies、缓存等用户预设信息,这极不方便伪造既有身份完成(诸如抓取仅限会员查看的资料等)动作。怎么办?

解法:从官方到民间搜了一圈,Safari 没有其他设置方法(可能是苹果出于安全考量)或 hack 野路子,只能作罢。换用 Google Chrome,因其体态轻盈、设置丰富。(搁到我另一台服务器 Ubuntu 桌面版下自然就是 Chromium)

问题二:我的 Google Chrome 自动升级到了 V85,但是 Mac + Python + Selenium 必备的文件 ChromeDriver(WebDriver for Chrome,https://sites.google.com/a/chromium.org/chromedriver/downloads)最新只支持到 V84,怎么办?

解法:无他,卸载 Chrome V85,重装回随手找到的旧版 V81,于是原本报错的代码果然跑起来了。额外提示,这里千万记得将 Chrome 设置成「不要自动升级」,以免夜长梦多,方法是:关闭 Chrome,进入目录 /Library/Google/GoogleSoftwareUpdate ,删除该目录下的 GoogleSoftwareUpdate.bundle 即可。

问题三: Chrome 自动执行开始,默认依然是打开类似隐身模式的独立窗口,我想要自动带上当前浏览器用户的身份信息,怎么做?

解法:

# 需要先命令行下 pip install webdriver_manager.chrome
from webdriver_manager.chrome import ChromeDriverManager_
from selenium.webdriver.chrome.webdriver import Options
opts = webdriver.ChromeOptions()
user_profile = '/Users/YourName/Library/Application Support/Google/Chrome'
opts.add_argument('user-data-dir=' + user_profile)
dr = webdriver.Chrome(ChromeDriverManager().install(),options=opts)
dr.get(url)

#上述 user_profile 变量是你的个人资料路径,可以在 Chrome 地址栏输入「chrome://version/」查看到。

2020/06/16 Update:上述问题三中一开始错加了的 Default 已经去掉(即原写「/Users/YourName/Library/Application Support/Google/Chrome/Default」,应该仅「/Users/YourName/Library/Application Support/Google/Chrome」。)

Growth Hacker 奇技淫巧一则:零授权,抓取新浪微博任何用户的微博内容

有时或基于以下凡此种种需求,我们会想要去抓取新浪微博的内容:

  • 产品冷启动,导入外部数据,而非从头积累;
  • 通过大数据+语义分析获取用户兴趣行为偏好,提供智能推荐;
  • 监控微博舆情,对特定关键词或是用户行为进行响应;etc

想必新浪深知微博内容本身是最其有价值的资产,一旦被竞争对手大批量抓取导入,则辛苦建立起的门槛将瞬间化作他人之嫁衣,因此做了非常繁复的安全保护,包括强制登录跳转认证、跨域检测、cookie 植入、禁止账号密码登录而启用 OAuth2.0 等等。

近期个人有一些抓取需求,在查询大量过时的网络资料测试无果后,决定另辟蹊径完成这一目标,并最终测试成功。在此分享出来。(这篇文章将提供解决问题的方法思路,但不会给出具体代码。伸手党请移步百度或 Github。)

你需要准备:一个个人微博账号,我们将透过它去访问其他用户页面,从而抓取。除此之外,别无所求。
Continue reading “Growth Hacker 奇技淫巧一则:零授权,抓取新浪微博任何用户的微博内容”

使用 Alfred Workflow 制作日文单词翻译器

Alfred 是  Mac 下一款强悍的系统增强工具,可以快速启动+搜索本地和网络任意内容。购买其付费版本的 Power Pack 还能启用 Workflow 功能,使用一门常用的脚本开发语言就能编写自己的工作流来实现各种有趣的插件。(这里有国人收集的很多现成的 Workflow 插件下载)

Screen Shot 2014 03 27 at 6 47 15 PM

今天心血来潮花了17英镑购买了 license,搜刮了几个自己可能用到的脚本,顺便研究了下如何进行 Alfred 脚本编写。只需简单的 PHP 就能完成一个 workflow。

这里以编写一个 Alfred 里的日文单词翻译器为例,简单介绍下流程。

基本原理:获取用户在 Alfred 内输入的内容(日文单词) -> POST 到百度云提供的翻译 API 获取翻译结果 -> 解析结果 -> 调用 Alfred Workflow 的方法输出成 Alfred 格式。

完成之后的效果是这样的:

Screen Shot 2014 03 27 at 7 07 24 PM

Continue reading “使用 Alfred Workflow 制作日文单词翻译器”

[开源项目]基于新浪SAE的《炉石传说》微信卡牌查询器

《炉石传说:魔兽英雄传》是暴雪娱乐开发的首款休闲卡牌游戏,在魔兽的世界观基础上吸纳借鉴了万智牌的玩法思路,并加入了卡牌商店、冶炼铸造、PVP对战、竞技场/天梯系统,并已于1月24日全球同步公测。时值春节期间,宅在家休养的小伙伴中发展出了好几枚炉石玩家,闲来对战,不亦乐乎。

作为十年前就跳入日本集换式卡牌《游戏王》这个无底大坑的IT死宅,此前我曾使用新浪的应用托管服务(Sina App Engine,SAE)+PHP 开发过微信上的游戏王卡牌查询器,其目前已自然积累了近 5000 粉丝,每日活跃查询数百次。在去年年底网易内测炉石传说期间,我第一时间搞到了内测码,并在小玩几把之后为其迷醉,遂通宵一晚在游戏王微信卡查的基础上,新开发了一套微信上的炉石传说卡牌查询器。

微信搜索账号:myhearthstone,或查找公众号“炉石传说卡牌游戏”即可关注体验。(顺便说一下,游戏王那个的微信账号是ourocg)

现本人将这套炉石传说微信卡牌查询器的源码托管至 Github 予诸君分享。项目地址: https://github.com/xdash/Hearth-Stone-Cards-DB-for-Wechat

在此简单对目录结构和使用到的 SAE 服务做番介绍。

Continue reading “[开源项目]基于新浪SAE的《炉石传说》微信卡牌查询器”

Mac 下安装 Python 图像处理模块 Pillow

学习用 Python 写日常辅助小工具。参阅教程,原打算使用 PIL 库作为图片处理模块,但发现该库已停止维护两年,开源社区普遍推荐 fork 版的 Pillow。要说 Mac 虽自带 Python,但对安装 Python 的库却繁复折腾,捣鼓了半天,最后还是靠大神丢过来的 Quora 链接顺藤摸瓜搞定了 Pillow。

记录分享如下:

1、使用 pip 安装 Python 库。pip 是 Python 的包管理工具,安装后就可以直接在命令行一站式地安装/管理各种库了(pip 文档)。

$ wget http://pypi.python.org/packages/source/p/pip/pip-0.7.2.tar.gz

$ tar xzf pip-0.7.2.tar.gz

$ cd pip-0.7.2

$ python setup.py install

2、使用 pip 下载获取 Pillow

$ pip install pillow

3、安装过程中命令行出现错误提示:”error: command ‘clang’ failed with exit status 1”。上网查阅,发现需要通过 Xcode 更新 Command Line Tool。于是打开 Xcode->Preferences->Downloads-Components选项卡。咦?竟然没了 Command Line Tools。再查,发现 Xcode 5 以上现在需要用命令行安装:

$ xcode-select —install

系统会弹出安装命令行工具的提示,点击安装即可。

此时再 pip install pillow,就安装成功了。

pip freeze 命令查看已经安装的 Python 包,Pillow 已经乖乖躺那儿了。

YuGiOh! Card Search Tool for Wechat (Open Source)

YuGiOh! is my favorite TCG (Trading Card Game) popular with global players, which has released over 7,000 different cards now for constructing your own deck.

And the YuGiOh! Card Search Tool for Wechat is an open source project created for Wechat official account that automatically response to user’s search query for any YuGiOh! card. I created this simply because I cannot remember so many cards up to now, and during a face-to-face duel it’s an urgent demand to quickly check opponent’s unfamiliar card.

  Screenshot_2013-10-16-00-03-23  Screenshot_2013-10-16-00-04-59  Screenshot_2013-10-16-00-05-17

By entering part of or the full card name/effect/exchange code/any other information, and tap “send”, this robot shally instantly help you find out which card(s) you are looking up for.

To see how it works, add Wechat official account by search id ourocg or name 游戏王卡片查询

I published this project on my Github:
https://github.com/xdash/YuGiOh_Card_for_Wechat

Thanks to ocgsoft.cn for providing card data API.