跳到主要内容

实战爬虫:如何利用 Webspot 实现自动提取列表页

· 阅读需 6 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

利用爬虫程序抓取列表页是网络数据提取中非常常见的任务之一。对于爬虫工程师来说,如何高效的生成提取规则是非常有必要的,否则就会浪费很多时间在编写爬虫程序 CSS 选择器或 XPath。本文将用一个实际例子来展示如何使用开源工具 Webspot 来实现自动提取列表页。

Webspot

Webspot 是一个旨在自动化网页数据提取的开源项目,目前支持列表页及分页的识别和抓取规则提取,此外还提供了 Web UI 界面让用户可以可视化的查看识别出来的结果,还可以让开发人员利用 API 获取识别结果。

Webspot 安装非常简单,可以参考官方文档中的安装教程,利用 Docker 和 Docker Compose 进行安装。

# clone git repo
git clone https://github.com/crawlab-team/webspot

# start docker containers
docker-compose up -d

浅谈算法:关于智能爬虫的探索

· 阅读需 8 分钟
马老师 Marvin
软件工程师 & 开源爱好者

浅谈算法:关于智能爬虫的探索

引子

如果当初让我去问顾客他们想要什么,他们肯定会告诉我:“一匹更快的马。” -- 亨利·福特

如今是人工智能大红大紫的时代,不管是 ChatGPT 还是随之而来的各种智能应用,让许多人看到即将到来的在几年前几乎不可想象的科幻世界。不过,在爬虫领域,人工智能似乎还没有过多涉及。诚然,爬虫作为一项“古老”的技术,在过去 20 多年缔造了搜索引擎、新闻聚合、数据分析等多而又多的技术行业,不过在如今还暂时没有看到明显的技术突破:爬虫工程师还是主要依赖于 XPath、逆向等技术来自动获取网络数据。不过,随着人工智能和机器学习的发展,爬虫技术理论上也可以做到“自动驾驶”。本篇文章,将从多个维度介绍所谓智能爬虫(智能化、自动化数据提取爬虫技术)的现状以及可能的未来发展方向。

爬虫技术现状

爬虫程序是一种自动化的程序,用于从互联网或其他计算机网络上获取数据。它们通常使用自动化数据抓取技术来自动访问网站,并收集、解析和存储网站上的信息。这些信息可以是结构化或非结构化数据。

传统意义上的爬虫技术主要包括以下模块或系统:

  1. 网络请求:对网站或网页发起 HTTP 请求,获取 HTML 等数据;
  2. 网页解析:对 HTML 进行解析,形成结构化的树形结构,并通过 XPath 或 CSS Selector 获取目标数据;
  3. 数据储存:将解析后的结构化数据进行存储,可以是数据库,也可以是文件形式;
  4. URL 管理:负责管理待抓取的URL列表和已经抓取的URL列表,例如分页或列表页的 URL 解析和请求。

爬虫系统 (3)

以上都是基础的爬虫技术模块,对于大型爬虫系统来说,还需要具备任务调度、错误管理、日志管理等生产环境必要模块。笔者的爬虫管理平台 Crawlab 就是用于企业级生产环境爬虫管理平台。另外,针对一些反爬措施,例如验证码或 IP 封锁,通常还需要额外模块,例如验证码识别、IP 代理等。

然而,目前爬虫程序的开发主要集中在网页解析上,这也是非常消耗人力的地方。虽然 HTML 需要解析网页数据,但是不同网站的网页布局、排版、风格、内容各不相同,导致每个网站、网页都需要单独编写解析逻辑,从而大大增加了人工编写成本。虽然一些通用爬虫例如搜索引擎爬虫可以不用编写过多解析逻辑,但这样的爬虫通常都无法聚焦于某些特定的主题数据提取。因此,为了降低人工编写成本,最好是不需要编写或少量编写解析逻辑就可以自动提取网页数据,这也就是智能爬虫的主要目标。

浅谈理论:为什么图论是当今各行各业必备的知识?

· 阅读需 6 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

“若无必要,勿增实体”--奥卡姆剃刀原理

图论(Graph Theory)是被大众严重低估的数学基础理论。它不是研究图像、图片、图表之类的理论,而是一个抽象而简单的数学理论。图论中的**图 **(Graph)是一个抽象概念,非常类似于关系网络(Relationship Network),有对应的 **节点 **(Node)或顶点(Vertext),节点之间又有关联关系或 (Edge)。图论的概念非常简单,就是图、节点、边。本篇文章将简单的介绍一下图论的基础概念,以及图论在真实世界中的应用。(注意!本文不是科学论文,所以不会有枯燥的数学公式,请放心食用)

graph

图论简述

