解决方案:Excel催化剂开源第41波-网抓网络采集类库及工具分享
优采云 发布时间: 2022-11-23 12:16解决方案:Excel催化剂开源第41波-网抓网络采集类库及工具分享
这个类库是我开始学习C#和在C#上学习网络爬虫的第一个类库。现在可能已经迭代了很多版本。网站在这里。如果你有兴趣,你可以了解更多。
它的网站上有详细的使用教程,也是基于原生的HttpRequest,但是使用起来比原生简单很多。因为作者懒得用,所以一直没用过HttpRequest。
同样的,现在用的时候,都是用的是我在学习nuget打包的时候上传到nuget的一个版本。有兴趣的也可以直接从nuget获取,和苏飞的一模一样,哈哈。
可以直接从Nuget获取打包好的速飞版httphelper
安息
也是一个强大的第三方类库。笔者接触到了这个类库。调用WebAPI接口非常方便。在SM.MS图床调用上也有简单介绍。它在github上是开源的,有很多star和文档。超详细的类库,值得学习。
Github 上的 RestSharp
HtmlAgilityPack 类库
这种类型的库对于解释 html 页面特别有用。类似于python的Beautifulsoup4,可以将网页的html格式转换成xml格式,使用xml查询语言xpath结构化的访问网页内容。对于非WebAPI返回的json,xml数据结构的网页特别好用。
所以不要总觉得web抓包python更方便。在.Net世界中,对于一些普通的小型网页抓取,它比python好用多了。
和xml文件一样,在.Net中,可以使用linq to xml来访问,也非常简单易用。相对来说,python这种所谓的流行语言,可能没有可比性。
Excel催化剂文件下载功能
最后,老规矩,附上真正完整的Excel催化剂代码,这段代码是一个文件下载功能,简单的使用WebClient类库实现,封装一下,加上超时功能,同时使用异步方法调用时间,而不会卡在界面上。
private async void btnOK_Click(object sender, EventArgs e)
{
var markColor = Utilities.RangeUtility.GetMarkColorToDstRange(srcDataValues);
int totalNum = srcDataValues.Count();
int iLoop = 0;
int rowOffset = int.Parse(this.cmbRowOffset.Text);
int colOffset = int.Parse(this.cmbColOffset.Text);
foreach (var item in srcDataValues)
{
iLoop++;
string srcFilePath = item.Value2.ToString();
<p>
" />
string dstFilePath;
Excel.Range dstItemRange = item.Offset[rowOffset, colOffset];
if (dstItemRange.Value2 != null)
{
dstFilePath = dstItemRange.Value2.ToString();
//没有后缀名时,标红颜色返回让用户自行检查
if (string.IsNullOrEmpty(Path.GetExtension(dstFilePath)))
{
item.Interior.Color = ColorTranslator.ToOle(markColor);
dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor);
}
else
{
WebClientEx webClient = new WebClientEx(3000);
Uri uri = new Uri(srcFilePath);
await webClient.DownloadFileTaskAsync(uri, dstFilePath);
//线程间操作无效: 从不是创建控件的线程访问它。 处理方法
Action action = (i, n, s) =>
{
this.lblDownLoadInfo.Text = $"正在下载的是第【{i}】/【{n}】个文件\r\n文件名为:{s}";
};
Invoke(action,iLoop, totalNum, dstFilePath);
if (this.IsCreateHyperLink)
{
dstItemRange.Hyperlinks.Add(Anchor: dstItemRange, Address: dstFilePath, TextToDisplay: dstFilePath);
" />
}
}
}
else//当目标单元格没有值时,标红颜色返回让用户自行检查
{
item.Interior.Color = ColorTranslator.ToOle(markColor);
dstItemRange.Interior.Color = ColorTranslator.ToOle(markColor);
}
}
MessageBox.Show("下载完成!");
Action actionColseForm = () => { this.Close(); };
Invoke(actionColseForm);
}
</p>
您真的希望从头开始编写网络抓取程序吗?
大部分业余开发者,或者还不是开发者,都想学两招,尤其是python虚拟火遍大江南北的时候,好像跟不上时代了,然后就被轰动。数据时代,大家都需要知道如何使用web scraping,所以来某某python培训班。学完之后可以自己做一个网页抓取程序,抓取自己想要的数据。
但是作者恰恰相反。虽然我已经掌握了简单的网页抓取,但我一直没有自信自己能学够自己写一个程序爬取到我想要的数据。
网络爬虫和反爬虫是善恶的战场。笔者在2011年前后玩过VBA爬虫,跟现在流行爬虫的环境不一样。普通爬虫无计可施。也就是说,参加那些培训班出来的,只能是呵呵了。
无利益关系推荐一款良心爬虫工具
笔者以前也玩过爬虫工具,比如优采云
、优采云
浏览器、优采云
、代码栈等,在其中“浪费”了很多学习时间(在前公司购买的有些产品已经过期不能用了,当然也有的现在已经永久离职不能用了)。
而这块免费的鸡肋功能,一路指向了收费的中国市场。有一个工具。作者潜心开发、维护、文档编写、视频制作等,终于真正免费提供给大家使用。它真的就像一个 Excel 催化剂。有情怀,一定要点赞作者,支持作者。
工具名称:hawk,从百度和github获取工具安装包和教程资料。
结语
上面说了这么多,希望这篇文章真的能给想学习在线抓包的朋友一些指导,尤其是想在VSTO上实现在线抓包的小伙伴们,还是醒醒吧,不再收智商税,选择一个使用现成的工具作为起点,站在巨人的肩膀上使用网络。
解决方案:Uber推出Databook平台:自动收集元数据并转化为大数据洞见
自 2016 年以来,Uber 在平台上增加了几项新业务,包括 Uber Eats、Uber Freight 和 Jump Bikes。现在,优步平台每天发生1500万笔交易,月活跃用户超过7500万。在过去的八年里,优步从一家小型初创公司发展成为在全球拥有 18,000 名员工的巨头。
随着业务的增长,数据系统和工程架构的复杂性也在增加。我们的分析引擎中存在数万个表,包括 Hive、Presto 和 Vertica。由于数据如此分散,我们必须对可用信息有一个全面的了解,尤其是当我们不断添加新的业务数据和员工时。2015 年,Uber 开始使用大量手动维护的静态 HTML 文件对这些数据表进行编目。
随着公司的发展,我们需要更新的表数量和相关元数据的数量也会增加。为了确保我们的数据分析能够跟上公司的发展步伐,我们需要一种更简单、更快捷的方式来更新这些信息。鉴于这种规模和增长速度,拥有一个强大的系统来发现数据集及其相关元数据已变得势在必行。
图1
为了更容易发现和探索数据集,我们开发了 Databook。Databook 可用于管理和呈现 Uber 数据集的元数据,使 Uber 员工能够在 Uber 探索、发现并有效地使用这些数据。Databook 可以保证数据的数据上下文(含义、质量等)对成千上万试图分析它们的人来说是有意义的。简而言之,Databook 元数据使 Uber 的工程师、数据科学家和运营团队能够从查看原创
数据转变为掌握可操作的信息。
借助 Databook,我们从手动更新过渡到利用高级自动化元数据存储来采集
各种经常刷新的元数据。数据本具有以下特点:
Databook 提供来自 Hive、Vertica、MySQL、Postgres、Cassandra 和其他几个内部存储系统的各种元数据,包括:表模式、表/列描述、样本数据、统计信息、Lineage、表新鲜度、SLA 和所有者、个人数据分类.
可以通过集中式 UI 和 RESTful API 访问所有元数据。Databook UI 为用户提供了一种访问元数据的便捷方式,而 Restful API 则为 Uber 的其他服务和用例提供支持。
虽然已经有 LinkedIn WhereHows 等开源解决方案,但 Uber 在开发 Databook 时并未支持 Play Framework 和 Gradle。WhereHows 缺乏对跨数据中心读写的支持,这对我们来说至关重要。因此,我们开始构建自己的内部解决方案并使用 Java 进行开发,以利用 Java 的内置功能和成熟的生态系统。
接下来,我们将分享我们如何创建 Databook 以及我们在此过程中遇到的挑战。
数据手册架构
Databook的架构可以分为三个部分:如何采集
元数据,如何存储元数据,如何展示元数据。下图描绘了Databook的整体架构:
图 2
Databook 将多个来源作为输入,存储相关元数据,并通过 RESTful API 输出此信息。Databook UI 也使用这些 API。
在设计 Databook 之初,我们不得不做出一个重大决定:存储采集
到的元数据还是按需获取?我们的服务需要支持高吞吐量和低延迟的读取,如果我们将操作委托给元数据源,所有的源都需要支持高吞吐量和低延迟的读取,这会带来更大的复杂性和更高的风险。例如,用于获取表模式的 Vertica 查询通常需要几秒钟,因此不适合可视化。同样,我们的 Hive Metastore 管理所有 Hive 元数据,让它支持高吞吐量读取是有风险的。Databook 可以支持许多不同来源的元数据,因此我们决定将元数据保留在 Databook 中。此外,虽然大多数用例需要新的元数据,但它们不需要对元数据更改的实时可见性,因此我们可以进行计划的抓取。
我们还将请求服务层和数据采集层分开,每一层都运行在一个单独的进程中,如下图所示:
" />
图 3
这样两层就被隔离了,减少了附带影响。例如,数据采集
爬虫作业可能会使用更多的系统资源,从而影响请求服务层 API 的 SLA。此外,数据采集
层对中断的敏感度低于 Databook 的请求服务层,并且如果数据采集
层出现故障,仍然可以提供过时的元数据,从而最大限度地减少对用户的影响。
基于事件的采集
与计划采集
我们的下一个挑战是决定如何最好地从多个不同的数据源采集
元数据。我们考虑了几种选择,包括:创建分布式容错框架并利用事件流来近乎实时地检测和调试问题。
我们首先创建了一个爬虫,它定期从各种数据源和微服务中采集
信息,这些数据生成有关数据集的元数据信息,例如开源工具 Queryparser 生成的数据表的使用统计信息。(有趣的是,Queryparser 是由 Uber 的 Data Knowledge Platform 团队开发的)。
我们需要在不阻塞其他爬虫任务的情况下,以可扩展的方式频繁采集
元数据信息。为此,我们将爬虫部署在不同的计算机上,需要协调这些分布式爬虫。我们使用了 Quartz 的分布式模式(由 MySQL 支持)。然而,有两个问题阻碍了该方案的实施:首先,在多台机器上以集群模式运行Quartz需要定期同步Quartz时钟,从而增加了外部依赖。其次,调度器启动后,MySQL连接持续不稳定。最后,我们决定不使用Quartz的集群模式。
但是,我们继续使用 Quartz 进行内存中调度,以便更轻松、更高效地将任务发布到任务队列。我们使用 Uber 的开源任务执行框架 Cherami 来处理任务队列。这个开源工具可用于解耦分布式系统中的消费者应用程序,允许它们以异步方式跨多个消费者组进行通信。通过Cherami,我们可以将爬虫打包到Docker容器中,部署到不同的主机和多个数据中心。借助 Cherami,我们可以从许多不同的来源采集
各种元数据,而不会阻塞任何任务,同时将 CPU 和内存消耗保持在理想水平。
尽管我们的爬虫可以爬取大多数元数据类型,但有时需要近乎实时地捕获一些元数据,因此我们决定过渡到使用基于事件的架构(Kafka)。有了这个,我们能够立即检测和调试数据中断。我们的系统还可以捕获关键的元数据变化,例如数据集沿袭和新鲜度,如下图所示:
图 4
这种架构允许我们的系统以编程方式触发其他微服务,并近乎实时地启动与数据消费者的通信。我们仍然使用爬虫来完成一些其他的任务,比如采集
(或刷新)样本数据,限制目标资源请求,以及一些不需要采集
的元数据(一些事件发生时会自动触发其他系统,比如数据集使用情况统计)。
除了近乎实时地轮询和采集
元数据外,Databook UI 还从数据集消费者和生产者那里采集
语义信息,例如表和列的描述。
我们如何存储元数据
在优步,我们的大部分管道都在多个集群上运行以进行故障转移。因此,同一个表的某些类型的元数据(例如延迟和使用统计信息)的值可能因集群而异,并且它们是集群特定的。相反,来自用户的元数据与集群无关:同一张表的描述和所有权信息对于所有集群都是相同的。为了正确链接这两类元数据,例如将列描述与所有集群数据表的列相关联,可以采取两种方式:写时链接或读时链接。
写入时链接
在关联特定于集群的元数据和独立于集群的元数据时,最直接的策略是在写入期间将元数据链接在一起。例如,当用户向给定的表列添加列描述时,我们将信息保存到所有集群的表中,如下图所示:
图 5
此方法确保持久数据处于干净状态。比如上图中,如果“Column 1”不存在,就会拒绝该请求。但是这有一个问题:要在写入期间将独立于集群的元数据链接到特定于集群的元数据,所有特定于集群的元数据都必须存在,而且只有一次机会。比如触发图4的描述时,只有集群1有“column 1”,所以写入集群2失败。后来,更新了集群 2 中同一张表的架构,但没有机会链接元数据,除非我们进行定时重试,否则此描述将永远不可用,从而使系统进一步复杂化。下图描述了这种情况:
" />
图 6
阅读期间的链接
另一种方法是在读取期间链接独立于集群和特定于集群的元数据。这种方法解决了写入期间缺少链接元数据的问题,因为只要特定于集群的元数据存在,两种类型的元数据都可以在读取期间链接。架构更新后,“列 1”会在用户阅读时出现并合并,如下图所示:
图 7
存储选项
MySQL 最初用于为 Databook 的后端提供动力,因为它的开发速度快,并且能够通过 Uber 的基础设施门户自动配置。但是,当涉及多个数据中心时,共享 MySQL 集群效果不佳,原因有以下三个:
由于这些原因,我们使用 Cassandra 而不是 MySQL,因为它提供了强大的 XDC 复制支持,并且可以从多个数据中心写入数据而延迟增加很少。Cassandra 可线性扩展以适应 Uber 不断增长的数据量。
我们如何提供数据
Databook 提供了两种访问元数据的方式:RESTful API 和 UI 控制台。Databook 的 RESTful API 由 Dropwizard 提供支持,Dropwizard 是一个用于开发高性能 RESTful Web 服务的 Java 框架,可以部署在多台机器上,并通过 Uber 的内部请求转发服务进行负载平衡。
在 Uber,大多数服务都以编程方式访问 Databook 数据。例如,我们的查询解析/重写服务依赖于 Databook 的表模式信息。该 API 可以支持高吞吐量读取并支持水平扩展,峰值约为每秒 1,500 次查询。使用 React.js、Redux 和 D3.js 开发的 UI 控制台供全公司的工程师、数据科学家、数据分析师和运营团队使用,以诊断数据质量问题并识别和探索相关数据集。
搜索
搜索是 Databook UI 的一项重要功能,允许用户轻松访问和浏览表元数据。我们使用 Elasticsearch 作为一个完全索引的搜索引擎,Elasticsearch 将从 Cassandra 同步数据。用户可以使用Databook进行跨维度的搜索,如name、owner、column、nested columns,如下图所示,可以更及时准确的进行数据分析:
图 8
数据手册的下一章
借助 Databook,Uber 的元数据比以往任何时候都更具可操作性和实用性,但我们仍在努力通过构建更强大的功能来扩大我们的影响范围。我们希望添加的功能包括利用机器学习模型生成数据洞察力以及创建高级问题检测、预防和缓解机制。
英文原文:
如果你喜欢这篇文章,或者想看到更多类似的优质报道,记得给我留言点赞哦!