chore: lint text and auto correct

This commit is contained in:
github-actions[bot]
2023-06-06 06:13:34 +00:00
committed by GitHub
parent 263610a74c
commit 663265dccc
28 changed files with 610 additions and 610 deletions

View File

@@ -1,8 +1,8 @@
---
title: Huginn指南为任意网站制作RSS
title: Huginn 指南:为任意网站制作 RSS
date: 2022-05-08
lastmod: 2022-05-08
description: 又一篇介绍使用Huginn制作RSS的教程🕶
description: 又一篇介绍使用 Huginn 制作 RSS 的教程🕶️
categories:
- 技术
- 指南
@@ -14,35 +14,35 @@ tags:
- 技术
---
<!-- # Huginn指南为任意网站制作RSS -->
<!-- # Huginn 指南:为任意网站制作 RSS -->
Huginn使用多个不同功能的Agent组合搭配来实现一系列功能一个Agent可以执行特定的操作并产生一个Event你可以指定他产生的Event由哪个Agent接收处理。
Huginn 使用多个不同功能的 Agent 组合搭配来实现一系列功能,一个 Agent 可以执行特定的操作,并产生一个 Event你可以指定他产生的 Event 由哪个 Agent 接收处理。
比如我们需要使用WebSite Agent来爬取某个网站上的列表内容爬取后列表的每一项会生成一个Event我们可以指定一个Output Agent来接收这些Event并将其转换为RSS的格式进行输出复制Output Agent返回给你的URL就可以进行订阅啦Huginn爬取网站生成RSS的基本原理就是这样。
比如我们需要使用 WebSite Agent 来爬取某个网站上的列表内容,爬取后列表的每一项会生成一个 Event我们可以指定一个 Output Agent 来接收这些 Event并将其转换为 RSS 的格式进行输出,复制 Output Agent 返回给你的 URL 就可以进行订阅啦Huginn 爬取网站生成 RSS 的基本原理就是这样。
## Huginn爬取普通网页制作RSS
## Huginn 爬取普通网页制作 RSS
右键网页打开开发者工具屏幕会分出一部分空间显示开发者工具窗口点击左上角的按钮再把鼠标移动到页面上可以选择页面的某一个元素比如这里我们要爬取推荐文章列表推荐文章列表的每一项都有同样的样式我们可以使用CSS选择器来指定爬取该项
右键网页打开开发者工具,屏幕会分出一部分空间显示开发者工具窗口,点击左上角的按钮再把鼠标移动到页面上可以选择页面的某一个元素,比如这里我们要爬取推荐文章列表,推荐文章列表的每一项都有同样的样式,我们可以使用 CSS 选择器来指定爬取该项
![image-20220508160659378](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207138.png)
该元素可以用CSS选择器`.meiwen`选择到。
该元素可以用 CSS 选择器`.meiwen`选择到。
**Tips:** class=xxx则使用`.xxx`,如果为id=xxx则使用`#xxx`
该标签是a标签,我们可以继续限定一下条件,使用`a.meiwen`
该标签是 a 标签,我们可以继续限定一下条件,使用`a.meiwen`
如果要限制必须是h2 标签下的带有meiwenclass属性的a标签,可以使用`h2 a.meiwen`
如果要限制必须是 h2 标签下的带有 meiwenclass 属性的 a 标签,可以使用`h2 a.meiwen`
如果要再加一个限制是列表元素li下面的h2标签里带有meiwenclass属性的a标签,可以使用`li h2 a.meiwen`
如果要再加一个限制,是列表元素 li 下面的 h2 标签里带有 meiwenclass 属性的 a 标签,可以使用`li h2 a.meiwen`
添加其他附加限定条件以此类推
你也可以在右侧Style面板里点击加号添加一个自定义样式输入CSS选择器浏览器会自动高亮符合条件的网页元素你可以使用这个功能来检验你写的CSS选择器是否正确以及是不是提取的你想要的内容
你也可以在右侧 Style 面板里点击加号添加一个自定义样式,输入 CSS 选择器,浏览器会自动高亮符合条件的网页元素,你可以使用这个功能来检验你写的 CSS 选择器是否正确以及是不是提取的你想要的内容
![image-20220508163359806](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207716.png)
@@ -50,7 +50,7 @@ Huginn使用多个不同功能的Agent组合搭配来实现一系列功能
接下来在Huginn里创建一个Scenario然后点击新建一个Agent类型选择WebSite Agent填写一个名称并在最下面的配置处指定你要爬取的网页元素
接下来在 Huginn 里创建一个 Scenario然后点击新建一个 Agent类型选择 WebSite Agent填写一个名称并在最下面的配置处指定你要爬取的网页元素
> ###### **Website Agent**
>
@@ -63,35 +63,35 @@ url: {
}
```
以爬取url为例css表示使用css选择器选择网页元素value表示从哪里获取对应的值对于刚才我们选取的一个元素来说
以爬取 url 为例css 表示使用 css 选择器选择网页元素value 表示从哪里获取对应的值,对于刚才我们选取的一个元素来说
```html
<a class="meiwen" href="/article/58030.html" title="缘起则聚,缘灭则散">缘起则聚,缘灭则散</a>
```
href属性里面的内容是他的链接title属性里面的内容则是他的标题。接下来在value中填写`@href`指定从href属性提取内容就可以取到链接地址了
href 属性里面的内容是他的链接title 属性里面的内容则是他的标题。接下来在 value 中填写`@href`指定从 href 属性提取内容,就可以取到链接地址了
> **Pro Tips:**
>
> 如果是纯文本节点或是想提取标签内嵌的文本value里可以填写`string(.)`
> 如果是纯文本节点或是想提取标签内嵌的文本value 里可以填写`string(.)`
>
> 如果想删除多余的空格,可以使用`normalize-space(.)`
> **Pro Tips 2:**
>
> 字符串处理函数和标签属性值变量可以一起使用,如`normalize-space(@title)`可以获取该标签的title属性值并删除多余的空白字符
> 字符串处理函数和标签属性值变量可以一起使用,如`normalize-space(@title)`可以获取该标签的 title 属性值并删除多余的空白字符
![image-20220508163714342](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207717.png)
接下来点击Dry Run按钮进行测试不出意外我们会得到一个json的输出里面包括我们爬取到的每一项他的urltitle。
接下来点击 Dry Run 按钮进行测试,不出意外我们会得到一个 json 的输出,里面包括我们爬取到的每一项他的 urltitle。
如果没有成功你可能需要删掉上面没有使用到的hovertext节点因为该项指定的内容在我们刚才的网页中并不存在。
如果没有成功,你可能需要删掉上面没有使用到的 hovertext 节点,因为该项指定的内容在我们刚才的网页中并不存在。
![image-20220508164259295](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207718.png)
点击Save保存我们开始下一步输出RSS。在刚才的Scenario中再新建一个Agent选择Data Output Agent并设置他的名字和Source Agent
点击 Save 保存,我们开始下一步输出 RSS。在刚才的 Scenario 中再新建一个 Agent选择 Data Output Agent并设置他的名字和 Source Agent
> ###### Data output Agent
>
@@ -101,13 +101,13 @@ href属性里面的内容是他的链接title属性里面的内容则是他
**Propagate immediately**是指即时处理来自Source AgentEvent启用他方便我们调试但会略微增加服务器负载你可以自行决定是否使用。
**Propagate immediately**是指即时处理来自 Source AgentEvent启用他方便我们调试但会略微增加服务器负载你可以自行决定是否使用。
![image-20220508165345792](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207720.png)
在secret字段中为你的这个RSS标注一个英文的名字修改title字段标注你的RSS的名字。item字段是每条文章会有的属性一般来说主要就titlelink分别设置为上文我们提取的值的变量名。这里添加一个guid字段这是一篇文章的唯一标识符避免RSS阅读器读到的文章标题不同但是内容相同常见于某篇文章的标题被修改这会导致RSS阅读器内出现多篇重复文章。
secret 字段中为你的这个 RSS 标注一个英文的名字,修改 title 字段标注你的 RSS 的名字。item 字段是每条文章会有的属性,一般来说主要就 titlelink分别设置为上文我们提取的值的变量名。这里添加一个 guid 字段,这是一篇文章的唯一标识符,避免 RSS 阅读器读到的文章标题不同但是内容相同,常见于某篇文章的标题被修改,这会导致 RSS 阅读器内出现多篇重复文章。
此外建议增加一个link字段值设置为与爬取的网站的主域名一致避免网站内使用相对链接开头的资源无法正常加载。
此外建议增加一个 link 字段,值设置为与爬取的网站的主域名一致,避免网站内使用相对链接开头的资源无法正常加载。
![image-20220508170038722](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207721.png)
@@ -115,7 +115,7 @@ href属性里面的内容是他的链接title属性里面的内容则是他
![image-20220508170115192](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207722.png)
点击Save保存回到Scenario界面第一次需要手动点击运行一下刚才的Website Agent。稍等片刻后台会进行爬取右上角会显示产生了多少个Event。再点开刚才设置的Data Output Agent查看详情vola右侧就会显示生成的RSS链接了复制以xml结尾的链接到RSS阅读器中就可以订阅啦🎉
点击 Save 保存,回到 Scenario 界面,第一次需要手动点击运行一下刚才的 Website Agent。稍等片刻后台会进行爬取右上角会显示产生了多少个 Event。再点开刚才设置的 Data Output Agent 查看详情vola右侧就会显示生成的 RSS 链接了,复制以 xml 结尾的链接到 RSS 阅读器中就可以订阅啦🎉
![image-20220508170212112](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207723.png)
@@ -123,33 +123,33 @@ href属性里面的内容是他的链接title属性里面的内容则是他
如果你的配置正确但是WebSite Agent又没有输出任何内容的话那么你要爬取的站点的内容应该是通过JavaScript在你带开浏览器时动态生成的。
如果你的配置正确但是 WebSite Agent 又没有输出任何内容的话,那么你要爬取的站点的内容应该是通过 JavaScript 在你带开浏览器时动态生成的。
> **Pro Tips:**
>
> 你可以右键网页在开发人员菜单中点击显示源代码然后用Ctrl+F搜索你在页面上见到的想爬取的某一条内容如果有说明该网站的页面时静态的否则说明你要爬取的内容并不是静态的。
> 你可以右键网页在开发人员菜单中点击显示源代码,然后用 Ctrl+F 搜索你在页面上见到的想爬取的某一条内容,如果有说明该网站的页面时静态的,否则说明你要爬取的内容并不是静态的。
要爬取这样的站点我们需要模拟浏览器操作执行页面上的JavaScript脚本待数据生成完毕后再使用上面的方法去爬取内容。要模拟浏览器操作这里介绍两个方案一个是利用browserless的无头浏览器另一个是使用在线PhatomJS服务。
要爬取这样的站点,我们需要模拟浏览器操作,执行页面上的 JavaScript 脚本,待数据生成完毕后再使用上面的方法去爬取内容。要模拟浏览器操作,这里介绍两个方案:一个是利用 browserless 的无头浏览器,另一个是使用在线 PhatomJS 服务。
## 使用Huginn+Browserless为动态网页生成RSS
## 使用 Huginn+Browserless 为动态网页生成 RSS
部署了[RSS Man X](https://github.com/Colin-XKL/RSSmanX)的完整版的话默认已经包含huginnbrowserless服务无需重复安装。且huginn可以通过`service.browserless:3000`访问到browserless服务。
部署了[RSS Man X](https://github.com/Colin-XKL/RSSmanX)的完整版的话默认已经包含 huginnbrowserless 服务,无需重复安装。且 huginn 可以通过`service.browserless:3000`访问到 browserless 服务。
总体步骤与上文一样不过因为被抓取的内容是通过JavaScript动态生成的所以直接使用WebSite Agent是抓取不到东西的我们需要先使用Post Agentbrowserless服务发送指令让他帮我们模拟浏览器操作再将最终完整的网页返回给我们再使用WebSite Agent进行后续处理。
总体步骤与上文一样,不过因为被抓取的内容是通过 JavaScript 动态生成的,所以直接使用 WebSite Agent 是抓取不到东西的,我们需要先使用 Post Agentbrowserless 服务发送指令,让他帮我们模拟浏览器操作,再将最终完整的网页返回给我们,再使用 WebSite Agent 进行后续处理。
> ###### **Post Agent**
>
> A Post Agent receives events from other agents (or runs periodically), merges those events with the Liquid-interpolated contents of payload, and sends the results as POST (or GET) requests to a specified url. To skip merging in the incoming event, but still send the interpolated payload, set no_merge to true.
接下来以[这个网站](https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0)为例介绍一下这个列表页的内容是由JavaScript动态生成的
接下来以[这个网站](https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0)为例介绍一下,这个列表页的内容是由 JavaScript 动态生成的
![image-20220508205159783](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207724.png)
按照以下内容设置你的Post Agent
按照以下内容设置你的 Post Agent
```json
{
@@ -170,15 +170,15 @@ href属性里面的内容是他的链接title属性里面的内容则是他
}
```
其中`post_url`为你的browserless实例地址如果你使用了RSS MAN X里的Huginn可以直接向上面一样填写。`payload`中的`url`字段填写你需要的网页地址。注意emit_events要设置为`true`这样才方便我们后续使用WebSite Agent操作。
其中`post_url`为你的 browserless 实例地址,如果你使用了 RSS MAN X 里的 Huginn 可以直接向上面一样填写。`payload`中的`url`字段填写你需要的网页地址。注意 emit_events 要设置为`true`,这样才方便我们后续使用 WebSite Agent 操作。
点击Dry Run如果能返回一个带有`body`字段且里面有文本内容说明调用成功。
点击 Dry Run如果能返回一个带有`body`字段且里面有文本内容说明调用成功。
调用不成功检查一下配置,以及是不是我们的爬虫被目标网站拦截了。若是爬虫被拦截可参考文末的解决方案。
![image-20220508195731732](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207725.png)
接下来点击Save保存再新建一个Website AgentSource设置为刚才的Post Agent。
接下来点击 Save 保存,再新建一个 Website AgentSource 设置为刚才的 Post Agent。
```json
{
@@ -205,17 +205,17 @@ href属性里面的内容是他的链接title属性里面的内容则是他
注意修改`data_from_event`的值其他地方与爬取普通网站一样。再新建并配置一下Output AgentRSS的链接就出来了
注意修改`data_from_event`的值,其他地方与爬取普通网站一样。再新建并配置一下 Output AgentRSS 的链接就出来了
![image-20220508205856407](https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207726.png)
## 使用PhantomJS为动态页面生成RSS
## 使用 PhantomJS 为动态页面生成 RSS
首先需要到[Phantom Js Cloud的官网](https://phantomjscloud.com)注册一个账户每个账户官方提供了一定的免费额度每天大概可以爬取500个页面对于做RSS来说妥妥的够用了。注册之后可以得到一个API KEY这个待会会使用到。
首先需要到[Phantom Js Cloud 的官网](https://phantomjscloud.com)注册一个账户,每个账户官方提供了一定的免费额度,每天大概可以爬取 500 个页面,对于做 RSS 来说妥妥的够用了。注册之后可以得到一个 API KEY这个待会会使用到。
接下来新建一个Phantom JS Cloud Agent填写基本的名称、API KEY和目标URLrender type选择html。底下User Agent建议改用真实的浏览器UA减少触发反爬虫的可能性。如果不知道自己的UA可以到这个网站查看当前浏览器的UA复制字符串即可。如果懒得查也可以用这个
接下来新建一个 Phantom JS Cloud Agent填写基本的名称、API KEY 和目标 URLrender type 选择 html。底下 User Agent 建议改用真实的浏览器 UA减少触发反爬虫的可能性。如果不知道自己的 UA 可以到这个网站查看当前浏览器的 UA复制字符串即可。如果懒得查也可以用这个
```
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.81 Safari/537.36
@@ -227,7 +227,7 @@ Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like
>
> URLs generated by this Agent are formulated in accordance with the PhantomJs Cloud API. The generated URLs can then be supplied to a Website Agent to fetch and parse the content. Sign up to get an api key, and add it in Huginn credentials.
点击Dry Run后会返回一条url返回格式类似这样
点击 Dry Run 后会返回一条 url返回格式类似这样
```json
[
@@ -237,7 +237,7 @@ Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like
]
```
之后创建一个WebSite AgentSource Agent设置为上面的Phantom JS Cloud Agent然后稍微改一下url的部分
之后创建一个 WebSite AgentSource Agent 设置为上面的 Phantom JS Cloud Agent然后稍微改一下 url 的部分
```json
{
@@ -255,7 +255,7 @@ Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like
这里是刚才的Agent产生的一个Event。这里除了urltitle我还提取了date字段。在Output Agent中可以配置为每一条文章输出发布时间的信息。对于这种规整的日期字母串可以使用`{{ date | date: %F }}`进行解析并格式化输出为rss规范的时间格式如果没有配置的话每篇文章的发布时间显示的都是一样的为Huginn爬虫更新的时间。
这里是刚才的 Agent 产生的一个 Event。这里除了 urltitle 我还提取了 date 字段。在 Output Agent 中,可以配置为每一条文章输出发布时间的信息。对于这种规整的日期字母串,可以使用`{{ date | date: %F }}`进行解析并格式化输出为 rss 规范的时间格式如果没有配置的话,每篇文章的发布时间显示的都是一样的,为 Huginn 爬虫更新的时间。
```json
"item": {
@@ -267,9 +267,9 @@ Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like
> **Pro Tips:**
>
> Huginn解析日期
> Huginn 解析日期
>
> 注意`{{ date | date: %F }}`里面,第一个`date`是上面的Website Agent产生的Event里面的变量名第二个`date`是Huginn使用的Liquid模版引擎语法里内置的一个filter可以理解为有特定功能的函数
> 注意`{{ date | date: %F }}`里面,第一个`date`是上面的 Website Agent 产生的 Event 里面的变量名,第二个`date`是 Huginn 使用的 Liquid 模版引擎语法里内置的一个 filter可以理解为有特定功能的函数
@@ -283,33 +283,33 @@ Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like
## FAQ
* **为什么启动docker容器后访问Huginn显示网络错误**
* **为什么启动 docker 容器后访问 Huginn 显示网络错误?**
Huignn冷启动较慢需要等待三五分钟。如果还是不行检查端口映射和防火墙设置
Huignn 冷启动较慢,需要等待三五分钟。如果还是不行,检查端口映射和防火墙设置
* **为什么抓取到的包含相对路径的结果网页上可以点击访问但是生成的RSS不能正常使用**
* **为什么抓取到的包含相对路径的结果,网页上可以点击访问,但是生成的 RSS 不能正常使用?**
检查link的设置有些网站只是域名有些网站有子目录具体查看该网页源码中head节点里base url的设置
检查 link 的设置,有些网站只是域名,有些网站有子目录,具体查看该网页源码中 head 节点里 base url 的设置
* **如何对爬取到的某一项的字符串做更高级更复杂的处理?**
可以参考[Hugnn官方对Liquid语法的文档](https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid)以及[Shopify官方关于Liquid模板的语法文档](https://shopify.dev/api/liquid)
可以参考[Hugnn 官方对 Liquid 语法的文档](https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid)以及[Shopify 官方关于 Liquid 模板的语法文档](https://shopify.dev/api/liquid)
* **为什么部署了Huginn等了很长时间都无法访问后台页面**
* **为什么部署了 Huginn等了很长时间都无法访问后台页面**
若部署后某个应用一直无法通过浏览器访问请检查是否绑定到了6000/6666等特殊端口浏览器会拦截对这些端口的访问参见[这里](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)
若部署后某个应用一直无法通过浏览器访问,请检查是否绑定到了 6000/6666 等特殊端口,浏览器会拦截对这些端口的访问参见[这里](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)
* **Huginn 爬虫访问目标网站被拦截了怎么解决**
介绍几个基本的反反爬虫策略:
1. 带上User Agent要求是真实的浏览器UA。
2. Browserless去掉默认会和请求一起发送的可以被识别为爬虫的特征参数设置browserless的环境变量`DEFAULT_HEADLESS=false`
3. 使用随机代理IP适用于因爬取频率达到爬虫阈值
1. 带上 User Agent要求是真实的浏览器 UA。
2. Browserless 去掉默认会和请求一起发送的可以被识别为爬虫的特征参数,设置 browserless 的环境变量`DEFAULT_HEADLESS=false`
3. 使用随机代理 IP适用于因爬取频率达到爬虫阈值
## 扩展阅读
* [Huginn官方文档](https://github.com/huginn/huginn/wiki/)
* [Liquid模板引擎语法官方文档](https://shopify.dev/api/liquid/filters/)
* [RSS Man X部署指南](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/)
* [Huginn 官方文档](https://github.com/huginn/huginn/wiki/)
* [Liquid 模板引擎语法官方文档](https://shopify.dev/api/liquid/filters/)
* [RSS Man X 部署指南](https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/)
* [docker compose 的错误使用姿势](https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/)