在图论中,有三个重要的概念:

  1. 节点(Node):可以理解为某个实体,例如关系网络中的张三、李四、王五;
  2. (Edge):可以理解为实体间的关系,例如,张三和李四是夫妻,王五是他们儿子;
  3. (Graph):可以理解为所有节点、边的集合,例如张三、李四、王五组成的幸福一家。

从上面的三个基本概念,我们可以推断出节点之间的关系,例如李四的大哥李一,就是王五的舅舅,王五也是他的侄子。

实战数据分析: 利用开源项目 Superset 搭建自助数据分析平台

· 阅读需 7 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

数据分析(Data Analytics)以及商业智能(Business Intelligence)是很多企业实现数字化战略的重要业务模块。我们之前在《浅谈数据:数据领域需要掌握些什么?》中介绍过数据领域中不可获取的部分,也就是架构流程方面的软件工具辅助服务。本文将介绍的数据分析开源平台 Apache Superset 就能提供这样的服务。本文将简单介绍如何安装部署以及使用 Superset。

Superset Official Site

Superset 简介

Superset 是 Apache 基金会孵化的开源自助数据分析平台,可以看成开源版的 Power BITableau,不过 Superset 的交互界面仅限于 Web。整个系统基于 Python Flask,集成了 MySQL、Postgres、SQL Server 等主流关系性数据库,以及 ElasticSearch、ClickHouse、Snowflake 等现代数据库。前端可视化分析界面跟 Power BI 和 Tableau 非常类似,操作也相对简便。因此,如果需要搭建一个类似 Power BI 或 Tableau 这样的企业级数据分析平台,在不氪金的情况下,Superset 是个非常不错的选择。

Superset Dashboard

浅谈架构:为什么需要在软件项目中考虑复杂度?

· 阅读需 8 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

复杂度是软件工程中永恒的挑战。随着项目规模的增长,复杂度会以指数级的速度增加,如果不加以控制,最终会导致项目的失败。

在软件开发的世界里,复杂度无处不在。从简单的"Hello World"程序到大型分布式系统,复杂度始终伴随着我们的开发过程。作为软件架构师和技术负责人,理解复杂度的本质、来源以及如何管理复杂度,是我们必须掌握的核心技能。

浅谈架构:除了画架构图,架构师还需要些什么?

· 阅读需 6 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

"架构就是处理一些重要事情,不过鬼知道那是些什么。" -- Ralph Johnson

架构师(Architect)应该是一个很有份量而又饱受尊敬的职位。每当听到某某是某公司的架构师时,会不会有一种肃然起敬的感觉?在大众看来,架构师通常跟系统设计、技术实力、领导力、影响力有着密切联系。也正是这个原因,企业中很多架构师的岗位都是由经验丰富、技术能力扎实的资深软件工程师担任。然而,软件行业对于架构师的**定义 **,其实并 不明确:亚马逊、阿里云之类的云服务商有自己的架构师团队,不过大多是顶着架构师的名头进行客户售后服务而已;在某企业里的架构师,无外乎就是利用自己的丰富经验和过硬实力,来解决技术难题,相当于资深软件工程师。这些都跟我们心目中的设计高大上架构图的、无所不知的架构师,有很大差别。

本文中所指代的架构师相关概念,主要来自于最近阅读的一本书《软件架构基础》(英文名:Fundamentals of Software Architecture,作者 Mark Richards、Neal Ford)。本篇文章会简单介绍更具实用意义上的架构师需要做什么,以及相关的 必备技能

Go 语言项目源码解析:定时任务库 cron

· 阅读需 6 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

GitHub 上有很多优秀的开源项目,代码都是透明可见的,每个人只要有账号就可以下载来查看。而我们作为软件开发者来说也可以从中学习到很多知识,以及体会如何正确的工程化、单元测试、统一代码风格等,甚至从源码中找到问题,并提出 Pull Request 来贡献开源社区。今天这篇文章将解析 Go 语言开源项目 robfig/cron源码,这个项目不大,知名度较高,注释也比较清楚,很适合新手学习如何阅读和解析源码。

环境准备

首先我们将源码克隆(Fork)为自己的个人仓库,只需要在 GitHub 项目主页点击 Fork 按钮,然后输入项目名称点击确认即可。克隆完毕后,可以下载到本地,或者直接在科隆后的 GitHub 仓库主页上点击 Create codespace on master 来创建 Codespace。Codespace 是 GitHub 推出的基于 Azure 云服务的远程编程功能,现在对个人账号开放了,可以试一下。

Create Codespace

点击后,浏览器中会打开一个新页面,并会出现在线 VS Code 的界面,然后显示该项目的目录、代码以及终端,如下图。

浅谈数据:聊一聊数据分析中的一些基础统计学知识

· 阅读需 5 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

“所有模型都是错的,但有些很有用。”--George Box

