网页视频抓取脚本(暂存空间:打通阅读列表和第三方服务(组图) )

优采云 发布时间: 2021-12-25 21:06

  网页视频抓取脚本(暂存空间:打通阅读列表和第三方服务(组图)

)

  内容

  使用阅读列表作为临时存储空间,连接阅读列表和第三方服务

  Safari 阅读列表是 macOS 和 iOS 上相对容易被忽视的功能。该功能于2011年首次出现在OS X Lion和iOS 5系统中,但除了次年增加了离线缓存外,八年来基本保持不变。与Pocket、Instapaper等全职阅读后期服务相比,非常简陋。

  我自己之前很少使用阅读列表功能,而是使用Pinboard结合Instapaper来解决以后阅读的需求。虽然这种组合对我来说总体上是令人满意的,但它并不完美。最明显的缺点在于添加链接的繁琐。尤其是那些没有分享按钮的界面,每次添加链接,都要经过长按链接——选择“分享”——点击应用图标三个步骤。当需要连续保存很多链接时(例如阅读新闻通讯或显示播客笔记),重复这组繁琐的步骤几乎是一种折磨。此外,Instapaper 的同步也受到 iOS 后台进程的限制。

  相比之下,Safari阅读列表作为系统的内置功能,拥有第三方应用难以触及的权限。“添加到阅读列表”的选项几乎无处不在,而且始终位于一级菜单的显眼位置。新链接在任何时候都不需要两次以上的点击。不仅如此,作为系统服务,阅读列表可以一直在后台运行,而且几乎可以通过iCloud在设备间即时同步。

  在发现这些优势后,我最近几个月尝试更多地使用 Safari 阅读列表。为了扬长避短,我主要在两种场景中使用这个功能:一种是将阅读列表作为临时存储空间来处理一些不需要长时间存储的页面;另一种是将阅读列表作为“第三方工具的前端”,利用保存链接的便利性,然后通过脚本自动将其内容同步到其他阅读后期服务。

  使用阅读清单作为临时存储空间

  虽然阅读列表很差,但它的简单性也使它成为临时网页的理想位置。对于那些偶尔遇到的页面,浏览的时候想暂时保存一下,小心点书签标记有点浪费时间;很多网页不属于文章的范畴,所以阅读后期工具不是合适的目的地。在这些时候,阅读清单就成了一个理想的选择。

  阅读清单的使用非常简单。没有什么特别之处。不熟悉的用户可以阅读苹果官方的支持文章(iOS版、Mac版),以获得更全面的了解。不过,阅读列表功能也有一些比较隐蔽的技巧。记住它后,可以进一步提高使用它作为链接临时存储工具的效率。

  添加阶段:

  

  在 iPad 上使用拖放手势批量添加阅读列表链接

  管理和阅读阶段:

  连接阅读列表和第三方服务

  如前所述,阅读清单的主要优势在于与系统的紧密结合,但管理和阅读功能明显不如第三方服务。因此,一个自然的想法是将两者结合起来,将阅读列表作为一个纯粹的链接采集

工具,利用其添加链接时的便利性,而管理和阅读仍然在更专业的应用中进行。

  不过,阅读清单反映了苹果软件的一贯封闭性,并没有提供任何导出功能。好在阅读列表的实现机制并不复杂,可以通过简单的脚本获取其内容并导出到其他工具。

  阅读清单的工作原理

  在介绍具体方法之前,先为阅读清单的工作原理做个铺垫。在实现级别,Safari 阅读列表被存储并与 Safari 书签同步。实际上,阅读列表只是采集

夹中的一个特殊文件夹。

  在 macOS 上,阅读列表的路径位于 ~/Library/Safari/Bookmarks.plist。原创

状态下,plist文件以二进制格式存储;我们可以通过在终端应用程序中运行以下命令来观察其内部结构来转换可读的 XML 格式副本:

  cd ~/Library/Safari/Bookmarks.plist && plutil -convert xml1 -o Bookmarks.xml Bookmarks.plist

  

  转换为 XML 后的阅读列表文件结构

  如您所见,对于阅读列表中的每个链接,Safari 存储的信息包括其标题、URL、摘要、缩略图链接、添加日期和最近打开日期。从子键ReadingListNonSync的名称及其收录