数据分析对于很多人来说既熟悉又陌生。数据小白们觉得各种五颜六色的图表仪表盘看起来很酷炫,运营管理者们认为统计数字和时间趋势图可以帮助他们做业务决策,程序员们认为数据分析无非就是从数据库中将目标字段的数据按照一定要求捞取出来。这些看法都没错,但真正有用的数据分析,除了将数字呈现出来,还将发现的数据洞见与业务充分结合起来,实际为业务创造价值才有意义。了解一些基础统计学知识,很可能会对发现洞见有帮助。

平均值并不可靠

我们经常可以看到很多数据报表中会呈现出按照每天、每周、每月的平均数,例如当月每日平均销售额、去年每月平均访问次数,等等。平均值统计对某些特定的情况会有所帮助,例如每天起床的时间、瞄中射击靶心的偏移量。但更多的时候,你很可能会对平均值产生怀疑,因为平均数很多时候会上下波动,而且波动幅度还会很大。这里的根本原因来自于真实世界中的非线性分布(Non-Linear Distribution)。对于网站的响应时间、网页访问次数、股票走势的分布,都属于非线性分布。在这些非线性分布中,平均值就失效了,因为有大量的 **异常值 **(Outlier)让平均值产生了严重 偏离(Skewed)。就像下图一样,对于自然分布(Normal Distribution)或高斯分布(Gaussian Distribution)来说,它是线性分布(Linear Distribution)的,因此平均值在其分布的正中间的峰值位置;但对于 Gamma 分布来说,因为它是一个非线性分布,其平均值严重偏离其峰值,而且当离群值越来越多,其平均值会进一步偏离其中心位置。

Gaussian and Gamma Distributions

因此对于这些非线性分布来说,平均值就不是一个合理的判断指标,而咱们可以采用中位数(Medium)来表示其大致的中心位置。咱们有很多种处理这种非线形分布的工具,其中一种就是 箱线图(Box Plot)。如下图,两个分布被抽象为了一个箱和几条线,其中箱中心线就是中位数,而边缘是四分之一和四分之三分位线。这样不需要做过多复杂的分析就可以在一张图上一目了然的看出大致的分布情况。

浅谈数据:为什么数据治理在企业数字化转型中扮演重要角色?

· 阅读需 5 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

“生命是靠负熵来维持的。”--《何为生命》埃尔温·薛定谔

在如今的互联网时代,数据是企业重要的资产。我们无时无刻不在产生数据:每一次打开手机应用,每一次网购下单,甚至每一次驾车穿过红绿灯,都会产生数据。数据无处不在。在企业中也更是如此。如此之多的原始数据,加上日渐成熟的数据分析技术,让企业家们大为兴奋,因为这就是企业堆积如山的金矿啊。然而,事情并没有想象中的这么简单,要从这些杂乱无章的酷似垃圾堆的所谓 “金矿” 中提取有价值的宝贝,并不容易。笔者之前的文章《浅谈数据:数据领域需要掌握些什么?》也稍微提到了数据治理(Data Governance)这个概念。本篇文章将从企业数据管理的角度,介绍数据治理是如何在混乱的企业数据中创造价值的。

数据孤岛问题

中大型企业(一般超过 100 人,且有多个职能部门)在快速发展业务的同时,也会遭遇管理混乱的问题。销售部门有着自己的销售统计数据,通常是庞大而分散的 Excel 或者简单的在线表单;IT 部门自己建立且管理一套资产和库存系统;HR 部门又维护着一整个人员统计名单。而这样的情况会导致不少头疼的事情:大老板抱怨每周才能收到整个公司运营的管理报表;经理们看着报表中忽上忽下的数据,怀疑着真实性;基层员工加班加点整理好老板要的数据,却被质疑数据有问题。熟悉么?这些都是企业中经常发生的问题,其直接原因就是所谓的数据孤岛(Isolated Data Island)问题。

Isolated Data Island

实战 Go:如何实现一个简单分布式系统

· 阅读需 9 分钟
马老师 Marvin
软件工程师 & 开源爱好者

引子

如今很多云原生系统、分布式系统,例如 Kubernetes,都是用 Go 语言写的,这是因为 Go 语言天然支持异步编程,而且静态语言能保证应用系统的稳定性。笔者的开源项目 Crawlab 作为爬虫管理平台,也应用到了分布式系统。本篇文章将介绍如何用 Go 语言编写一个简单的分布式系统。

思路

在开始写代码之前,我们先思考一下需要实现些什么。

  • 主节点(Master Node):中控系统,相当于军队中的指挥官,派发任务命令
  • 工作节点(Worker Node):执行者,相当于军队中的士兵,执行任务

除了上面的概念以外,我们需要实现一些简单功能。