的内容也可以看出,阅读列表中网页的缓存不会同步,每个设备都会重新检索网页信息及其缓存。(Web 缓存位于 ~/Library/Safari/ReadingListArchives 目录下,并以 Web Archive 格式存储。)

  在 iOS 上,阅读列表的存储位置略有不同。它位于数据库文件/private/var/mobile/Library/Safari/Bookmarks.db 中,但仍与普通书签一起存储。根据数据库中的列名,可以看出存储的信息基本对应macOS上的Safari。

  

  iOS 上的 Safari 书签数据库

  可以看出,为了将阅读列表与第三方服务连接,您只需要完成以下操作:

  分析阅读列表文件的变化

  对于第一点,可以在 GitHub 上找到现成的解决方案:ReadingListReader。这是一组基于 Python 的脚本,其功能是解析 Bookmarks.plist 文件并将其导出为 HTML、CSV 格式,或将其发送到 Pocket/Instapaper/Pinboard。

  以导出到 Pocket 为例。首先在 Pocket 网站上创建一个私有应用程序并保存 Consumer Key。接下来编辑上述项目中的 readinglist2pocket.py 文件,填写Consumer Key。这样就可以在终端运行了:

  ReadingListReader $ python ./readinglist2instapaper.py

  将阅读列表导出到 Pocket。导出到Pinboard或Instapaper的方法是一样的,这里不再赘述。

  监控阅读列表文件的变化

  剩下的问题是如何监控阅读列表的变化,以便在添加新链接时,通过上述脚本自动发送给第三方服务。最简单的方法是使用 Hazel。在 Hazel 中,为 ~/Library/Safari 文件夹创建一个新规则并设置两个匹配条件:

  文件的全名是Bookmarks.plist(注意“Full Name”和“Name”的区别,后者不包括扩展名);上次匹配日期(Date Last Matched)早于上次修改日期(Date Last Modified)(更改换句话说,文件自上次匹配后发生了更改)。

  匹配后的动作是运行终端脚本(Run Shell Script):

  python /path/to/script/readinglist2pinboard.py。

  

  以发送到 Pinboard 的脚本为例,Hazel 动作

  需要说明两点:

  使用Mercury提升网页信息抓取效果

  虽然阅读列表会自动抓取网页的标题、摘要等信息,但并不是很智能。根据经验,如果添加的链接是付费墙或短链接、跳转链接等网页,阅读列表可能无法正确获取网页信息。这对将其同步到 Instapaper 或 Pocket 几乎没有影响,因为它们会重新处理添加的链接;但是如果你像我一样将它与 Pinboard 同步,可能需要一些额外的步骤来处理上述缺点。

  

  阅读列表不擅长处理需要重定向的特殊 URL

  我的解决方案是引入Mercury。Mercury最初是一个在线API,很多RSS工具都用它来抓取全文。然而,其提供商不久前宣布将停止提供服务,而是将代码开源到 GitHub 上,供人们构建和使用。就本文而言,这并不是一件坏事,因为在本地运行代码效率更高。

  Mercury基于JavaScript,先用

  npm -g install @postlight/mercury-parser

  将其安装到系统中(取决于 npm)。

  然后,您可以尝试在终端中执行mercury-parser [URL] 来测试它是否正常工作。

  

  Mercury正确获取重定向URL指向的原创

网页的相关信息

  Mercury的分析结果以JSON格式输出,其中url(原链接)、title(网页标题)、摘录(文章摘要)三个key对本文有意义。为了在 Python 脚本中调用 Mercury 及其输出,您需要对原创

代码进行一些修改:

  from readinglistlib import ReadingListReader

import urllib

import subprocess # 用于运行 Mercury 终端命令

import json # 用于解析 Mercury 输出结果

auth_token = 'REPLACE_WITH_YOUR_API'; # 替换为你自己的 API Key

api_url = 'https://api.pinboard.in/v1/posts/add?'

rlr = ReadingListReader()

bookmarks = rlr.read()

for bookmark in bookmarks:

parser = json.loads(subprocess.check_output(["mercury-parser", bookmark['url']])) # 将脚本解析出的阅读列表链接提供给 Mercury 并获取其输出

params = urllib.urlencode({

'url': parser['url'].encode('utf-8'),

'description': parser['title'].encode('utf-8'),

'extended': parser['excerpt'].encode('utf-8'),

'toread': 'yes',

'auth_token': auth_token}) # 将 Mercury 的解析结果作为参数传输给 Pinboard 的 API

urllib.urlopen(api_url + params)

  你可以在这里找到我修改过的脚本。

  最后,通过改变Hazel的赛后动作来执行脚本,可以得到更直接、更完整的同步结果。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线