TowardsDataScience 博客中文翻译 2020(四百九十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何对无用的数据科学项目说不,并开始从事你想要的工作

原文:https://towardsdatascience.com/how-to-say-no-to-projects-d6f88641ab3c?source=collection_archive---------34-----------------------

如何对无意义的忙碌说不并开始做你想做的事情的 5 个技巧:创新和增值的数据科学项目。

应利益相关者的要求,数据科学家和分析师开始用大部分无附加值的工作来溢出他们的杯子。许多人没有勇气或信心对此说“不”。这也适用于其他垂直行业和职业中的许多工作和商业专业人士。简而言之,你需要建立自信,不再懦弱,开始对无意义的工作说“不”。

数据科学家可以成为公司的新决策者,应该选择自己的增值项目

当公司雇佣数据科学团队时,该团队的客户通常是非技术利益相关者。他们对自己想从数据科学中获得什么有一个大致的想法,但他们不知道自己具体想要什么。大多数时候,业务部门认为“数据科学和分析”只是运行报告并在需要时获取数据的团队(像狗或猴子一样)。数据科学和分析团队的核心职责不是在 Tableau 和 PowerBI 中构建报告;这是商业智能团队的工作(奇怪的是,许多商业智能专业人士已经开始自称为分析师或数据科学家)。数据科学家的工作基本上是:

  • 综合和挖掘数据,从中创建可行的业务建议
  • 使用统计、机器学习和人工智能模型自动化决策
  • 为最终用户创建数据科学产品和工具(我们在 Remix Institute 喜欢称之为 Prefab AI 或 AI Augs——类似于 Deux Ex 视频游戏系列)。RemixAutoML这样的开源工具就是例子。
  • 通过寻找收入增长、成本节约、运营效率和业务流程优化的机会来提高利润

如果业务部门的利益相关方让您的数据科学团队从事列表上没有的任何工作,或者不提供价值或增长的任何工作,那么您不应该从事这些工作。数据科学团队应该根据利益相关者的反馈和痛点挑选自己的项目。数据科学不是 IT 或 BI,不应构建报告或处理票证请求。(下面有更多相关信息)

非增值工作不断堆积的原因

许多数据科学家和非技术利益相关者没有意识到规划谬误。计划谬误是一种心理现象,它表明我们对完成一项任务需要多少时间的预测过于乐观,而低估了实际需要的时间。由于我们很难估计事情需要多长时间,这意味着我们对项目说“是”的次数比我们应该说的要多,因为我们认为完成项目需要的时间更少。这导致我们变得捉襟见肘,精疲力竭,拼命寻找最稀缺和最有价值的资源之一:时间。对项目说“是”感觉很好,因为它可能会加强你和利益相关者之间的联系,但有时人们说“是”是因为害怕被认为是低效的、消极的、工作缓慢的和非团队成员。

拒绝和选择自己项目的 5 种方法

有很多实用的方法可以对非增值项目说不,同时仍然能够被理解为一个团队成员,并且能够选择你喜欢的项目。以下是 5 种实用的拒绝方式:

1。将霍夫施塔特定律确立为您的数据科学团队的指导运营原则之一。霍夫施塔特定律是一个递归公理,它表明所花费的时间总是比你预期的要长,即使你把霍夫施塔特定律考虑在内。作为一个简单的启发,你应该把完成一个项目的时间增加两倍或三倍。这是针对规划谬误的对策。

**2。礼貌地对项目请求说“不”,但是立场要坚定,不要做受气包。**业务利益相关者将来自许多部门,具有相互竞争的优先级和激励机制。当他们带着对他们来说“高度优先”的项目来找你时,对公司的整体业务目标来说,这可能不是高度优先或高增长潜力的项目。一封类似这样的邮件或信息是一种礼貌的拒绝方式

“你好,我们理解对这个项目的独特渴望,它看起来像一个有趣的商业问题。在审查了需求之后,我们估计了项目完成的时间。不幸的是,这不是我们团队目前能做的事情,因为我们目前正专注于其他高优先级的增长计划,但我们可以在未来进行规划讨论。如果你有这个项目的投资回报率分析,这将有助于我们把它放在队列的顶部。”

立场坚定很重要,因为很多时候利益相关者不喜欢接受否定的答案,他们会试图甜言蜜语,说服你为什么你真的应该参与他们的项目。听他们说完,但仍然礼貌地说不。

3。通过将所有项目放在一个选择图表上来区分它们的优先级。一个选择图表是一个精益六适马工具,由洛克希德·马丁公司开发,用于组织和优先化项目想法。PICK 代表可能,实现,挑战,杀死。以下是每一项的细目分类:

  • §可能。如果这个项目容易做,但回报低,可能会参与其中
  • (一)实施。如果这个项目容易做并且回报高,那就一定要去做,并优先考虑它
  • ©挑战。如果这个项目很难做但是回报很高就挑战它
  • (K)杀。杀死所有难做且低回报的项目并扔进垃圾桶

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择图表

最好的方法是选择关注左上角象限的 1 到 2 个关键项目。这种项目优先级排序就是我们在 Remix Institute 所说的“帕累托最优项目管理。

为此,你需要将项目优先级外包给你的经理,以获得政治掩护。当然,告诉他/她你认为应该优先考虑什么(左上象限),以便从事你想从事的项目。作为一名数据科学家,你应该建议优先考虑人工智能自动化或机器学习用例的项目,并降低分析和报告请求的优先级。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

帕累托最优项目管理

**4。推迟任何武断的截止日期。**大部分期限都只是凭空扯出来的,只是提供了不必要的压力。在过去,我看到过来自高级管理层的项目请求,附带一个任意的截止日期,过了一段时间没有听到项目的状态,高级管理层忘记了他们在第一时间分配它。在这种情况下,这个项目肯定是没有意义的无用功,没有最终期限。

这是关于高层管理的一个不为人知的事实:很多时候,他们只是故意把无用功分配给你。

然而,即使这是真的,你也不能告诉你的利益相关者。相反,你需要用一种政治上更容易接受的方式来表达这一点。类似这样的电子邮件或信息更适合推迟任意的截止日期:

“你好,我知道在截止日期前完成任务很重要。您能否将这一时间延长 X 天/周,因为我们目前正在进行高管们非常感兴趣的 PICK CHART 左上角的项目]。”

或者

“如果你想让 X 由 Y 完成,我可以给出 X 的 A 和 B,但不能给出 X 的 C 和 D。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开始做你想做的事情。创新和高投资回报率的项目。

5。将奥卡姆剃刀确立为你的机器学习模型开发的指导性操作原则之一。这个主题本身需要另一篇博文,但是奥卡姆剃刀(或简约原则)认为模型应该是最低限度的,最简单的模型是可能的最好模型。请记住,机器学习应该简化业务流程和自动化决策,因此制作一个具有大型代码库的庞然大物模型只意味着它是一艘敏捷性低、维护成本高的军舰。这意味着你要花费大量的空闲时间来维护它,这减少了你做其他事情的时间。你还应该向你的利益相关者介绍奥卡姆剃刀,这样他们也不会使机器学习模型开发过于复杂。

如上所述,简约原则是一个有趣的话题,它本身将是另一篇博文。最简单并不总是意味着最少的技术债务或最低的维护。有时候项目确实需要复杂性。这就是为什么确定规模合适的“最低要求”解决方案非常重要。如果在 Excel 中只需要一条趋势线,那么真的需要深度学习模型吗?

结论

只要首席管理人员开始看到他们对损益的影响,数据科学家就可以成为公司及其最有价值部门的新决策者。为了做到这一点,数据科学团队必须立场坚定,树立信心,并有效地优先处理高价值工作,同时降低优先级,甚至扼杀非增值工作。这包括学习有效项目管理的技巧,礼貌地对涉众说“不”。通过这样做,数据科学团队可以专注于高投资回报率、增加收入的项目,如可以集成到业务流程中的机器学习和自动化产品。这引起了最高管理层的注意,并提升了数据科学的地位。

本文原载于 RemixInstitute.com 的

如何在每个主要的云提供商上扩展 Python

原文:https://towardsdatascience.com/how-to-scale-python-on-every-major-cloud-provider-5e5df3e88274?source=collection_archive---------41-----------------------

使用 Python 进行云计算的最佳实践

皮雷恩创造者艾瑞克·乔纳斯、 的话说,“云太他妈硬了!”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

云中的 Python。

一旦你在笔记本电脑上开发了一个 Python 应用程序,并希望在云中扩展它(可能需要更多的数据或更多的 GPU),接下来的步骤就不清楚了,除非你有一个已经为你设置好的基础设施团队,“只使用 kubernetes”并不那么简单。

因此,您将选择 AWS、GCP 和 Azure 中的一个,并导航到管理控制台来筛选实例类型、安全组、现货价格、可用性区域、实例限制等等。一旦你解决了所有这些问题,并设法租了一些虚拟机,你仍然需要弄清楚如何在这些虚拟机上运行你的应用程序。我的 Python 脚本如何在一个 10 台机器的集群中准确地分配工作?此时,您可以尝试使用 PySparkmpi4pyCelery 来重写您的应用程序。

如果失败了,你将建立一个全新的分布式系统,就像优步和 Lyft 最近用 FiberFlyte 所做的那样。在这两种情况下,要么重写应用程序,要么构建新的分布式系统,或者两者兼而有之。这一切都是为了加速你在云中的 Python 脚本。

我们将介绍如何使用 Ray 在这些云提供商上启动集群和扩展 Python,只需几个命令。

这是图表。第一步是开发你的 Python 应用。这通常发生在您的笔记本电脑上,但是如果您愿意,也可以在云中进行。第二步是在你选择的云提供商上启动一个集群。第三步是在任何你想去的地方运行你的应用程序(你的笔记本电脑或者云端)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过三个步骤在任何云提供商上扩展您的 Python 应用程序。**第一步:**在本地开发你的应用程序(或者在云中,如果你愿意的话)。步骤 2: 在您选择的云提供商上启动集群。步骤 3: 在集群上运行您的应用程序!

设置

首先,安装一些 Python 依赖项。

**pip install -U ray \
               boto3 \
               azure-cli \
               azure-core \
               google-api-python-client**

接下来,为您选择的云提供商配置凭证。如果您已经设置为从命令行使用云提供商,则可以跳过这一步。

  • AWS: 按照boto 文档中的描述在~/.aws/credentials中配置您的凭证。
  • Azure:az login登录,然后用az account set -s <subscription_id>配置你的凭证。
  • GCP: 按照文档中的描述设置GOOGLE_APPLICATION_CREDENTIALS环境变量。

射线簇发射器使用了一个配置文件,看起来像这样

射线簇发射器一起使用的最小簇配置文件。

在这里,您可以指定所有内容,包括要运行的设置命令、要使用的实例类型、要 rsync 的文件、自动缩放策略等等。

获取一个稍微完整一点的示例,带有如下的附加可配置字段。

**# AWS**
wget [https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/dafd4c6bd26fe4599dc3c6b05e80789188b3e2e5/aws-config.yaml](https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/dafd4c6bd26fe4599dc3c6b05e80789188b3e2e5/aws-config.yaml)
**# Azure**
wget [https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/dafd4c6bd26fe4599dc3c6b05e80789188b3e2e5/azure-config.yaml](https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/dafd4c6bd26fe4599dc3c6b05e80789188b3e2e5/azure-config.yaml)
**# GCP**
wget [https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/1846cbf971d1cd708b3d29d9ae50ad882fbaac50/gcp-config.yaml](https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/1846cbf971d1cd708b3d29d9ae50ad882fbaac50/gcp-config.yaml)

您需要对上面的配置文件做一些小的修改:

  • 用合适的密钥文件替换~/.ssh/id_rsa~/.ssh/id_rsa.pub
  • GCP: 设置合适的project_id

步骤 1:创建一个 Python 应用程序

定义一个我们想要扩展的简单 Python 脚本。

一个简单的 Python 应用程序,可以在你的笔记本电脑或云中运行,并跟踪执行任务的机器的 IP 地址。这个脚本使用射线来并行化计算。

您可以如下运行这个示例(实际上是一个稍微完整的示例)。

**# Fetch the example.**
wget [https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/4313660c0bd40f8bd909f70c1e0abc4be8584198/script.py](https://gist.githubusercontent.com/robertnishihara/a9ce1d0d434cd52dd9b07eb57f4c3476/raw/4313660c0bd40f8bd909f70c1e0abc4be8584198/script.py)**# Run the script.**
python script.py

您将看到以下输出。

This cluster consists of
    1 nodes in total
    16.0 CPU resources in totalTasks executed
    10000 tasks on XXX.XXX.X.XXX

现在,在光线簇上运行相同的脚本。这些说明适用于 AWS。要使用 Azure 或 GCP,只需将两行中的aws-config.yaml替换为azure-config.yamlgcp-config.yaml

步骤 2:启动集群

**# AWS**
ray up -y aws-config.yaml
**# Azure**
ray up -y azure-config.yaml
**# GCP**
ray up -y gcp-config.yaml

步骤 3:在集群上运行脚本

**# AWS**
ray submit aws-config.yaml script.py
**# Azure**
ray submit azure-config.yaml script.py
**# GCP**
ray submit gcp-config.yaml script.py

您将看到以下输出。

This cluster consists of
    3 nodes in total
    6.0 CPU resources in totalTasks executed
    3561 tasks on XXX.XXX.X.XXX
    2685 tasks on XXX.XXX.X.XXX
    3754 tasks on XXX.XXX.X.XXX

如果它说只有一个节点,那么您可能需要多等一会儿,让其他节点启动。

在这种情况下,10,000 个任务在三台机器上运行。

您还可以连接到集群,使用以下命令之一进行探索。

**# Connect to the cluster (via ssh).# AWS**
ray attach aws-config.yaml
**# Azure**
ray attach azure-config.yaml
**# GCP**
ray attach gcp-config.yaml

关闭集群

完成后,不要忘记关闭集群!

**# AWS**
ray down -y aws-config.yaml
**# Azure**
ray down -y azure-config.yaml
**# GCP**
ray down -y gcp-config.yaml

进一步的细节

想要增加对新云提供商的支持吗?只需扩展 NodeProvider 类,这通常需要 200-300 行代码。看看 AWS 的实现。

原贴 此处

如何自信地扩展您的数据团队

原文:https://towardsdatascience.com/how-to-scale-your-data-team-with-confidence-ffcbfe00bbc3?source=collection_archive---------32-----------------------

提示:这需要一些复杂的算法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

供图 弗拉德 un splash

新冠肺炎迫使许多公司勒紧裤腰带,只投资最必要的功能——幸运的是, 数据往往是其中之一 。然而,数据团队的成功不仅仅取决于他们处理数据和构建预测模型的能力。

在过去的十年中,数据团队对于保持公司的竞争优势变得越来越重要,导致了更大的创新和更智能的决策。尽管这种指数级的崛起,然而,数据科学应用于工业 的概念直到 2000 年代初才出现。数据工程现在是许多数据驱动的技术公司不可或缺的一部分,甚至更晚才被纳入词典。

新冠肺炎让数据的影响更加明显。数据不仅对遏制致命病毒的传播至关重要,而且公司越来越依赖数据来更好地了解不断变化的客户趋势,并做出更明智的支出决策。

尽管 50%的数据分析组织 还没有调整他们的人员配备和招聘计划来应对疫情的经济影响,但初创公司已经被迫解雇了数万到数千名员工,其中许多是数据分析师、科学家和工程师。随着行业适应这种新常态,让您的数据团队为成功做好准备非常重要。

为了帮助你自信地扩展你的团队,我总结了四条简单的指导方针,让你的团队成为整个组织的力量倍增器:

定义团队的 1-2 项核心职责。相应地划分优先级。

与我交谈过的许多数据领导者都感到被落在他们肩上的各种责任所困扰。《哈佛商业评论》最近发表了一份报告,定义了 CDO 的七种不同工作,从“首席数据和分析官”和“数据管理者”到“数据企业家”和“数据伦理学家”做好一项工作已经够难的了——想象一下七项工作!

同样,麦肯锡 2018 年的一项研究表明,ROI 和数据分析之间的这种脱节是因为团队“难以从在少数成功用例中使用分析转向在整个企业中扩展分析,将其嵌入组织文化和日常决策中。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这位数据副总裁根据其 CEO 的 OKRs 为团队设定了明确的目标,从而能够利用数据科学释放真正的商业价值。图片由this is engineering raengonUnsplash

Rebel的高级数据科学家,一家专注于可持续和包容性交通的国际咨询公司,优步大学的前高级数据科学家,建议数据领导者在衡量数据科学如何使他们的公司受益时深入挖掘。

“从高层次考虑你公司的数据需求,”她说。“他们关心什么?他们需要更好地理解什么,什么数据会给他们这些见解?”

和 Amy 一样,我建议使用贵公司的最高优先级来确定如何最好地利用您团队的技能组合。根据公司的核心目标,坚持 1 到 2 个主要角色。如果您的公司使用 2020 年第三季度来决定向您的用户部署哪些新产品,也许您的 KPI 应该与生成更及时的客户行为分析相关联;如果你的 CEO 希望你在欧盟推出你的服务,一个关键的职责应该是将合规工作与 GDPR 的要求对应起来。

一旦这些目标被确定,并且被你的利益相关者和 CEO 签署,只要你对你的业务需求保持灵活性,就更容易证明你的团队的成长和花费是合理的。正如我们在过去几个月中所见证的那样,任何事情都可能在瞬间改变(或者我应该说,一个数据点)。

不要纠结于头衔。

鉴于“数据科学家”和“数据分析师”这两个术语相对较新,根据您所在的行业、公司甚至团队的不同,它们可能意味着许多事情,承认这种模糊性很重要。

事实上,根据 Figma 的数据科学主管 Annie Tran 的说法,直到 2000 年代末,LinkedIn 和其他大型科技公司才开始雇佣数据科学家来更好地了解他们平台上的用户行为。在加入优步成为他们产品部门的第一位数据分析师之前,Annie 在 Willis Towers Watson 和后来的 Zynga 担任数据分析师。

“当我被优步聘用时,我的角色是数据分析师,但其他人也是如此,”她说。“在我们的市场团队工作的一些数据科学家也是数据分析师。几个月后,他们把每个人的头衔都改成了数据科学家。”

您的数据团队看起来像什么(以及您使用什么头衔)将取决于您公司的规模和您使用的数据量。如果你是一家小公司,你可以雇佣一些数据通才,随着时间的推移,他们可以开始专攻不同的学科或领域。如果你正在一家 500 人的广告公司组建一个数据团队,你可能想从雇佣营销分析专家开始,这些专家可以使用他们花哨的 Marketo 仪表盘立即投入工作。

我的建议是:除非你知道自己真正在解决什么问题,以及数据如何对你的业务产生最大影响,否则不要聘用专家。考虑引进具有数据分析或数据工程专业知识的饥渴的部分堆栈通才,并随着需求的发展对他们进行专业化培训。你不会想把钱浪费在你不需要的东西上,结果只是错过了你的目标。

贪婪地交流和记录数据知识。

多年来,我采访过的几位数据领导者表示,他们在数据管道的长期可持续性(以及数据团队的成功)方面的头号障碍是缺乏文档。很多时候,团队依赖部落知识和过时的维基页面来记录他们的数据,这是不可扩展或不可持续的。

根据艾米·史密斯的说法,确保你的数据团队步调一致的最佳方式是通过知识共享,尽早且经常地共享。

“许多数据科学家的早期成功是通过加入一个愿意花必要的时间写下他们的知识的团队,”她说。“将团队的集体知识转化为新人可以阅读并快速掌握的形式非常重要。”

更具体地说,缺乏关于数据和元数据的可靠信息是团队的一个主要痛点,但这是可以解决的。使这些见解更容易获得的一些解决方案有:

  • 数据目录 :规模较小的团队(2-5 人)也许可以使用 Excel 电子表格,但是随着数据堆栈的成熟,可以考虑投资一个内部的、第三方的、甚至开源的解决方案。
  • 数据库管理系统(DBMS):DBMS 是一个软件应用程序或软件包,用于管理数据库中的数据,包括数据的格式、字段名称、记录结构和文件结构。虽然这不会在提供上下文方面取代数据目录,但它将帮助您组织数据以便于访问。
  • 数据建模工具 :数据建模工具赋予团队发现和可视化数据资产的能力。这些产品还可以帮助团队理解您的数据堆栈的各种元素之间的关系。
  • 数据可观测性解决方案 :只有你的数据可信,你的数据知识才重要。数据可观测性解决方案解决了许多与数据目录、DBMSs 和数据建模工具相同的问题,但是利用了一种基于软件工程最佳实践的更新的数据管理方法。它是指组织全面了解其系统中数据运行状况的能力,从而通过将 DevOps 可观察性的最佳实践应用于数据管道来消除数据停机。

此外,想要将知识转移和可访问性推进一步的团队可以提出用缺失的信息和其他上下文来构建他们的数据操作。为此,数据主管应该鼓励他们的分析师在发现数据时添加缺失的维度,而不仅仅是在需要时添加。你现在不用它并不意味着你或你的同事以后不会用它。

推动贵公司所有数据用户采用数据。

Annie Tran 指出,像 Figma 这样的许多公司都采取了数据第一的方法来构建他们的文化,让公司的每个人都可以使用他们的数据解决方案,并鼓励所有职能部门的员工探索相关的仪表板。

“在我们每周一次的全体会议上,有专门的时间来审查指标,”她说。“数据是我们文化中普遍存在的东西,每个人都有能力看到和接受。这种开放性增强了数据对我们运营的重要性。”

****然而,只有当您能够信任自己的数据时,您公司的数据解决方案才有用。除了促进数据向前发展的文化,让数据可访问、可信赖和自助服务对于让新团队成员更舒适地探索贵公司的数据生态系统至关重要。事实上,当数据可靠时,传统数据科学方法(统计分析、A/B 测试和模型训练等)的自动化可以释放出生产力、速度、可访问性和准确性的新水平,否则是无法实现的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2012 年,《哈佛商业评论》评选出“数据科学家”21 世纪最性感的工作 。自动化可以让他们的工作更加性感。图片由 斯蒂芬道森 Unsplash**

根据 Eli Brumbaugh 的说法, Airbnb 的数据设计负责人和该公司data portal数据目录的共同创建者,当谈到让数据用户成功时,最重要的事情之一是确保他们的数据是准确和相关的。

“提高用户的信心,让他们相信他们已经找到了正确的信息或数据来采取行动,这是至关重要的,”他说。“我们需要确保驱动我们业务决策的数据是可信的,并且我们知道这些数据是否可以应用于给定的用例。”

处理数据管理解决方案有多种方法,包括数据目录、数据可靠性、合规性、安全性等,因此选择对您的业务最有意义的方法非常重要。像【Airbnb】【优步】【网飞】 这样的大型科技公司有能力花费预算和工程资源构建内部解决方案来解决这些问题。另一方面,专门的质量检查和 Excel 表格跟踪程序很容易建立,但缺乏真正产生影响所必需的全面性。

扩展数据团队既有趣又具有挑战性。希望这些建议不仅能帮助你在旅途中树立信心,还能让你远离公园!

想了解更多,联系 巴尔摩西和蒙特卡洛团队

如何用 Python 刮仪表板

原文:https://towardsdatascience.com/how-to-scrape-a-dashboard-with-python-8b088f6cecf3?source=collection_archive---------13-----------------------

我们将学习如何使用 Python 中的 Selenium 和 Beautiful Soup 包从仪表板中抓取数据。

当与您需要的数据交互的唯一方式是通过仪表板时,仪表板抓取是一项有用的技能。我们将学习如何使用 Python 中的 SeleniumBeautiful Soup 包从仪表板中抓取数据。Selenium 包允许您编写 Python 代码来实现 web 浏览器交互的自动化,而 Beautiful Soup 包允许您轻松地从生成您想要抓取的网页的 HTML 代码中提取数据。

我们的目标是刮出本德堡县仪表板,它可视化了得克萨斯州本德堡县的新冠肺炎情况。我们将提取已执行的全部检测的历史记录和每日报告的病例数,以便我们可以估计本德堡县阳性病例的百分比。

请注意,本教程中的所有代码都是用 Python 3 . 6 . 2 版编写的。

步骤 1:导入 Python 包、模块和方法

第一步是导入仪表板抓取所需的 Python 包、模块和方法。下面列出了本教程中使用的包的版本。

第二步:抓取 HTML 源代码

下一步是编写 Python 代码来自动化我们与仪表板的交互。在编写任何代码之前,我们必须查看仪表板并检查其源代码,以识别包含我们需要的数据的 HTML 元素。仪表板源代码是指告诉您的浏览器如何呈现仪表板网页的 HTML 代码。要查看仪表板源代码,导航到仪表板并使用键盘快捷键Ctrl+Shift+I。将出现一个包含仪表板源代码的交互式面板。

请注意,只有在分别单击“在县站点执行的测试总数”面板中的“历史”选项卡和“已确认病例”面板中的“每日病例计数”选项卡后,才能看到已执行的测试总数的历史记录和报告的每日病例数。这意味着我们需要编写 Python 代码来自动点击“History”和“Daily Case Count”选项卡,以便 Beautiful Soup 可以看到执行的所有测试的历史和报告的每日案例数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本德县新冠肺炎堡仪表盘2020 年 7 月 10 日

要找到包含“历史”标签的 HTML 元素,使用快捷键Ctrl+Shift+C,然后点击“历史”标签。您将在源代码面板中看到,“History”选项卡位于 ID 为“ember208”的 div 元素中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

历史选项卡源代码

按照与“每日案例计数”选项卡相同的步骤,您将看到“每日案例计数”选项卡位于 ID 为“ember238”的 div 元素中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每日病例计数页签源代码

现在我们已经确定了我们需要的元素,我们可以编写代码:

  1. 在 Chrome 中启动仪表板
  2. “历史记录”标签加载完成后,单击“历史记录”标签
  3. “每日病例计数”选项卡完成加载后,单击“每日病例计数”选项卡
  4. 提取仪表板 HTML 源代码
  5. 退出铬合金

步骤 3:解析 HTML 中的数据

现在,我们需要解析 HTML 源代码,以提取执行的全部测试的历史记录和报告的每日案例数。我们将从查看仪表板源代码开始,以识别包含数据的 HTML 元素。

要找到包含所有已执行测试历史的 div 元素,使用Ctrl+Shift+C快捷方式,然后单击“Testing Sites”图的常规区域。您将在源代码中看到,整个情节位于 ID 为“ember96”的 div 元素中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试站点图的源代码

如果您将鼠标悬停在特定数据点上,将会出现一个标签,其中包含所执行测试的日期和次数。使用Ctrl+Shift+C快捷键并点击特定的数据点。您将看到标签文本被存储为一个g元素的aria-label属性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试站点数据标签的源代码

对报告的每日案例计数执行相同的步骤,您将看到每日案例计数图位于 ID 为“ember143”的 div 元素中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于报告日期图的每日案例源代码

如果您将鼠标悬停在特定数据点上,将会出现一个标签,其中包含日期和报告的阳性病例数。使用Ctrl+Shift+C快捷键,您会注意到数据也存储在g元素的aria-label属性中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于报告日期数据标签的每日案例源代码

一旦我们有了包含数据的元素,我们就可以编写代码:

  1. 查找包含已执行的总测试图的 div 元素,并提取已执行的总测试数据
  2. 查找包含每日案例计数图的 div 元素,并提取每日案例计数数据
  3. 将数据合并到 pandas 数据框架中,并将其导出到 CSV

第四步:计算阳性率

现在,我们终于可以估算出本德堡县的新冠肺炎阳性率了。我们将划分测试报告的案例,并计算 7 天移动平均值。从仪表板中不清楚报告的阳性病例是否包括通过非本县进行的检测(如在医院或诊所进行的检测)确定的病例。也不清楚阳性病例的检测是何时进行的,因为仪表板只显示报告的病例日期。这就是为什么从这些数据中得出的阳性率仅被认为是对真实阳性率的粗略估计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. https://www.fbchealth.org/ncov/
  2. https://www . fortbendcountytx . gov/your-county/fort-bend-county-expanses-新冠肺炎-testing-site-to-all-residents
  3. https://gov . Texas . gov/news/post/governor-Abbott-announces-phase-one-to-open-Texas-establishment-state-wide-standard-health-protocols
  4. https://gov . Texas . gov/news/post/governor-Abbott-announces-phase-two-to-open-Texas
  5. https://gov . Texas . gov/news/post/governor-Abbott-announces-phase-iii-to-open-Texas

如何用 python 和美汤刮任何网站(静态网页)

原文:https://towardsdatascience.com/how-to-scrape-any-website-with-python-and-beautiful-soup-bc84e95a3483?source=collection_archive---------4-----------------------

Python 美汤任意网页抓取教程,带 youtube 视频

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

注意:这是一个纯技术教程。在进行任何刮擦之前,请检查网站的政策。

对于那些想亲眼目睹这一切的人,可以看看我在页面底部的 YouTube 视频。

抓取网页的原因有很多。

你想得到你的足球队的数据吗,这样你就可以用算法来管理你的梦幻球队了?嘣,做一个刮 ESPN 的刮网器。跟踪竞争对手在不同社交媒体上的活动?太好了,这也包括在内。

或者,也许你是一名开发者拥护者,正在寻找衡量他参与黑客马拉松的 OKR 的好方法,但目前还没有好的工具,所以你想开发自己的工具。

最后一个非常特别,也是我们要寻找的!本教程展示了如何根据关键字blockchain从 devpost 获取所有将在未来 50 天内结束的黑客马拉松。

无论如何,让我们直接进入如何用 python 来抓取任何东西。我将假设您有空间可以编码,并且熟悉如何使用 python。

这方面的文档非常强大,所以一定要在本教程结束后检查一下!

* *

Beautiful soup 非常适合静态网页。如果你这样做并得到奇怪/糟糕的结果,你可能需要一个网络驱动来清理这个网站。我发表了这样做的高级版本,但是对于 95%的情况,下面的方法将会奏效。

1.皮普安装请求和美丽的汤

pip install requests

pip install beautifulsoup

运行这两个程序,这样您就可以使用这些包了。

2.找到你想刮的地方的网址

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自devpost.com

这一个不是一成不变的。如果你想浏览多个网站,你需要多个 URL。本教程的重点是只刮单个网站。一旦你理解了抓取单个页面的工作原理,你就可以移动到更多的页面。

在我们的教程中,我们将使用:

[https://devpost.com/hackathons?utf8=%E2%9C%93&search=blockchain&challenge_type=all&sort_by=Submission+Deadline](https://devpost.com/hackathons?utf8=%E2%9C%93&search=blockchain&challenge_type=all&sort_by=Submission+Deadline)

因为它给了我们所有的参数。区块链关键词和黑客马拉松结束的时间。

3.检查页面,并找到您正在寻找的标签

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

每个页面都是由 HTML/CSS/javascript 组成的(嗯…大部分情况下),显示在屏幕上的每一点数据都显示为文本。你可以随时查看这个页面!只需右键单击,并点击“检查”。

这将显示页面用来呈现的所有代码。这是网络抓取的关键。你看到“元素”标签了吗?那里有你需要的所有 HTML/CSS 代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“检查”按钮的外观。图片来自作者。

现在你不需要知道 HTML/CSS 是如何工作的(虽然,如果你知道的话,它真的会很有帮助)。唯一需要知道的是,你可以把每一个 HTML 标签看作一个对象。这些 HTML 标签有您可以查询的属性,并且每一个都是不同的。

图像中以<footer><script><div>开头的每一行代码都是标签的开始,它们分别以</footer></script></div>结尾。介于这些标签之间的所有内容也是可查询的,并作为该标签的一部分。一旦你有了一个标签,你就可以得到标签里面的任何东西。

4.开始做一些 python 吧!

因此,我们通过使用 requests 对象获取我们想要的网站来开始抓取:

import requests
from bs4 import BeautifulSoupresult = requests.get("https://devpost.com/hackathons?utf8=%E2%9C%93&search=blockchain&challenge_type=all&sort_by=Submission+Deadline")
src = result.content
soup = BeautifulSoup(src, 'lxml')

我们将结果存储在一个名为soupBeautifulSoup对象中。

这只是锅炉板的任何汤刮,接下来是可定制的部分。

5.选择你想要的标签和属性

你现在可以开始找出你想要的标签,这是你需要一点创意的地方,因为你通常可以用许多不同的方法来处理这个问题。对于我们的例子,我们想要找到所有的 hackathon 列表,我们发现它们都被包装在一个a标签中,并且有一个featured_challenge属性。下面是他们的 HTML 代码:

<a class=”clearfix” data-role=”featured_challenge” href=”[https://utonhack.devpost.com/?ref_content=default&amp;ref_feature=challenge&amp;ref_medium=discover](https://utonhack.devpost.com/?ref_content=default&amp;ref_feature=challenge&amp;ref_medium=discover)">
.
.
.
</a>

3 个.代表该标签内的其他标签**。我们现在将忽略这些,因为我们要寻找的数据就在这个标记中。我们想要那个网址。如您所见,这是一个a标签,因为它以<a开头,并且它有一个属性data-role="featured_challenge",这就是我们将要用来识别它的。**

我们可以用这个通过使用find_all函数找到一个列表,每一个都是中的一个。

featured_challenges = soup.find_all('a', attrs={'data-role': 'featured_challenge'})

现在的featured_challenges是一个a标签对象的列表,我们可以从中获取 URL。

如果我们遍历这个列表,我们可以这样做:

print(featured_challenge.attrs['href'])

attrs是每个标签的属性图。如果你回头看看我们提取的a标签,你会看到有一个href属性保存着我们正在寻找的黑客马拉松的 URL,万岁!

这些标签对象中的每一个都算作另一个 HTML 对象,所以你也可以对每个对象做find_all!如果只想得到第一个结果,可以使用find功能。

另外,如果您只想获得对象的文本,您可以只查找标记对象的text属性,就像这样:

featured_challenge.text

就是这样!

如果你想要在这个演示中使用的真正简单的刮刀的代码,在这里查看

带网络驱动的多黑客马拉松铲运机的完整代码

如何用 Python 和美汤刮任何网站(动态网)

原文:https://towardsdatascience.com/how-to-scrape-any-website-with-python-and-beautiful-soup-part-2-of-2-77560fcd30fc?source=collection_archive---------40-----------------------

Python Beautiful soup 用于抓取任何网页的教程,带有 youtube 视频——并专注于网络驱动程序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自作者

注意:这是一个纯粹的技术教程。在进行任何刮擦之前,请检查网站的政策。在我用的例子中,刮地盘是不合法的:。请不要使用。

对于那些想亲眼目睹这一切的人,可以看看我在页面底部的 YouTube 视频。

现在如果你没看我的第一部,回去看!这是基于在那里学到的概念。记住,这方面的文档非常强大,所以一定要在本教程结束后查看!

我们现在要学习如何处理 动态 网页或者有很多正在进行的网页,不仅仅是 HTML/CSS。用 beautifulsoup 来抓取这些页面更难,因为有时候,代码发生在服务器端,beautifulsoup 需要让浏览器来运行它。

如果有一种方法让我们编码并让我们的代码假装它是一个浏览器,那不是很好吗?…好吧,碰巧这正是这篇文章的内容!

现在,我第一次在这篇文章中读到了这一点,我将这篇文章的重点放在了具体的实现上,所以要了解更多的细节,请务必查看!

1.下载 Chrome 或 Firefox

这是目前我所知道的仅有的两个有这个功能的,所以一定要使用其中的一个。对于这篇文章,我们使用的是 Firefox

2.下载网络驱动程序

我们将使用的网络驱动是 geckodriver ,你可以在那个链接的底部找到所有的下载。下载后,从下载文件中提取文件(只需双击 zip 文件)。

Web 驱动有点挑剔,和操作系统玩的不太好,所以我们需要:
把 geckodriver 移到一个路径可执行文件所在的地方。请查看这篇文章了解如何在 windows 上做到这一点。

我们可以通过运行以下命令找到我们的可执行路径:

*echo $PATH*

然后我们可以:

  1. cp将 geckodriver 文件从 zip 压缩到你的$PATH变量告诉你的一个位置(在运行echo $PATH之后)
  2. 向您的$PATH环境变量添加一个新的$PATH位置,并将可执行文件 geckodriver 放在那里。你可以在这里看到如何操作。

然后重新启动您的终端以使更改生效。如果你使用 MacOS(我就是),你可能还需要公证这个应用程序。您可以通过运行以下命令来实现:

*xattr -r -d com.apple.quarantine geckodriver*

3.开始用 python 编码吧!

运行之后:pip install selenium,现在可以开始使用 web 驱动了!您将使用driver.get来获取动态网页 URL,而不是使用requests.get来获取,就像这样:

*from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoupoptions = Options()
# Make it go faster by running headless
# This will remove the web browser GUI from popping up
options.headless = True
driver = webdriver.Firefox(options=options)
# Enter whatever URL you like
driver.get("https://gitcoin.co/{}".format(link.attrs['href']))
# Let the code on their end run
time.sleep(20)
# Save it to a variable
html = driver.page_source
driver.quit()
# And then just paste it right back into beautifulsoup!
projects_soup = BeautifulSoup(html, 'lxml')*

你可以在 Alpha Chain demos repo 上看到完整的代码示例,在我的 hackathon-scraper 项目上看到一个完整的示例,在这里有一个视频向你展示如何做。

而且记住,你可以一直快进:)

如何使用 Selenium 通过 Python 节省航班费用

原文:https://towardsdatascience.com/how-to-scrape-flight-prices-with-python-using-selenium-a8382a70d5d6?source=collection_archive---------14-----------------------

在这篇文章中,你将学会用 Selenium 和 ChromeDriver 来降低 Expedia 航班的价格

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片(尼泊尔卢卡拉)

本文由 罗伊·弗氏奥菲尔·因巴尔 撰写

背景

新冠肺炎疫情期间困在家里?你喜欢旅游和数据科学吗?

你可以把两者结合起来买便宜的航班。本教程将教你如何创建一个 web scraper,它将为你找到你想要的任何目的地的航班价格。

在本教程中,你将了解到 Expedia 是世界上最大的在线旅行社之一。它由 Expedia 集团拥有和运营,在收入最高的旅游公司排行榜上排名第一。

如果你想知道新冠肺炎疫情如何影响航班价格,看看我们的媒体 邮报

需要注意的是,网络抓取违反了大多数网站的服务条款,所以你的 IP 地址可能会被禁止进入网站。

环境设置

对于这个刮刀,请确保您使用的是 Python 3.5 版本(或更新版本)。确认您的环境包含以下软件包和驱动程序:

  • Selenium 包:一个流行的网络浏览器自动化工具
  • ChromeDriver: 允许你打开浏览器,像人类一样执行任务。
  • 熊猫套餐
  • 日期时间包

这篇 TDS 帖子是对 Selenium 的一个很好的介绍。

刮擦策略

在进入代码之前,我们先简单描述一下抓取策略:

  • 插入到一个 CSV 文件的确切路线和日期,你想刮。您可以插入任意多的路线,但是使用这些列名很重要。铲运机只在往返时工作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

CSV 路线文件。dep =出发,arr =到达。

  • 运行完整的代码。
  • 每个航班的输出是一个 CSV 文件。它的文件名将是执行抓取的日期和时间。
  • 相同路线的所有航班将自动由刮刀定位在适当的文件夹(路线的名称)中。

听起来很复杂……其实不然!让我们看一个例子。

这些是 CSV 文件中定义的抓取路径(抓取器会自动创建这些文件夹):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

废弃的路线

在这里,您可以看到雅典—阿布扎比航线上的多个刮掉的日期:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

刮掉的日期:雅典—阿布扎比

下面的屏幕截图展示了雅典-阿布扎比航线的每个刮擦样本的单个 CSV 文件。它的名字代表了刮刀被执行的日期和时间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

特定日期的单个 CSV 输出文件

我们希望流程清晰!

输出特征

铲运机输出将包括以下特性:

  • 出发时间
  • 到达时间
  • 航空公司
  • 持续时间(飞行时间)
  • 停靠站(停靠站数量)
  • 中途停留
  • 价格
  • 飞机类型
  • 离开蔻驰
  • 抵达蔻驰
  • 出发机场名称
  • 到达机场名称
  • 执行擦除的确切时间

如果不是直飞,scraper 会给你额外的数据(机场,航空公司名称等)。)用于每个连接

密码

在这一节中,我们将检查代码的主要部分。你可以在这里 找到完整的代码

首先,像往常一样,需要导入相关的库,定义 chrome 驱动程序并设置往返类型。

在下一步中,您将使用 Selenium 工具定义一些函数,以便在网页上找到各种功能。函数的名字暗示了它们的作用。

CSV routes 文件中的每一行(航班)都经过以下过程:

是时候从网上收集数据并把它插入熊猫的数据框架中了。

最后,将数据以 CSV 文件直接导出到所需的文件夹中。

结论

总之,你学会了如何用 Selenium 包来节省 Expedia 航班的价格。理解基础知识后,你将能够为任何其他网站构建你的抓取工具。

就个人而言,作为爱好绘画的旅行者,我们喜欢使用数据科学来寻找全球各地令人惊叹的目的地的优惠。

如果您有任何问题、评论或担忧,请不要忘记联系 Linkedin 上的 RoeeOffir

祝你好运!

参考

** [## 使用 Selenium 的网页抓取简介

在本教程中,你将学习如何用 Selenium 和 ChromeDriver 抓取网站。

medium.com](https://medium.com/the-andela-way/introduction-to-web-scraping-using-selenium-7ec377a8cf72)

https://en.wikipedia.org/wiki/Expedia

[## 使用 Python 的 Selenium Webdriver:带示例的教程

Selenium 支持 Python,因此可以与 Selenium 一起用于测试。与其他相比,Python 很容易…

www.guru99.com](https://www.guru99.com/selenium-python.html)

https://www . scrape hero . com/scrape-flight-schedules-and-prices-from-Expedia/**

如何通过网络数据提取来获取谷歌购物价格

原文:https://towardsdatascience.com/how-to-scrape-google-shopping-prices-with-web-data-extraction-5a0a9b92406f?source=collection_archive---------34-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

刮谷歌购物产品

谷歌购物是营销你的在线业务和转化更多销售的良好开端。然而,如果你是一个新来者,有必要观察和学习你的竞争对手如何通过使用 网络数据提取工具(网络抓取工具) 从谷歌购物品牌化和营销他们的产品。

为什么你应该在你的电子商务业务中使用谷歌购物?

谷歌购物转化率明显很高。这是因为谷歌购物只吸引有购买意向的顾客。例如,一个用户想买一双跑鞋作为生日礼物送给她的母亲。她可能会从搜索“跑鞋”开始,然后谷歌会提供所有相关的产品信息。用户可以在几秒钟内比较价格和功能。

谷歌购物不仅让消费者的购物过程更加方便,也让商家的营销活动更准确地匹配目标。难怪谷歌购物会在成功的电子商务企业家中广受欢迎。如果你能充分利用它,这确实是提高你销售额的有效方法。

谷歌购物是如何工作的?

为了更好地优化您的谷歌购物活动,我们需要首先了解它是如何工作的。谷歌购物非常容易开始,因为你可以按照官方的指导方针在谷歌商业中心设置你的帐户。一旦您准备好帐户,我们就可以同步您的在线商店。然后,当特定的产品搜索词出现时,你的产品信息将通过谷歌购物上线。谷歌购物在一个拍卖竞价系统和产品页面质量评分中发挥作用。也就是说,为了让谷歌购物将你的活动广告放在给定搜索结果的第一位,你必须:

  1. 出价高于竞争对手的出价,
  2. 创建转换-磁性清单描述以提高 CTR

对于大多数新手来说,他们不知道如何创建一个成功的活动。在这方面,最好的开始方式是观察别人,尤其是你的竞争对手,如何在谷歌购物上销售。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由克里斯蒂安·威迪格Unsplash 上拍摄

为什么要提取 Web 数据?

有句谚语说,“亲近你的朋友,更要亲近你的敌人。” Google Shopping 拥有大量有价值的信息,可以为您的营销活动提供素材。市面上有很多价格和产品监测平台。然而,在你测试出一个有效的营销策略并做好准备之前,如果投资这些花哨的监控工具,你就是在浪费钱。大多数监控工具是为在各种渠道中拥有大规模产品线的成熟在线企业设计的。

这就是数据提取发挥作用的方式。它可以从网站上自动提取任何数据,并转换成 excel 等可行的格式进行分析。优化策略依赖于从 Google Shopping 收集的足够数量的产品数据。

如何使用网络数据提取抓取谷歌购物

Web 数据提取需要很高的技术技能才能完成。幸运的是,有一些网页提取工具,任何人点击一下就可以直观地提取网页数据。 Octoparse 作为领先的网页抓取软件脱颖而出,对于初学者来说是绝对不需要动脑筋的。任何人都可以定制和设置一个刮刀,从大多数网站获取数据。

  1. 要使用 Octoparse 从 Google Shopping 中提取产品信息,我们需要定制一个新任务,方法是单击右上角的加号,然后将 URL 扔进框中。
  2. 它有一个内置的浏览器,应该加载网页,让我们点击。OP 8 的新版本。x 将自动读取网页并识别数据字段。
  3. 按照指南提示,点击“保存设置”。它会自己生成工作流
  4. 单击“开始提取”执行任务。

这将需要几分钟的时间来增加列表的数量。完成提取后,将文件下载到 excel 或 CSV 文件中。

当我们获得足够的信息时,我们可以进一步分析结果。您可以构建图形图表来直观地显示数据。

你能从竞争对手身上学到什么:

  • 低价提高点击率:

有竞争力的价格总是会获得更高的点击率,这让谷歌购物在给定的搜索产品上更频繁地带来你的产品。你获得的印象会加强你的点击率。然而,你能走多低是有限度的。这就是为什么密切关注竞争对手的价格有助于保持竞争力。

  • 不要用鸡蛋砸石头:

关注像亚马逊、塔吉特和沃尔玛这样的大公司。如果某个产品有很多大玩家,不要试图通过提高出价来超过他们。相反,你可以选择一个利基产品,他们不会出价很高。

  • 优化图像质量:

产品图片在谷歌购物中可有可无。一张好的照片可以吸引更多的用户点击。你的照片应该足够清晰简单。在这方面,密切注意你可能需要 Photoshop 技巧,使你的照片看起来更有吸引力。

  • 关注推广文字:

如果你的转换率下降,很可能你的竞争对手正在进行促销。推广文本更有吸引力,这将推动更多的点击率。你的促销可以是季节性的,比如**“冬季大甩卖”甚至“所有订单免运费”**对获得更多客户也很有帮助。然而,狡猾的零售商会通过把运费留给顾客来降低他们的价格。有的客户没意识到其实是自己掏钱付运费,后来生气了。所以只要确保顾客对促销活动非常清楚,不会引起任何麻烦。

包裹

谷歌购物很容易上手,但你仍然需要更加积极主动,保持警惕。来自谷歌的其他信息也是如此,例如 Google Play 评论。谷歌有大量信息可供挑选,这就像去相亲一样。网络数据提取是你的圣杯,可以毫不费力地自动跟踪你的竞争对手。自动调整你的市场策略,这样你就可以专注于获得竞争优势。

原载于 2020 年 4 月 13 日http://www . data extraction . io

如何从 Twitter 上的推文中获取更多信息

原文:https://towardsdatascience.com/how-to-scrape-more-information-from-tweets-on-twitter-44fd540b8a1f?source=collection_archive---------4-----------------------

一个深入的 Twitter 抓取教程

当抓取文本和使用简单的查询是不够的,你想从 Twitter 上的推文中得到更多

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片来源

概观

有时候,仅仅抓取文本和使用简单的搜索查询是不够的。在收到大量关于我的基本 Twitter 抓取文章中没有完全涵盖的主题的询问后,我决定值得写一篇后续文章,解释 Tweepy 和 GetOldTweets3 提供的许多属性和方法,以进一步完善人们对推文的搜索查询。希望这篇文章将涵盖任何挥之不去的问题或提供新的想法。像我之前的文章一样,我将使用 Tweepy ,一个用于访问 Twitter 的 API 的 python 库,以及 Dmitry Mottl 的 GetOldTweets3 ,一个不需要 API 键就能抓取数据的 python 库。

本教程旨在成为一篇直截了当的文章,直接进入编码,展示来自每个库的各种对象中可用的数据和方法,以便在抓取 tweets 时进一步细化查询。

由于对抓取推文的非编码解决方案感兴趣,我的团队正在创建一个应用程序来满足这一需求。是的,这意味着你不必编写代码来收集数据!我们目前正在对我们的应用 Socialscrapr 进行 Alpha 测试。如果您想参与或在下一个测试阶段开放时被联系,请注册我们下面的邮件列表!

继续/先决条件之前

本文假设您熟悉 Python 和 Tweepy 或 GetOldTweets3。如果这是您第一次使用这些库,或者您需要复习,我推荐您阅读我的前一篇文章,它涵盖了基础知识和设置。

在我们开始之前,快速概述一下我将在本文中使用的两个库。

十二周:

  • 可以与 Twitter 的 API 交互并创建推文、收藏夹等。
  • 需要注册才能接收凭据
  • 获取更深入的推文信息和用户信息
  • 在抓取大量推文以及使用标准搜索 API 访问超过一周的推文方面存在限制

GetOldTweets3

更新:由于 TWITTER 的 API 发生变化,GETOLDTWEETS3 不再运行。SNSCRAPE 已经成为一个免费库的替代品,你可以使用它来清除 TWEEPY 的免费限制。我的文章在这里可用为SNSCRAPE

  • 仅用于抓取推文
  • 不需要注册
  • 对用户信息的有限访问
  • 抓取大量推文或访问旧推文没有限制

这些是这两个库的主要特征,如果你感兴趣,我在我的上一篇文章中提供了更详细的比较。如果你发现自己想要对大量数据的信息进行二级访问,我建议看看 Twitter 的高级/企业搜索 API。这篇文章很好地展示了一个名为 searchtweets 的库,它允许你在 Python 中使用这些 API。如果你觉得 Twitter 的 Premium/Enterprise API 太贵,有一个变通方法,你可以一起使用 Tweepy 和 GetOldTweets3,我在本文的最后讨论了这个方法。

这篇文章涵盖了不同的主题领域,正因为如此,我不建议从头到尾阅读,除非你绝对想对 Tweepy 和 GetOldTweets3 都有深刻的理解。因此,我将包含一个链接的目录,这样您就可以决定哪些信息与您相关,并跳转到相应的部分。此外,正如你将看到的,我的大多数功能都设置为抓取 150 条推文。我建议首先在较小的样本上测试你的查询,然后收集你想要的 tweet 数量,因为大型查询可能需要一些时间才能完成。

快速注意,如果你正在抓取私人账户或以前的私人账户,你可能会发现你无法访问推文,或者你可以抓取的推文数量有限。

如果你想提前检查我的代码,或者在阅读每一部分时有所遵循,我已经创建了一个文章笔记本,遵循本文中给出的代码示例;以及一个配套的笔记本,它提供了更多的例子来更好地充实代码。你可以在我的 GitHub 这里 访问我的 Jupyter 笔记本来获取这个教程。

事不宜迟,让我们投入战斗吧!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片来源

目录:

用 Tweepy 刮更

用 GetOldTweets3 刮更

如何将 Tweepy 与 GetOldTweets3 一起使用

用 Tweepy 刮得更多

如果你想让代码跟随这一部分,我这里有一篇文章 Jupyter 笔记本。如果你想要更多的代码示例和易于使用的功能,我在这里创建了一个配套的 Jupyter 笔记本

入门

在使用 Tweepy 之前,它需要授权。我不会详细介绍如何设置,因为我在之前的文章中已经介绍过了。

consumer_key = "XXXXX"
consumer_secret = "XXXXX"
access_token = "XXXXX"
access_token_secret = "XXXXXX"auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth,wait_on_rate_limit=True)

从推文中获取更多信息

下面提供的图片虽然不是一个详尽的列表,但涵盖了 Tweepy 的 tweet 对象中的大部分可用信息。如果你对其他可用的数据感到好奇,Twitter 开发者网站上的这里显示了完整的信息列表。正如您将在本部分和用户信息部分看到的。为了保持数据的完整性,我使用字符串版本的 Ids,而不是 integer,因为存储 integer 值可能会导致以后访问它时数据丢失。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tweepy 提供的推文信息列表

大多数情况下,每个 tweet.attribute 都有一定的价值,并且容易访问。但是,tweet.coordinates 和 tweet.place 属性需要一些提取,因为它们是包含其他数据的数据字典。此外,因为它们可能是空的,所以首先检查 tweet 是否有信息是很重要的。下面的函数检查属性是否有数据,并提取相关信息。这段代码假设您遵循了我的列命名约定,我们将在下一节中看到这一点。如果你改变了 Tweet 坐标或位置信息的命名方式,你需要相应地调整下面的代码。

# Function created to extract coordinates from tweet if it has coordinate info
# Tweets tend to have null so important to run check
# Make sure to run this cell as it is used in a lot of different functions below
def extract_coordinates(row):
    if row['Tweet Coordinates']:
        return row['Tweet Coordinates']['coordinates']
    else:
        return None# Function created to extract place such as city, state or country from tweet if it has place info
# Tweets tend to have null so important to run check
# Make sure to run this cell as it is used in a lot of different functions below
def extract_place(row):
    if row['Place Info']:
        return row['Place Info'].full_name
    else:
        return None

现在我们可以继续前进,能够从 tweet.coordinates 和 tweet.place 属性中提取有用的信息。让我们开始实际刮削。

从用户的推文中提取所有推文相关信息的搜索查询示例:

username = 'random'
max_tweets = 150

tweets = tweepy.Cursor(api.user_timeline,id=username).items(max_tweets)

# Pulling information from tweets iterable object
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.user.screen_name, tweet.coordinates, tweet.place, tweet.retweet_count, tweet.favorite_count, tweet.lang, tweet.source, tweet.in_reply_to_status_id_str, tweet.in_reply_to_user_id_str, tweet.is_quote_status] for tweet in tweets]

# Creation of dataframe from tweets_list
# Add or remove columns as you remove tweet information
tweets_df = pd.DataFrame(tweets_list,columns=['Tweet Text', 'Tweet Datetime', 'Tweet Id', 'Twitter @ Name', 'Tweet Coordinates', 'Place Info', 'Retweets', 'Favorites', 'Language', 'Source', 'Replied Tweet Id', 'Replied Tweet User Id Str', 'Quote Status Bool'])

# Checks if there are coordinates attached to tweets, if so extracts them
tweets_df['Tweet Coordinates'] = tweets_df.apply(extract_coordinates,axis=1)

# Checks if there is place information available, if so extracts them
tweets_df['Place Info'] = tweets_df.apply(extract_place,axis=1)

上面的查询从 Twitter 用户@random 获取 150 条 tweets,并利用 extract_coordinates 和 extract_place 函数检查是否有信息,如果有,就提取相关信息。如上所示,tweet 对象中有很多可用的信息。要修改信息,你只需要添加或删除 tweets_list 中显示的任何 tweet.attribute。为此,在创建 dataframe tweets_df 时调整列名也很重要。

访问多达 280 个字符的推文文本

出于兼容性的考虑,Tweepy 默认情况下只提取最多 140 个字符的 tweet 文本,因为这是 Twitter 的旧 tweet 字符限制。这可能很烦人,因为你可能想要所有可用的信息,而不是被缩短的推文。要取消此限制,您必须修改 tweepy.Cursor 中的 tweepy _ mode 参数。如果您正在使用 Tweepy,请务必将此 tweet_mode 设置为“extended ”,因为如果您不在查询中包含此选项,您将始终会抓取缩短到原始 140 个字符限制的 tweet。当 Tweepy 设置为扩展 tweet 模式时,这也会将 tweet.text 属性改为 tweet.full_text。因此,如果您使用这种扩展的 tweet 模式,请确保相应地调整您的代码。下面的代码片段展示了 tweepy 中的变化。光标和 tweets_list 来访问超过 140 个字符的 tweets。Tweepy 文档中的此处提供了关于扩展 Tweepy 模式的更多信息。

username = 'BillGates'
max_tweets = 150

# Creation of query method using parameters
tweets = 
tweepy.Cursor(api.user_timeline, id=username, tweet_mode='extended').items(max_tweets)

# Pulling information from tweets iterable object
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.full_text, tweet.created_at, tweet.id_str, tweet.user.screen_name, tweet.coordinates, tweet.place, tweet.retweet_count, tweet.favorite_count, tweet.lang, tweet.source, tweet.in_reply_to_status_id_str, tweet.in_reply_to_user_id_str, tweet.is_quote_status] for tweet in tweets]

# Creation of dataframe from tweets_list
# Did not include column names to simplify code 
tweets_df = pd.DataFrame(tweets_list)

从推文中获取用户信息

用户信息是 Tweepy 优于 GetOldTweets3 的地方。下面提供的图片虽然不是一个详尽的列表,但涵盖了 Tweepy 的用户对象中可用的大部分信息。如果你对其他可用的数据感到好奇,完整的信息列表可以在 Twitter 的开发者网站上这里找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tweepy 提供的用户信息列表

从推文中提取所有用户相关信息的搜索查询示例:

text_query = 'Coronavirus'
max_tweets = 150

# Creation of query method using parameters
tweets = tweepy.Cursor(api.search,q=text_query).items(max_tweets)

# Pulling information from tweets iterable object
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.user.name, tweet.user.screen_name, tweet.user.id_str, tweet.user.location, tweet.user.url, tweet.user.description, tweet.user.verified, tweet.user.followers_count, tweet.user.friends_count, tweet.user.favourites_count, tweet.user.statuses_count, tweet.user.listed_count, tweet.user.created_at, tweet.user.profile_image_url_https, tweet.user.default_profile, tweet.user.default_profile_image] for tweet in tweets]

# Creation of dataframe from tweets_list
# Did not include column names to simplify code 
tweets_df = pd.DataFrame(tweets_list)

上面的查询搜索了 150 条包含单词冠状病毒的最近的推文。类似于前面显示的其他代码片段。要修改可用的信息,可以在 tweets_list 中显示的列表理解中添加或删除任何 tweet.user.attribute。

高级查询刮除

Tweepy 提供了几种不同的方法来优化您的查询。下图显示了可通过 Tweepy 访问的搜索参数列表。同样,虽然这不是详尽的清单,但它涵盖了大部分。如果你想了解更多关于搜索 API 的信息,可以在 Twitter 的开发者网站这里找到。正如您可能注意到的 geocode,Tweepy 没有一个方法可以接受城市的字符串版本并在它们周围进行搜索。您必须输入一对特定的纬度、经度坐标来限制地理位置的查询。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tweepy 提供的搜索参数列表

使用高级查询的搜索查询示例:

# Example may no longer show tweets if until_date falls outside 
# of 7-day period from when you run cell
coordinates = '19.402833,-99.141051,50mi'
language = 'es'
result_type = 'recent'
until_date = '2020-08-10'
max_tweets = 150

# Creation of query method using parameters
tweets = tweepy.Cursor(api.search, geocode=coordinates, lang=language, result_type = result_type, until = until_date, count = 100).items(max_tweets)

# List comprehension pulling chosen tweet information from tweets iterable object
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.favorite_count, tweet.user.screen_name, tweet.user.id_str, tweet.user.location, tweet.user.url, tweet.user.verified, tweet.user.followers_count, tweet.user.friends_count, tweet.user.statuses_count, tweet.user.default_profile_image, 
tweet.lang] for tweet in tweets]

# Creation of dataframe from tweets_list
# Did not include column names to simplify code 
tweets_df = pd.DataFrame(tweets_list)

上面的查询用西班牙语提取了 150 条最近在墨西哥城发布的推文,最新日期是 2020 年 8 月 10 日。这个代码片段与之前展示的另外两个略有不同。为了优化搜索参数,您必须将上图所示的不同参数添加到 tweepy 中。光标(geocode =坐标,lang =语言等。)并给它传递一个变量或者硬编码。这样你就可以根据地点、语言或者任何你想做的事情来优化你的搜索。

把所有的放在一起

太好了,我见过很多单独的东西,但这有什么关系呢?无论您是想从搜索关键词的特定用户那里收集推文,还是搜索在内华达州拉斯维加斯(Lat 36.169786,Long-115.139858)50 英里半径范围内具有关键词冠状病毒的推文。您的 Tweepy 抓取仅受您的想象力和 Tweepy 中可用的属性和方法的限制。下面我将通过显示上面提到的查询向您展示挑选您想要的方法和信息是多么容易。

使用高级查询提取推文和用户信息的查询示例:

text_query = 'Coronavirus'
coordinates = '36.169786,-115.139858,50mi'
max_tweets = 150

# Creation of query method using parameters
tweets = tweepy.Cursor(api.search, q = text_query, geocode = coordinates, count = 100).items(max_tweets)

# Pulling information from tweets iterable object
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.favorite_count, tweet.user.screen_name, tweet.user.id_str, tweet.user.location, tweet.user.followers_count, tweet.coordinates, tweet.place] for tweet in tweets]

# Creation of dataframe from tweets_list
# Did not include column names to simplify code
tweets_df = pd.DataFrame(tweets_list)

正如您在上面看到的,只需修改 tweepy 中的代码。Cursor(api.search,)带有搜索参数,可以根据位置、top_tweets 等进一步优化搜索。如果您想修改从 tweets 中收到的信息,只需在我在 query 方法下创建的 tweets_list 列表理解中添加或删除 tweet.chosen _ attribute。

使用 GetOldTweets3 获取更多信息

更新:由于 TWITTER 的 API 发生变化,GETOLDTWEETS3 不再运行。SNSCRAPE 已经成为一个免费库的替代品,你可以使用它来清除 TWEEPY 的免费限制。我的文章在这里可用为sn scrape

GetOldTweets3 只需要安装一个 pip。导入库后,您应该能够立即使用它。如果你想让代码跟随这一部分,我这里有一篇文章 Jupyter Notebook。如果你想要更多的代码示例和易于使用的功能,我在这里创建了一个配套的 Jupyter 笔记本

从推文中获取更多信息

下面提供的图片是通过 GetOldTweets3 的 tweet 对象向您提供的信息的详尽列表。正如你所看到的,一条 tweet 包含了相当多的信息,访问它一点也不困难。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GetOldTweets3 提供的 tweet 信息列表

从用户的推文中提取所有推文相关信息的搜索查询示例:

username = 'jack'
count = 150

# Creation of tweetCriteria query object with methods to specify further
tweetCriteria = got.manager.TweetCriteria().setUsername(username)\
.setMaxTweets(count)

# Creation of tweets iterable containing all queried tweet data
tweets = got.manager.TweetManager.getTweets(tweetCriteria)

# List comprehension pulling chosen tweet information from tweets
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.to, tweet.text, tweet.retweets, tweet.favorites, tweet.replies, tweet.date, tweet.formatted_date, tweet.hashtags, tweet.mentions, tweet.urls, tweet.permalink,] for tweet in tweets]

# Creation of dataframe from tweets_list
# Did not include column names to simplify code 
tweets_df = pd.DataFrame(tweets_list)

上面的查询提取了 twitter 用户@jack 最近的 150 条推文。如上所示,要修改可用信息,您只需添加或删除 tweets_list 中显示的列表理解的任何 tweet.attribute。

从推文中获取用户信息

与 Tweepy 相比,GetOldTweets3 的可用用户信息有限。这个库的 tweet 对象只包含 tweet 作者的用户名和 user_id。如果您想要比现有的更多的用户信息,我建议您要么使用 Tweepy 进行所有的抓取,要么使用 Tweepy 方法和 GetOldTweets3,以便充分利用两个库的优势。为此,我在下面的“如何使用 Tweepy 和 GetOldTweets3”一节中展示了一些解决方法。

使用高级查询抓取

下面提供的图片是通过 GetOldTweets3 优化查询的详尽方法列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GetOldTweets3 可用的搜索方法列表

使用高级查询的搜索查询示例:

username = "BarackObama"
text_query = "Hello"
since_date = "2011-01-01"
until_date = "2016-12-20"
count = 150

# Creation of tweetCriteria query object with methods to specify further
tweetCriteria = got.manager.TweetCriteria().setUsername(username)\
.setQuerySearch(text_query).setSince(since_date)\
.setUntil(until_date).setMaxTweets(count)

# Creation of tweets iterable containing all queried tweet data
tweets = got.manager.TweetManager.getTweets(tweetCriteria)

# List comprehension pulling chosen tweet information from tweets
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.text, tweet.retweets, tweet.favorites,tweet.replies,tweet.date] for tweet in tweets]

# Creation of dataframe from tweets list
# Did not include column names to simplify code 
tweets_df = pd.DataFrame(tweets_list)

上面的查询试图从巴拉克·奥巴马那里提取 150 条 tweetss,这些 tweet 在日期范围 2011 年 1 月 1 日到 2016 年 12 月 20 日之间打招呼。如上面的代码片段所示,如果您想使用任何方法来创建更具体的查询,您需要做的就是将它们添加到 TweetCriteria()的末尾。例如,我可以在上面的代码中添加。塞特尼尔(“华盛顿特区”)在年底。setMaxTweets(),如果我想查询该地区周围的推文。

把所有的放在一起

太好了,我可以从 2016 年开始发布推文信息或推文。为什么重要?无论您是想从搜索关键词的特定用户那里收集所有可用信息,还是搜索华盛顿特区在 2020 年 8 月 5 日至 2020 年 8 月 10 日之间以冠状病毒为关键词的热门推文。您的 tweet 抓取只受您的想象力和该包中可用的属性和方法的限制。下面我将向您展示通过创建上面提到的查询来挑选您想要的方法和信息是多么容易。

使用高级查询提取推文和用户信息的查询示例:

text_query = 'Coronavirus'
since_date = '2020-08-05'
until_date = '2020-08-10'
location = 'Washington, D.C.'
top_tweets = True
count = 150

# Creation of tweetCriteria query object with methods to specify further
tweetCriteria = got.manager.TweetCriteria()\
.setQuerySearch(text_query).setSince(since_date)\
.setUntil(until_date).setNear(location).setTopTweets(top_tweets)\
.setMaxTweets(count)

# Creation of tweets iterable containing all queried tweet data
tweets = got.manager.TweetManager.getTweets(tweetCriteria)

# List comprehension pulling chosen tweet information from tweets
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.to, tweet.text, tweet.retweets, tweet.favorites, tweet.replies, tweet.date, tweet.mentions, tweet.urls, tweet.permalink,] for tweet in tweets]

# Creation of dataframe from tweets list
# Add or remove columns as you remove tweet information
tweets_df = pd.DataFrame(tweets_list)

正如最后一个例子所示,改进您的查询或修改您可用的 tweet 数据相当简单。通过在末尾添加 set 方法并传入值来修改 tweetCriteria 对象,可以优化查询。您可以通过修改 tweets_list 中列出的 tweet 属性来删除或添加更多信息。

如何将 Tweepy 与 GetOldTweets3 一起使用

如果你使用 GetOldTweets3 但是想要访问用户信息会怎么样?或者你使用 Tweepy,但需要访问旧的推文。还好,有一个变通办法,你可以使用 Tweepy 的方法来访问更多的 Tweepy 或用户信息。允许您一起使用这两个库。

重要的是要记住,Tweepy 的 API 总是要求用户注册以接收凭证,如果你需要这样做的话我以前的文章讨论过这个问题。此外,这些方法仍然受到 Tweepy 的请求限制,所以我不建议对大于 20k tweets 的数据集使用这种变通方法,除非您不介意让您的计算机运行几个小时。我个人使用了这两个库和一个 5000 条 tweets 的数据集,花了我大约 1-2 个小时来运行所有的东西。如果你没有时间等待或者不介意付费,那么利用 Twitter 的 Premium/Enterprise API 是值得的。这篇文章涵盖了 searchtweets,一个 Python 中的库,如果你决定走这条路,它允许访问高级/企业 API。

如果你想让代码跟随这一部分,我有一个 Jupyter 笔记本可用在这里

凭证

在使用 Tweepy 之前,它需要授权。我不会详细介绍如何设置,因为我在之前的文章中已经介绍过了。

# consumer_key = "XXXXX"
# consumer_secret = "XXXXX"
# access_token = "XXXXX"
# access_token_secret = "XXXXXX"auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth,wait_on_rate_limit=True)

准备

Tweepy 的 API 提供了两种方法,允许 GetOldTweets3 用户访问更多信息。

api.get_status()接受一个 tweet id,并返回与该 tweet 相关的所有信息

api.get_user()接受用户 id 或用户名,并返回与该用户相关的所有信息

因此,让我们确保这些数据可用,并使用 GetOldTweets3 获取 tweet.id、tweet.author_id 和 tweet.username。

text_query = 'Hello'
since_date = "2020-7-20"
until_date = "2020-7-21"count = 150

# Creation of tweetCriteria query object with methods to specify further
tweetCriteria = got.manager.TweetCriteria()\
.setQuerySearch(text_query).setSince(since_date)\
.setUntil(until_date).setMaxTweets(count)

# Creation of tweets iterable containing all queried tweet data
tweets = got.manager.TweetManager.getTweets(tweetCriteria)

# List comprehension pulling chosen tweet information from tweets
# Add or remove tweet information you want in the below list comprehension
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.text, tweet.retweets, tweet.favorites, tweet.replies, tweet.date] for tweet in tweets]

# Creation of dataframe from tweets list
# Add or remove columns as you remove tweet information
tweets_df = pd.DataFrame(tweets_list, columns = ['Tweet Id', 'Tweet User Id', 'Tweet User', 'Text', 'Retweets', 'Favorites', 'Replies', 'Datetime'])

功能

很好,我们已经得到了一些包含 tweet.id、tweet.author_id 和 tweet.username 的数据。让我们测试一下 Tweepy 中的这些方法,以确保它们能够工作。

api.get_status(1285363852851511301)api.get_user(811267164476841984)api.get_user('realJakeLogan')

正如您在上面的代码中看到的,有许多信息来自请求。还需要注意的是,Tweepy 的 tweet 对象已经包含了一个用户对象。如果你只需要 Tweepy 的用户信息,你可以使用任何一种方法,但是如果你想要 Tweepy 的 tweet 信息,你必须使用 get_status 方法。让我们更进一步。上面的代码只对一次搜索一个东西有用,如果你有一个完整的数据集,你需要创建一个函数来提取数据。

def extract_tweepy_tweet_info(row):
    tweet = api.get_status(row['Tweet Id'])
    return tweet.source

tweets_df['Tweet Source'] = tweets_df.apply(extract_tweepy_tweet_info,axis=1)

这很好,但是,如果您想从 tweet 对象返回多个属性,会发生什么情况呢?也许你还想要 tweet.user.location 和 tweet.user.followers_count。有两种方法可以解决这个问题。创建一个函数将数据存储在列表中,然后将所有数据添加到数据框中。或者创建一个将创建一个系列并返回它的函数,然后使用 panda 的 apply 方法在数据框上使用该函数。我将展示前者,因为它更容易掌握。

# Creation of list to store scrape tweet data
tweets_holding_list = []

def extract_tweepy_tweet_info_efficient(row):
    # Using Tweepy API to request for tweet data
    tweet = api.get_status(row['Tweet Id'])

    # Storing chosen tweet data in tweets_holding_list to be used later
    tweets_holding_list.append((tweet.source, tweet.user.statuses_count,      
    tweet.user.followers_count, tweet.user.verified))

# Applying the extract_tweepy_tweet_info_efficient function to store tweet data in the tweets_holding_list
tweets_df_test_efficient.apply(extract_tweepy_tweet_info_efficient, axis=1)

# Creating new columns to store the data that's currently being held in tweets_holding_list
tweets_df_test_efficient[['Tweet Source', 'User Tweet Count', 'Follower Count', 'User Verified Status']] = pd.DataFrame(tweets_holding_list)

太好了,不用每次都请求 Tweepy 的 API,您可以发送一个请求,然后一次性修改您的数据框。如果您发现自己需要多种属性,这将更加高效,并最终为您节省大量时间。

以上就是我关于 Tweepy 和 GetOldTweets3 的高级教程,以及使用 Tweepy 和 GetOldTweets3 的方法。希望你的大部分问题能在我之前的文章或者这篇文章中得到解答。如果你有具体的问题,在谷歌上找不到答案,或者想联系我。我在 LinkedIn 上有空。

参考

如果你感兴趣,注册我们的 Socialscrapr 邮件列表:【https://upscri.be/3kcmqx

如果你想要一个 GetOldTweets3 替代品的 snscrape 抓取文章:https://medium . com/better-programming/how-to-scrape-tweets-with-snscrape-90124 ed 006 af

之前的基础 twitter 抓取文章:https://towardsdatascience . com/how-to-scrape-tweets-from-Twitter-59287 e 20 f0f 1

包含本教程的 Twitter scraper 的 GitHub:https://GitHub . com/martink beck/TwitterScraper/tree/master/adv scraper

GitHub 包含了我的基础和高级教程 Twitter scraper 的:https://github.com/MartinKBeck/TwitterScraper

随 Tweepy 提供的各种 API:https://developer.twitter.com/en/products/products-overview

tweepy GitHub:【https://github.com/tweepy/tweepy

getoldtweets 3 GitHub:【https://github.com/Mottl/GetOldTweets3

使用 searchtweets 访问 Twitter 的 Premium/Enterprise API 的教程文章:https://Luca hammer . com/2019/11/05/collecting-old-tweets-with-the-Twitter-Premium-API-and-python/

如何刮暗网

原文:https://towardsdatascience.com/how-to-scrape-the-dark-web-53145add7033?source=collection_archive---------4-----------------------

在 Mac OSX 上使用 Python、Selenium 和 TOR 清理黑暗网络

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料来源:Pexels.com

警告:访问黑暗网络可能是危险的!请自担风险继续,并采取必要的安全预防措施,如禁用脚本和使用 VPN 服务。

介绍

对大多数用户来说,谷歌是探索互联网的门户。但是,deep web 包含不能被 Google 索引的页面。在这个空间中,隐藏着黑暗网络——匿名网站,通常被称为隐藏服务,从事从毒品到黑客到人口贩运的犯罪活动。

黑暗网络上的网站 URL 不遵循惯例,通常是由字母和数字组成的随机字符串,后跟。洋葱子域。这些网站需要 TOR 浏览器解析,无法通过 Chrome 或 Safari 等传统浏览器访问。

查找隐藏服务

抓取黑暗网络的第一个障碍是找到要抓取的隐藏服务。如果你已经知道你想要抓取的网站的位置,你很幸运!这些网站的 URL 通常是不可搜索的,并且是在人与人之间传递的,无论是面对面的还是在线的。幸运的是,有几种方法可以用来找到这些隐藏的服务。

方法 1:目录

包含指向隐藏服务的链接的目录在暗网和明网上都存在。这些目录可以给你一个很好的方向,但往往会包含更多众所周知的服务,更容易找到的服务。

方法 2:滚雪球抽样

雪球抽样是一种抓取方法,它获取一个种子网站(比如您从目录中找到的网站),然后抓取该网站以查找其他网站的链接。收集完这些链接后,爬虫将继续对这些站点进行搜索。这种方法能够找到目录中没有列出的隐藏服务。此外,这些网站更有可能吸引严重的罪犯,因为它们的存在并不透明。

虽然推荐使用滚雪球抽样方法来查找隐藏的服务,但是它的实现超出了本文的范围。我已经在这里写了第二篇关于雪球取样黑暗网络的文章。

环境设置

在确定了要收集的隐藏服务之后,需要设置环境。本文涵盖了 Python、Selenium、TOR 浏览器和 Mac OSX 的使用。

TOR 浏览器

TOR 浏览器是一种使用 TOR 网络的浏览器,允许我们使用. onion 子域解析网站。TOR 浏览器可以在这里下载

虚拟专用网络

在爬行黑暗网络时运行 VPN 可以为您提供额外的安全性。虚拟专用网络(VPN)不是必需的,但强烈建议使用。

计算机编程语言

对于本文,我假设您已经在自己的机器上安装了 python,并使用了自己选择的 IDE。如果没有,网上可以找到很多教程。

熊猫

Pandas 是一个数据操作 Python 包。Pandas 将用于存储和导出刮到 csv 文件的数据。通过在终端中键入以下命令,可以使用 pip 安装 Pandas:

pip install pandas

Selenium 是一个浏览器自动化 Python 包。Selenium 将用于抓取网站和提取数据。Selenium 可以通过在终端中键入以下命令来使用 pip 进行安装:

pip install selenium

壁虎

为了让 selenium 自动化浏览器,它需要一个驱动程序。因为 TOR 浏览器在 Firefox 上运行,我们将使用 Mozilla 的 Geckodriver。你可以在这里下载驱动。下载后,解压驱动程序,并将其移动到您的~/中。本地/bin 文件夹。

Firefox 二进制文件

TOR 浏览器的 Firefox 二进制文件的位置也是需要的。要找到它,右键单击应用程序文件夹中的 TOR 浏览器,然后单击显示内容。然后导航到 Firefox 二进制文件并复制完整路径。将此路径保存在某个地方以备后用。

履行

现在你已经设置好了你的环境,你可以开始写你的 scraper 了。

首先,从 selenium 导入 web 驱动程序和 FirefoxBinary。还进口熊猫当 pd。

from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
import pandas as pd

创建一个变量“binary ”,并将其设置为您之前保存的 Firefox 二进制文件的路径。

binary = FirefoxBinary(*path to your firefox binary*)

设置 web 驱动程序使用 Firefox 并传递二进制变量。

driver = webdriver.Firefox(firefox_binary = binary)

创建一个变量“url ”,并将其设置为您希望抓取的隐藏服务的 url。

url = *your url*

打开 TOR 浏览器并获取 url。

driver.get(url)

你现在可以像抓取任何网站一样抓取隐藏的服务!

基本刮硒技术

无论你是初学 Selenium 还是需要刷一下,你都可以使用这些基本技巧来有效地刮网站。其他硒刮教程可以在网上找到。

查找元素

Selenium 抓取的一个关键部分是定位 HTML 元素来收集数据。在 Selenium 中有几种方法可以做到这一点。一种方法是使用类名。为了找到一个元素的类名,可以右键单击它,然后单击 inspect。下面是一个通过类名查找元素的例子。

driver.find_element_by_class_name("postMain")

还可以通过元素的 XPath 来查找元素。XPath 表示元素在 HTML 结构中的位置。您可以在 inspect 界面的 HTML 项目的右键菜单中找到元素的 XPath。下面是一个通过 XPath 查找元素的例子。

driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/div/div[1]/div/a[1]')

如果要查找多个元素,可以用“find_elements”代替“find_element”。下面是一个例子。

driver.find_elements_by_class_name("postMain")

获取元素的文本

您可以使用 text 函数检索元素的文本。下面是一个例子。

driver.find_element_by_class_name('postContent').text

存储元素

您可以通过将元素保存在变量中,然后将该变量追加到列表中来存储元素。下面是一个例子。

post_content_list = []
postText = driver.find_element_by_class_name('postContent').text
post_content_list.append(postText)

在页面间爬行

一些基于页面的网站会在 URL 中包含页码。您可以在一个范围内循环并更改 url 来抓取多个页面。下面是一个例子。

for i in range(1, MAX_PAGE_NUM + 1):
  page_num = i
  url = '*first part of url*' + str(page_num) + '*last part of url*'
  driver.get(url)

导出到 CSV 文件

在抓取页面并将数据保存到列表中之后,您可以使用 Pandas 将这些列表导出为表格数据。下面是一个例子。

df['postURL'] = post_url_list
df['author'] = post_author_list
df['postTitle'] = post_title_listdf.to_csv('scrape.csv')

防爬行措施

许多隐藏服务采用反爬行措施来保持信息秘密和避免 DDoS 攻击。你会遇到的最常见的措施是验证码。虽然存在一些验证码自动解算器,但隐藏服务经常会使用解算器无法传递的独特验证码类型。下面是一个在论坛上找到的验证码的例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:暗网论坛

如果在特定的时候需要验证码(比如第一次连接到服务器),可以使用 Selenium 中的隐式等待功能。该功能将等待预定的时间,直到可以执行下一个动作。下面是一个使用中的例子,Selenium 将一直等待,直到找到类名为“postMain”的元素。

driver.implicitly_wait(10000)
driver.find_element_by_class_name("postMain")

其他时候,如果服务器识别出你是机器人,它就会停止为你服务。为了绕过这一点,将网站分块抓取,而不是一次全部抓取。您可以将数据保存在不同的 csv 文件中,然后使用 Pandas concat 函数将它们与额外的 python 脚本相结合。下面是一个例子。

import pandas as pddf = pd.read_csv('scrape.csv')
df2 = pd.read_csv('scrape2.csv')
df3 = pd.read_csv('scrape3.csv')
df4 = pd.read_csv('scrape4.csv')
df5 = pd.read_csv('scrape5.csv')
df6 = pd.read_csv('scrape6.csv')frames = [df, df2, df3, df4, df5, df6]result = pd.concat(frames, ignore_index = True)result.to_csv('ForumScrape.csv')

讨论

与刮擦表面网相比,刮擦暗网具有独特的挑战。然而,它相对尚未开发,可以提供出色的网络犯罪情报操作。虽然隐藏服务通常采用反爬行措施,但这些措施仍然可以被绕过,并提供有趣和有用的数据。

我想重申,刮暗网可能是危险的。确保你采取了必要的安全措施。请继续研究黑暗网络上的安全浏览。我对发生的任何伤害不负任何责任。

如何从 Twitter 上抓取推文

原文:https://towardsdatascience.com/how-to-scrape-tweets-from-twitter-59287e20f0f1?source=collection_archive---------1-----------------------

一个基本的 Twitter 抓取教程

使用 Python 从 Twitter 抓取推文的快速介绍

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片来自 P exels

概观

社交媒体可以成为消费者情绪方面的数据金矿。Twitter 等平台有助于保存有用的信息,因为用户可能会发布未经过滤的意见,这些意见很容易被检索到。将这些信息与其他公司内部信息相结合,有助于洞察人们对公司、产品等的总体看法。

本教程旨在简单快速地介绍如何使用 Tweepy 的 Twitter API 或 Dmitry Mottl 的 GetOldTweets3 从 Python 中抓取 tweets。为了给本教程提供指导,我决定集中在两个方面:抓取特定用户的推文和从一般文本搜索中抓取推文。

由于对抓取推文的非编码解决方案感兴趣,我的团队正在创建一个应用程序来满足这一需求。是的,这意味着你不必编写代码来收集数据!我们目前正在对我们的应用 Socialscrapr 进行 Alpha 测试。如果您想参与或在下一个测试阶段开放时被联系,请注册我们下面的邮件列表!

Tweepy vs GetOldTweets3

十二岁

在我们开始实际的抓取之前,了解这两个库都提供了什么是很重要的,所以让我们来分析一下这两个库之间的区别,以帮助您决定使用哪一个。

Tweepy 是一个用于访问 Twitter API 的 Python 库。Tweepy 提供了几种不同类型和级别的 API 访问,如这里的所示,但这些都是针对非常具体的用例。Tweepy 能够完成各种任务,不仅仅是查询 tweets,如下图所示。出于相关性的考虑,我们将只关注使用这个 API 来抓取 tweets。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过 Tweepy 的标准 API 提供的各种功能列表。

使用 Tweepy 抓取推文有局限性。标准 API 仅允许您检索 7 天前的推文,并且仅限于在 15 分钟的窗口内抓取 18,000 条推文。但是,可以增加该限制,如这里的所示。此外,使用 Tweepy,你最多只能返回 3200 条用户最近的推文。使用 Tweepy 对于那些试图利用 Twitter 的其他功能、进行复杂查询或者希望为每条推文提供最广泛信息的人来说非常有用。

GetOldTweets3

更新:由于 TWITTER 的 API 发生变化,GETOLDTWEETS3 不再运行。SNSCRAPE 已经成为一个免费库的替代品,你可以使用它来清除 TWEEPY 的免费限制。我的文章在这里可用为SNSCRAPE

GetOldTweets3 由 Dmitry Mottl 创建,是 Jefferson Henrqiue 的 GetOldTweets-python 的改进分支。它不提供 Tweepy 拥有的任何其他功能,而是只专注于查询 Tweepy,并且没有 Tweepy 相同的搜索限制。这个包允许你检索大量的推文和一周前的推文。但是,它没有提供 Tweepy 拥有的信息量。下图显示了使用这个包可以从 tweets 中检索到的所有信息。同样值得注意的是,到目前为止,使用 GetOldTweets3 从 tweet 访问地理数据还有一个未解决的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GetOldTweet3 的 Tweet 对象中可检索的信息列表。

使用 GetOldTweets3 是一个很好的选择,对于那些正在寻找一种快速简洁的抓取方式的人来说,或者想要解决标准 Tweepy API 搜索限制的人来说,可以抓取大量的 Tweepy 或超过一周的 tweet。

虽然他们关注的是非常不同的事情,但这两种选择很可能足以满足大多数人通常的大部分需求。直到你有了明确的目标,你才真正需要选择使用哪一个选项。

好了,解释够了。这是一个刮擦教程,所以让我们进入编码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片来自像素

更新:我写了一篇后续文章,更深入地探讨了如何从推文中提取更多信息,比如用户信息,以及细化对推文的查询,比如按位置搜索推文。如果你读了这一节,并决定你需要更多,我的后续文章可用 在这里

以下章节的 Jupyter 笔记本在我的 GitHub 这里 都有。我创建了从这些示例查询中导出 CSV 文件的函数。

用 Tweepy 刮

Tweepy 的抓取分为两个部分,因为它需要 Twitter 开发人员证书。如果您已经从以前的项目证书,那么你可以忽略这一部分。

获取 Tweepy 的凭据

为了获得证书,你必须在这里申请成为 Twitter 开发者。这需要你有一个 Twitter 账户。申请会问各种各样关于你想做什么样的工作的问题。不要苦恼,这些细节不必涉及广泛,过程也相对容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Twitter 开发者登陆页面。

完成申请后,审批过程相对较快,应该不会超过几天。获得批准后,您需要登录并在开发人员仪表板中设置开发环境,然后查看该应用程序的详细信息,以检索您的开发人员凭据,如下图所示。除非您特别请求访问其他提供的 API,否则您现在将能够使用标准的 Tweepy API。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tweepy 开发人员凭据。

使用 Tweepy 刮擦

太好了,你有了 Twitter 开发者证书,终于可以开始抓取一些推文了。

设置 Tweepy 授权:

在开始之前,Tweepy 必须授权你有资格使用它的 API。下面的代码片段是一个人如何授权自己。

consumer_key = "XXXXXXXXX"
consumer_secret = "XXXXXXXXX"
access_token = "XXXXXXXXX"
access_token_secret = "XXXXXXXXX"auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth,wait_on_rate_limit=True)

抓取特定 Twitter 用户的推文:

我关注的搜索参数是 id 和 count。Id 是特定 Twitter 用户的@ username,count 是您想要从特定用户的时间表中抓取的最近推文的最大数量。在这个例子中,我使用 Twitter 首席执行官的@jack 用户名,选择抓取他最近的 100 条推文。大部分的刮码都比较快,比较直接。

username = 'jack'
count = 150try:     
 # Creation of query method using parameters
 tweets = tweepy.Cursor(api.user_timeline,id=username).items(count)

 # Pulling information from tweets iterable object
 tweets_list = [[tweet.created_at, tweet.id, tweet.text] for tweet in tweets]

 # Creation of dataframe from tweets list
 # Add or remove columns as you remove tweet information
 tweets_df = pd.DataFrame(tweets_list)except BaseException as e:
      print('failed on_status,',str(e))
      time.sleep(3)

如果您想进一步定制您的搜索,您可以在这里查看 api.user_timeline 方法中可用的其余搜索参数

从文本搜索查询中抓取推文:

我重点关注的搜索参数是 q 和 count。q 应该是你想要搜索的文本搜索查询,count 也是你想要从这个特定的搜索查询中抓取的最近的 tweets 的最大数量。在这个例子中,我收集了与 2020 年美国大选相关的 100 条最新推文。

text_query = '2020 US Election'
count = 150try:
 # Creation of query method using parameters
 tweets = tweepy.Cursor(api.search,q=text_query).items(count)

 # Pulling information from tweets iterable object
 tweets_list = [[tweet.created_at, tweet.id, tweet.text] for tweet in tweets]

 # Creation of dataframe from tweets list
 # Add or remove columns as you remove tweet information
 tweets_df = pd.DataFrame(tweets_list)

except BaseException as e:
    print('failed on_status,',str(e))
    time.sleep(3)

如果您想进一步定制您的搜索,您可以在此处查看 api.search 方法中可用的其余搜索参数。

推文中还有哪些信息是可以获取的?

使用 Tweepy 进行查询的优势之一是 tweet 对象中包含的信息量。如果你对获取我在本教程中选择的信息以外的其他信息感兴趣,你可以在 Tweepy 的 tweet 对象这里查看完整的信息列表。为了展示获取更多信息是多么容易,在下面的例子中,我创建了一个包含以下信息的 tweet 列表:创建时间、tweet id、tweet 文本、与 tweet 相关联的用户,以及在检索 tweet 时有多少收藏夹。

tweets = tweepy.Cursor(api.search, q=text_query).items(count)# Pulling information from tweets iterable 
tweets_list = [[tweet.created_at, tweet.id, tweet.text, tweet.user, tweet.favorite_count] for tweet in tweets]# Creation of dataframe from tweets list
tweets_df = pd.DataFrame(tweets_list)

用 GetOldTweets3 抓取

更新:由于 TWITTER 的 API 发生变化,GETOLDTWEETS3 不再运行。SNSCRAPE 已经成为一个免费库的替代品,你可以使用它来清除 TWEEPY 的免费限制。我的文章在这里可用为SNSCRAPE

使用 GetOldTweets3 不像 Tweepy 那样需要任何授权,只需要 pip 安装库就可以马上上手。

抓取特定 Twitter 用户的推文:

我关注的两个变量是用户名和计数。在这个例子中,我们使用 setUsername 方法从特定用户那里抓取 tweets,并使用 setMaxTweets 设置要查看的最近 tweets 的数量。

username = 'jack'
count = 2000# Creation of query object
tweetCriteria = got.manager.TweetCriteria().setUsername(username)\
                                        .setMaxTweets(count)
# Creation of list that contains all tweets
tweets = got.manager.TweetManager.getTweets(tweetCriteria)# Creating list of chosen tweet data
user_tweets = [[tweet.date, tweet.text] for tweet in tweets]# Creation of dataframe from tweets list
tweets_df = pd.DataFrame(user_tweets)

从文本搜索查询中抓取推文:

我关注的两个变量是 text_query 和 count。在这个例子中,我们使用 setQuerySearch 方法从文本查询中抓取 tweets。

text_query = 'USA Election 2020'
count = 2000# Creation of query object
tweetCriteria = got.manager.TweetCriteria().setQuerySearch(text_query)\
                                            .setMaxTweets(count)
# Creation of list that contains all tweets
tweets = got.manager.TweetManager.getTweets(tweetCriteria)# Creating list of chosen tweet data
text_tweets = [[tweet.date, tweet.text] for tweet in tweets]# Creation of dataframe from tweets list
tweets_df = pd.DataFrame(text_tweets)

通过组合 TweetCriteria 搜索参数,可以进一步定制查询。所有当前可用的搜索参数如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当前 TweetCriteria 搜索参数。

使用多个搜索参数的查询示例:

以下堆叠查询将返回 2019 年 1 月 1 日至 2019 年 10 月 31 日之间发布的 2000 条与 2020 年美国大选相关的推文。

text_query = 'USA Election 2020'
since_date = '2019-01-01'
until_date = '2019-10-31'
count = 2000# Creation of query object
tweetCriteria = got.manager.TweetCriteria().setQuerySearch(text_query)
.setSince(since_date).setUntil(until_date).setMaxTweets(count)# Creation of list that contains all tweets
tweets = got.manager.TweetManager.getTweets(tweetCriteria)# Creating list of chosen tweet data
text_tweets = [[tweet.date, tweet.text] for tweet in tweets]# Creation of dataframe from tweets list
tweets_df = pd.DataFrame(text_tweets)

如果你想联系我,不要害怕在 LinkedIn 上联系我

参考

如果你感兴趣,注册我们的 Socialscrapr 邮件列表:https://upscri.be/3kcmqx

我的后续文章深入研究了这两个包:https://towards data science . com/how-to-scrape-more-information-from-tweets-on-Twitter-44fd 540 b8 a1f

帮助设置并提供几个示例查询的 snscrape 文章:https://medium . com/better-programming/how-to-scrape-tweets-with-snscrape-90124 ed 006 af

包含本教程的 Twitter 抓取器的 GitHub:https://GitHub . com/martink beck/TwitterScraper/tree/master/basics craper

增加 Tweepy 的标准 API 搜索限制:https://bhaskarvk . github . io/2015/01/how-to-use-twitters-search-rest-API-most-effectively。/

tweepy GitHub:https://github.com/tweepy/tweepy

getoldtweets 3 GitHub:https://github.com/Mottl/GetOldTweets3

如何用 Python 抓取 Youtube 评论

原文:https://towardsdatascience.com/how-to-scrape-youtube-comments-with-python-61ff197115d4?source=collection_archive---------8-----------------------

从头开始构建 NLP 数据库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://unsplash.com/photos/UfseYCHvIH0

任何自然语言处理项目的第一部分都是获取数据库。事实上,清洗和标记整个数据集只适用于 Kaggle,而不是在现实生活中。

当谈到情感分析项目时,我觉得 Youtube 评论代表了一个巨大的、未被充分利用的数据来源。您可以轻松获得所有观众对某个特定主题(如视频)的看法。

了解了所有这些,下面是如何一步一步地从 Youtube 视频中抓取评论。

以下是我将收集评论的视频:【https://www.youtube.com/watch?v=kuhhT_cBtFU】T2&t = 2s

这是 CNN 发布的一段视频,显示了 6 月 12 日发生在亚特兰大的逮捕和枪杀 Rayshard Brooks 的事件。

所以首先,别忘了从右边这里安装一个 from 驱动。你还应该安装谷歌浏览器。现在已经完成了,让我们导入我们需要的库:

import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

这里需要 Selenium,因为 Youtube 是 JavaScript 渲染的,这是 BeautifulSoup 无法处理的。

所有其他模块都是必需的,因为 Youtube 评论是动态加载的,这意味着它们只有在你向下滚动页面时才可见。因此,我们需要一个能够:

  • 向下滚动
  • 等待评论出现
  • 删除评论
  • 重复我们想要的任何范围。

下面是实现这一点的循环。

这就是它的工作原理:

  1. driver.get 函数访问你想要的 URL。
  2. 使用 wait.untilEC . visibility _ of _ element _ located向下滚动并等待,直到所有内容都可见。
  3. 通过在当前查看的页面中找到所有的 #content-text 元素(这就是我们想要的,正如你在下面看到的)来收集评论。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.将注释添加到数据列表中。

要从另一个视频中收集评论,你只需更改网址即可!就这么简单。

在这里,我重复循环 200 次,收集了大约 1400 条评论。数据如下所示:

import pandas as pd   
df = pd.DataFrame(data, columns=['comment'])
df.head()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这就是了。现在,您将能够使用这些数据来启动您的 NLP 项目。

感谢阅读,我希望这有所帮助!

成为会员:https://francoisstamant.medium.com/membership

如何用 KDTree 搜索数据

原文:https://towardsdatascience.com/how-to-search-data-with-kdtree-aad5c82ebd99?source=collection_archive---------38-----------------------

给你一个任务,在一个巨大的数据集中查找某个范围内的数据,你能快速有效地找到它吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯托夫·鲁舍夫在 Unsplash 上拍摄的照片

动机

想象一下,你记录了你所在地区每天的游客数量。要求你报告从 2 月 2 日到 3 月 2 日的旅客人数。假设这些数据被排序,你如何在短时间内找到这个范围内的数据?这是一个范围搜索问题的陈述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

这似乎是一个简单的问题。我们能从左到右检查所有数据吗?是的,但是如果我们有大量的大数据,这将花费大量的时间,还没有考虑到我们的数据可能是 k 维的**。**

这个问题可以像 2D 地图一样推广到二维。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

我们可以将这个空间分成一个规则的网格 MxM,而不是在这个空间中搜索每一厘米。然后确定完全落在范围内的单元格和与范围相交的单元格。

我们将包括完全落在范围内的单元格的所有数据,并检查所有未完全包括的单元格的单个数据。这种方法的伟大之处在于,我们可以快速排除不在范围内的数据并缩小搜索范围。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

但是,如果我们的数据是不一致的,这意味着在一些地区有数据的而在其他地区只有很少的数据,那该怎么办呢?

  • 如果我们选择的网格太少(M 小),我们将在一个单元格中有许多数据点。性能将接近顺序搜索之一。
  • 如果我们选择许多网格(M 大),我们可能会有太多的空单元格和空间浪费。

由于在现实生活中,我们经常需要处理像地图这样的非均匀数据,我们需要一种更好的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阿切努比斯取回

当处理如上所述的集群数据时,使用规则的网格会导致糟糕的行为。这就是为什么保持预先分割数据的想法是理想的,但是要根据数据密度进行分割!

一个你可能不知道的小秘密:我将介绍的数据结构是从 sklearn 创建对 KNearest 邻居的健壮性的实现,而不是众所周知的 KNearest 邻居算法的实现。

空间划分树

在考虑 k 维之前,我们先从 2 维开始。我们得到这样的数据点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

我们将在轴(x 或 y)上的中值处分割数据,而不是将数据分割成等宽的网格。我们可以从沿着 y 轴的中间值开始,将平面分成两半。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

然后在平面的每一半中,通过选择穿过每个细分中的中值的垂直线,继续将细分分成两个相等的细分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

我们在两个区域中递归地重复相同的过程,直到在相应的分割元素中不再有点(或者我们决定的点数)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

使用这种方法,我们将能够根据数据的密度对其进行分区!那么这个方法的底层数据结构是什么呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

它与二叉查找树非常相似,但又不完全相同。

  • 由于数据首先在 y 轴上拆分,因此 y 是根节点。
  • 子对象是 x,因为每个半平面都在 x 轴上分割。
  • 左侧子树节点的所有 x 值都低于根节点的 x 值。
  • 右边的子树节点的所有 x 值都高于根节点的 x 值。
  • 在两个轴之间交替,直到我们到达极限。

查找范围内的数据

目前为止听起来不错。但是我们如何使用这种数据结构来搜索特定范围内的数据呢?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

好消息是,一旦我们创建了一个二维树,查找数据就变得简单多了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者照片

我们从树根开始访问树节点:

  • 如果节点在查询范围内,则将其添加到答案中****
  • 如果查询的范围与左子树定义的区域相交,则探索它
  • 如果查询的范围与左子树定义的区域相交,则探索它

KdTree 示例

假设我们有一个 ECOBICI 站点(墨西哥城市自行车公共共享系统)位置的数据集。我们的任务是找到一定范围内的数据。正如我们所看到的,一些地区的站点比其他地区更密集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

要查看如何使用 Kdtree 拆分上面的数据,克隆这个 repo

git clone [https://github.com/khuyentran1401/kdtree-implementation](https://github.com/khuyentran1401/kdtree-implementation)

然后 cd 到本地机器中的 kdtree-implementation 目录并运行

python ecobi.py

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您应该看到上面数据的 kd 树表示。线条越多的区域表示该区域的集群越密集。

要查找特定区域的范围,请运行

python findrange.py

您应该会看到输入范围的提示。假设您在 x 轴上选择了-1 到 1 之间的范围,在 y 轴上选择了-1 到 1 之间的范围,您应该会看到该范围内的数据坐标。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

厉害!使用 KdTree,您可以在几秒钟内找到特定范围内的数据。尽管我们没有介绍如何使用 KdTree 搜索最近点,但是 KdTree 也可以有效地用于 Sklearn 的 KNearestNeighbor。

结论

恭喜你!你已经学习了什么是 KdTree 及其应用。要了解如何实现它并将其用于您的数据,请查看我的 Github repo

我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以通过 LinkedInTwitter 与我联系。

如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:

** [## 凸包:包装数据的创新方法

如何利用包装算法实现数据可视化

towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 如何用 Github 组织你的数据科学文章

被新信息淹没?现在,您可以轻松地跟踪文章并为其创建自定义注释

towardsdatascience.com](/how-to-organize-your-data-science-articles-with-github-b5b9427dad37) [## 如何在 10 分钟内为您的数据科学产品组合创建一个优雅的网站

你需要做的就是编辑

towardsdatascience.com](/how-to-create-an-elegant-website-for-your-data-science-portfolio-in-10-minutes-577f77d1f693) [## 如何用图论可视化社交网络

找出《权力的游戏》中的影响者

towardsdatascience.com](/how-to-visualize-social-network-with-graph-theory-4b2dc0c8a99f) [## 如何用 Word2Vec 解决类比问题

美国之于加拿大,就像汉堡之于 _?

towardsdatascience.com](/how-to-solve-analogies-with-word2vec-6ebaf2354009)**

如何获得你真正想要的数据科学职位

原文:https://towardsdatascience.com/how-to-secure-a-data-science-role-you-actually-want-169afc52019b?source=collection_archive---------58-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

布鲁斯·马斯在 Unsplash 上的照片

当承担与人工智能相关的角色时,必须做的事情没有被充分提及

数据科学,21 世纪最性感的工作。这种描述促使一个人停止他们正在做的任何事情,以修改长期职业道路。纯粹的勇气和决心体现在开发、改进和自我营销中,以提升在行业中获得职位的前景。然而,就像很多情况一样,在性感的生活之前是丑陋的生活。没完没了的工作申请、社交媒体上的人际关系网(在疫情之前)在大多数情况下会持续好几个月。

突然,当兴趣在自我完全消失之前升起时,一丝希望从内心升起。一个结束长期痛苦的机会,最终实现过去几个月来为完善自己付出的所有努力。

停下!正是在这一点上,许多人做出了厄运的决定。

你可能想要 21 世纪最性感的工作,但是如果你不小心的话,你可能只会得到一个荣誉头衔,“数据科学家”,而不是真正的工作。

背景

时代变了,技术也在发展。人工智能正变得越来越民主化,除了脸书、亚马逊、网飞和谷歌之外,其他公司也进入了我们所知的可能改变生活的领域。现在比以往任何时候都更清楚的是,首席执行官必须理解并利用自动化和人工智能的趋势。

老实说,许多人肯定已经开始注意到了。从医疗保健,到零售,再到体育,团队都在匆忙研究如何采用人工智能来更好地完成他们的工作。尽管如此,正如大多数快速发展的技术一样,至少可以说,人工智能激发了少校 FOMOFUD 和世仇。

“大数据就像青少年性行为:每个人都在谈论它,没有人真正知道如何去做,每个人都认为其他人都在做,所以每个人都声称他们正在做……”—丹·艾瑞里

这些因素导致了对人工智能潜力的巨大怀疑,以及一些关键的误判。然而,这些误判不仅存在于人工智能的道德规范中,而且还严重影响了渴望进入该领域的有志之士,例如许多人对人工智能抱有过高的期望。

Goldbloom 说,在这个领域工作的人会经历很多挫折。不良数据是其中一个主要原因:他们的雇主无法为他们获得结果提供必要的原材料。有些人还抱怨没有明确的问题可以回答。公司可能感觉到了机会,但他们往往不知道如何充分利用他们的数据资产。这也突显出,与数据科学家和机器学习专家一起工作的非专业管理人员缺乏技术知识。

摘自机器学习如何创造新的职业——和问题(2017) 。金融时报

数据科学家离职的原因有许多因素,但如果我们有远见,我们可以评估这些因素,并控制我们可以控制的因素,那么就更有可能降低流失率。

Jonny Brooks-Bartlett 在 2018 年创作了一个名为 的深度故事,这就是为什么这么多数据科学家离开他们的工作岗位 *,*详细描述了标题所述的内容。因此,我不会试图重新发明轮子,相反,你可能想读他的故事——我强烈建议你这样做!

弥合期望和现实之间的差距

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Modestas UrbonasUnsplash 上拍摄的照片

我们都有抱负。在马斯洛的需求层次中,我们要朝着自我实现的方向前进,其中一个步骤要求我们的安全需求得到满足,包括工作安全。

通过在线搜索,评估一家公司的愿景是否符合我们对自己的期望可能很困难。然而,当有机会与雇主坐在一起时,我们必须能够问一些我们可能会觉得不舒服的问题。换句话说,面试不仅仅是测试你,也就是被面试者,是否具备填补空缺职位所需的软硬技能。相反,受访者应该将面试视为双向对话——一种兼容性测试。从本质上说,面试者是在寻找一个有可能推动公司发展的角色,而被面试者是在试图满足他们走向自我实现的下一个阶段。

在这个阶段,了解雇主在采用人工智能方面的情况也是一个关键因素,因为他们缺乏的任何东西都可能属于你的职责范围。因此,提出问题!“你有一个数据科学家团队在研究任何有趣的问题吗?”,“他们的资深/经验丰富的数据科学家在团队中吗?”。“您有现成的数据基础架构吗?”。

问问题的目的是为了清楚地说明如果公司要雇用你,你需要为公司做些什么。请记住,一家采用新技术的公司不知道他们对新技术有什么不了解,而留下与该公司在采用人工智能方面已经在做什么有关的重要问题没有答案,可能会对你的角色实际需要产生严重影响,进而影响你对角色的满意度。

提前驾驭公司政治

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

约翰·巴克托在 Unsplash 上拍摄的照片

面对现实吧,政治主宰着组织。每个公司都有自己的文化和协议。尽管在进入一个组织之前,我们可能永远无法完全理解这一点,但当今通讯技术的进步使我们很容易对一家公司的运作有一个总体的了解。

期望走进一家公司并改变整个公司在某种程度上是相当妄想的。如果事情在你之前已经运行了很长时间,人们可能不会那么容易受到变化的影响,而这种变化可能是合理的,尽管历史已经表明,它是商业的长期杀手。

在一家公司担任一个角色之前,不仅要研究这家公司做什么,还要研究他们所服务的人、过去的员工和现在的员工的评价。是的,如果可能的话,联系他们所有人。如果一家公司不愿意有效地与客户合作,以确保他们的需求得到满足,或者如果多名员工因为认为他们的贡献没有被听到而离开,那么就必须认真考虑这是否是你想要的工作环境。

人工智能仍未在工业中得到充分发展,这意味着存在大量不确定性。许多人出于无知而不信任它,有些人有正当的理由——比如工作正被人工智能取代。因此,很大一部分工作可能是通过做一些可以提高员工信任度的小任务,让其他团队相信人工智能的好处。然而,如果一家公司的文化,根据他们如何对待过去的客户和员工来判断,没有反映出适应变化的能力,那么你在这个环境中很可能会很痛苦。

当然,你与人交流以获得洞察力的野心并不是八卦公司(不惜一切代价避免),你的目标只是减少进入公司时可能出现的惊讶因素。与其让公司按照你自己的期望发展,不如事先做尽可能多的研究,为你可能会面临的角色建立一个形象。

包裹

获得真正想要的数据科学职位的先决条件主要取决于渴望进入行业的人。如果你从未进入过这个行业,你就不太可能很好地了解这个行业对你的要求,所以你必须通过阅读各种博客和工作规范来建立这种形象,这些博客和工作规范详细说明了数据科学家的角色和职责,而且与行业中的数据科学家交谈也很有用。

尽管我们可能永远无法在进入某家公司之前真正了解它会为我们带来什么,但我们仍有责任获取尽可能多的信息,以设计出该公司工作可能会是什么样的详细的脑海形象。当我们建立起这种心理形象时,我们可以利用这种形象来确定什么样的工作从长远来看可能适合你,并寻找我们认为可能符合这一标准的公司。这并不保证我们第一次就能做对,但它确实减少了我们犯错的机会——如果我们真的犯错了,失败也没什么不好,只要我们能从我们犯的错误中吸取教训。

如果您认为我遗漏了什么,或者您想向我指出什么,或者如果您仍然不确定什么,您的反馈是有价值的。发个回应!

然而,如果你想和我联系,我在 LinkedIn 上是最活跃的,我也很乐意和你联系。

[## Kurtis Pykes -人工智能博客-走向数据科学| LinkedIn

在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有两个工作列在他们的…

www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)

你可能喜欢的其他故事:

[## 为您的数据科学事业保持动力

我们可以长期保持动力。

towardsdatascience.com](/staying-motivated-for-your-data-science-career-e845f18421e1) [## 数据科学家如何更快地学习

学会学习的有效策略

towardsdatascience.com](/how-to-learn-faster-for-data-scientist-cfd96d317ce6) [## 当你试图成为一名数据科学家时感到沮丧的原因

将最优秀的人与众不同的隐藏技能

towardsdatascience.com](/the-reason-youre-frustrated-when-trying-to-become-a-data-scientist-2d2b8b402811) [## 学习数据科学的 3 个阶段

了解学习的 3 个阶段,以及我们如何将其有效地应用于数据科学学习

towardsdatascience.com](/3-stages-of-learning-data-science-9a04e96ba415)

如何使用 Azure AD 保护 Python Flask Web APIs

原文:https://towardsdatascience.com/how-to-secure-python-flask-web-apis-with-azure-ad-14b46b8abf22?source=collection_archive---------13-----------------------

学习在 web 应用和 Azure SQL 中使用身份和令牌

1.介绍

Python Flask 是创建 web 应用程序的流行工具。使用 Azure AD,用户可以向 REST APIs 进行身份验证,并从 Azure SQL 检索数据。在这篇博客中,创建了一个示例 Python web 应用程序,如下所示:

  • 1a:用户登录 web 应用程序并获得一个令牌
  • 1b:用户调用 REST API 来请求数据集
  • 2: Web 应用程序使用令牌中的声明来验证用户对数据集的访问
  • 3: Web app 从 Azure SQL 检索数据。Web 应用程序可以配置为 a)应用程序的托管身份或 b)登录的用户身份用于数据库的身份验证

项目的代码可以在这里找到,架构可以在下面找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.使用 Azure AD 保护 Python Flask web APIs 简介。图片作者。

在本博客的剩余部分,将执行以下步骤:

  • 步骤 1:获取令牌并使用令牌调用 api
  • 步骤 2:验证令牌中的声明
  • 步骤 3a:应用程序管理的身份认证
  • 步骤 3b:登录的用户通过认证

要了解如何使用授权或应用程序权限访问 Azure Function 后端,请参见我的后续博客,它与我的博客共享相同的 git repo。

步骤 1:获取令牌并使用令牌调用 api

此示例展示了如何使用 Flask 和 MSAL Python 构建一个 Python web 应用程序,该应用程序登录用户并访问 Azure SQL 数据库。有关协议在这个场景和其他场景中如何工作的更多信息,请参见 Azure AD 的认证场景。在该步骤中,执行以下子步骤:

  • 1.1:准备工作
  • 1.2:创建和配置应用程序注册
  • 1.3:配置 python webapp 项目
  • 1.4:运行示例

步骤 1 关注架构的以下部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 1:获取令牌并使用令牌调用 api。图片作者。

1.1:准备工作

若要运行此示例,您需要:

  • Python 2.7+Python 3+
  • Azure 活动目录(Azure AD)租户。有关如何获得 Azure AD 租户的更多信息,请参见如何获得 Azure AD 租户。
  • Git 克隆下面的项目:git clone https://github.com/rebremer/ms-identity-python-webapp-backend.git或者下载并解压存储库。zip 文件。

1.2:创建和配置应用程序注册

创建和配置应用程序注册,如下所示:

  • 使用此链接中的步骤创建应用注册以创建应用注册。两个备注:
  • 使用http://localhost/getAToken作为回复网址。如果您在创建过程中没有这样做,可以使用应用程序注册的验证选项卡添加它
  • 转到认证并启用隐式授权中的选项 ID 令牌
  • 转到证书&秘密创建一个秘密。复制客户端 id 和客户端密码

1.3:配置 pythonwebapp 项目

  1. 打开app_config.py文件,改变下面的变量。
  2. 在步骤 1.2 中创建应用程序注册时,找到文本<<Enter_the_Client_Secret_here>> ,并将其替换为您的应用程序密码。
  3. 找到文本<<Enter_the_Tenant_Name_Here>>,用你的 Azure AD 租户名称替换现有值。
  4. 找到文本<<Enter_the_Application_Id_here>>并用步骤 1.2 中应用程序注册的应用程序 ID (clientId)替换现有值。

1.4:运行示例

您需要使用 pip 安装依赖项,如下所示:

$ pip install -r requirements.txt

使用以下命令从 shell 或命令行运行 app.py:

flask run --host localhost --port 5000

当 app 在本地运行时,可以通过 localhost:5000(不是 127.0.0.1:5000)访问。在步骤 1 之后,用户可以使用他们的 Azure AD 凭据登录。在下一步中,设置用户角色,这些角色可用于验证是否允许用户使用 API 检索数据。

步骤 2:验证令牌中的声明

在此步骤中,可以设置令牌中的声明,令牌可以只是 web 应用程序,以验证是否允许用户调用 api。有关令牌声明的更多信息,请参见链接。执行以下子步骤:

  • 2.1:在应用配置中设置配置
  • 2.2:向清单添加角色
  • 2.3:将用户分配给角色

第 2 步关注架构的后续部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 2:验证令牌中的声明。图片作者。

2.1:在应用配置中设置配置

索赔验证是一个可选步骤,可以使用app_config.py文件中的以下设置启用:AAD_ROLE_CHECK = True

2.2:向清单添加角色

按照本教程中的步骤,向步骤 1.2 中创建的应用注册添加角色。显然,应使用以下方法:

"appRoles": [
  {
    "allowedMemberTypes": ["User"],
    "description": "Basic user, only read product data from SQLDB",
    "displayName": "basic_user_access",
    "id": "a8161423-2e8e-46c4-9997-f984faccb625",
    "isEnabled": true,
    "value": "basic_user_access"
  },
  {
    "allowedMemberTypes": ["User"],
    "description": "Premium user, read all data from SQLDB",
    "displayName": "premium_user_access",
    "id": "b8161423-2e8e-46c4-9997-f984faccb625",
    "isEnabled": true,
    "value": "premium_user_access"
  }
],

2.3:将用户分配给角色

链接中解释了用户的分配。作为测试,可以创建两个用户。用户 1 被分配了basic_user_access,而用户 2 获得了premium_user_access角色。

下一步,创建 Azure SQL 数据库,并使用应用程序身份从数据库中检索数据。

步骤 3a:应用程序管理的身份认证

在此步骤中,应用程序的托管身份用于检索数据,该数据链接到在步骤 1 中创建的应用程序注册。执行以下子步骤:

  • 3a.1:创建 Azure SQL 数据库
  • 3a.2:在应用配置中设置配置

步骤 3a 关注架构的以下部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 3a:向 Azure SQL 应用托管身份认证。图片作者。

3a.1:创建 Azure SQL 数据库

使用这个链接创建一个 Azure SQL DB,其中可以选择最便宜的 SKU(基本)。确保完成以下工作:

  • AdvertureWorks 作为示例数据库安装,可以选择最便宜的数据库(SKU 基本)。
  • 使用正确的读者角色将应用程序身份作为用户添加到 Azure SQL 数据库,请参见以下示例
CREATE USER [<<Name of app registration>>] FROM EXTERNAL PROVIDER;
EXEC sp_addrolemember [db_datareader], [<<Name of app registration>>];

3a.2:在应用配置中设置配置

backend_settings 需要设置为 database。还要确保连接中填入了您的设置。由于使用了 app 的 MI,application_permissions 需要指向"https://database.windows.net//。默认”在app_config.py文件中,也见下文。

# 2\. Type of BACKEND
#
# Option 2a. Database
BACKEND_SETTINGS = {"Type": "Database", "Connection":{"SQL_SERVER": "<<Enter_logical_SQL_server_URL_here>>.database.windows.net", "DATABASE": "<<Enter_SQL_database_name_here>>"}}# Option 3a. Delegated user is used to authenticate to Graph API, MI is then used to authenticate to backend...APPLICATION_PERMISSIONS = ["https://database.windows.net//.default"]

现在,应用程序可以按照步骤 1.4 中的描述运行。当您点击链接(Premium users only) Get Customer data from Database时,将检索客户数据。随后,当点击链接Get Product data from Database时,将检索产品数据(前提是在步骤 2 中为用户正确设置了声明或者检查被禁用)

在此步骤中,应用程序的身份用于检索数据。但是,用户的身份也可以通过(AAD passthrough)从数据库中检索数据。

步骤 3b:登录的用户通过认证

在该步骤中,用户本身的身份用于检索数据。这意味着在步骤 1 中创建的用于登录 web 应用程序的令牌也用于对数据库进行身份验证。执行以下子步骤:

  • 3b.1:将 Azure SQL DB 范围添加到应用程序注册
  • 3b.2:将 AAD 用户添加到数据库
  • 3b.3:在应用配置中设置配置

步骤 3b 着重于体系结构的以下部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

步骤 3b:对 Azure SQL 的已登录用户直通身份验证。图片作者。

3b.1:将 Azure SQL DB 范围添加到应用程序注册

  • 修改在步骤 1.2 中创建的应用程序注册。作为委派用户拥有 Azure SQL 数据库的权限。这个在环节中有解释
  • 重要提示:Azure SQL 数据库需要管理员同意。这可以通过在权限选项卡中选择默认目录的 Grant_admin 权限来完成,也可以在运行时登录完成

3b.2:将 AAD 用户添加到数据库

因为在这个步骤中使用了 AAD passthrough,所以用户本身应该在 SQLDB 中具有适当的角色,作为外部用户和 datareader。参见下面的例子。

CREATE USER [<<AAD user email address>>] FROM EXTERNAL PROVIDER;
EXEC sp_addrolemember [db_datareader], [<<AAD user email address>>];

如果您想在数据库中的角色成员中获得更多的粒度,read_customer从 SalesLT 中读取数据。客户,而read_product从 SalesLT 读取数据。产品)

3b.3:在应用配置中设置配置

通过将 delegated_permissions 设置为[" https://SQL . azure syncapse-dogfood . net/User _ impersonation "],可以在app_config.py文件中设置 AAD 用户直通身份验证,另请参见下文

# Option 3b. Delegated user is used to authenticate to backend, graph API disabled...DELEGATED_PERMISSONS = ["https://sql.azuresynapse-dogfood.net/user_impersonation"]

现在,应用程序可以按照步骤 1.4 中的描述运行,其中可以使用登录用户的身份从数据库中检索数据。

结论

在这篇博客中,创建了一个从 SQLDB 检索数据的 Python web 应用程序。讨论了用户声明、托管身份和登录用户直通令牌,以验证和授权用户从 Azure SQL 检索数据,另请参见下面的概述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.使用 Azure AD 保护 Python Flask web APIs 结论。图片作者。

如何使用 Azure AD、密钥库和 VNETs 保护 Azure 功能

原文:https://towardsdatascience.com/how-to-secure-your-azure-function-data-processing-c9947bf724fb?source=collection_archive---------8-----------------------

使用 Azure AD、密钥库和 VNETs 保护 Azure 功能。然后使用防火墙规则和函数的托管身份连接到 Azure SQL。

A.Azure 功能安全性-简介

Azure Functions 是一个流行的工具,用来创建可以执行简单任务的小代码片段。Azure 功能可以使用队列触发器、HTTP 触发器或时间触发器来触发。Azure 函数的典型模式如下:

  • Init:从存储帐户中检索状态
  • 请求:端点被另一个应用程序/用户调用
  • 处理:使用其他 Azure 资源处理数据
  • 响应:将结果回复给呼叫者

模式如下所示,其中数据从 Azure SQL 检索并返回给应用程序/用户。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.安全 Azure 功能—简介

在这篇博客中,讨论了如何保护 Azure 函数的安全。其中,使用了 Azure AD、托管身份、密钥库、VNET 和防火墙规则。为了创建专用和隔离的 Azure 功能,也可以决定创建单独的 App 服务环境(ASE) 。然而,ASE 可能很难管理,并且涉及更多的成本。因此,在这个博客中没有使用 ASE,而是采用了常规的应用服务计划。结构如下:

  • B0。init:Azure 函数的安全存储帐户
  • B1/B3。请求-响应:对 Azure 函数的安全访问
  • B2。处理数据:从 Azure 函数安全访问 Azure SQL
  • C.结论

关于如何保护你的 Azure 数据工厂管道的详细信息,请看这篇博客。在这篇博客中讨论了部署一个定制的 docker 映像作为 Azure 函数来运行 Selenium web scraper。

B0。init:Azure 函数的安全存储帐户

Azure 函数总是附带一个支持存储帐户。在此存储帐户上,可以在文件共享中找到代码,并且日志记录被写入 blob 存储中。在这个博客中,安全帐户的保护如下:

  • Azure 功能的托管身份(MI)已启用,此 MI 用于向 Azure 密钥库进行身份验证以获取/设置机密
  • 存储密钥存储在密钥库中,而不是默认的应用程序设置中。此外,Azure 功能键存储在这个密钥库中
  • VNET 集成已启用 Azure 功能,以便所有出站流量都流经此 VNET
  • 添加了 NSG,仅允许到端口 443、1433 和目的地 Azure WestEurope 的出站流量
  • 只有 Azure Function 的 VNET 可以使用防火墙规则访问密钥库。
  • (可选)只有 Azure Function 的 VNET 可以使用防火墙规则访问支持存储帐户。请注意,这种情况是官方不支持的,请参见此处,它可能会破坏您的应用程序。使用此功能时,如果应用程序仍在工作,则应在部署到生产环境后进行明确测试,如果不工作,则应重新部署应用程序。

下面描述了在 Azure 函数模式中保护存储帐户的安全。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

B0。初始化函数安全性

这一步的代码通过使用下面找到,脚本也可以在我的 github 上找到。

**# B0_1\. Login** 
Clear-AzContext -Scope CurrentUser -Force                       Connect-AzAccount
**# B0_2\. Variables, take same id in all B0/B1B3/B2 scripts**
$id = "3405" 
$rg = "test-funappsec" + $id + "-rg"                       
$loc = "westeurope"                       
$funname = "test-funappsec" + $id + "-func"
$funstor = "testfunappsec" + $id + "stor"                       
$akv = "test-funappsec" + $id + "-akv"
$funplan = "test-funappsec" + $id + "-plan"
$vnet = "test-funappsec" + $id + "-vnet"                       
$nsg = "test-funappsec" + $id + "-nsg"                       
$subnet = "azurefunction"                       
$addressrange = "10.200.0.0"
**# B0_3\. Create resource group **                      
az group create -n $rg -l $loc                                               **# B0_4\. Create Storage account **                      
az storage account create -n $funstor -g $rg --sku Standard_LRS                                               **# B0_5\. Create VNET **                      
az network vnet create -g $rg -n $vnet --address-prefix $addressrange/16 -l $loc                                               **# B0_6\. create NSG  **                     
az network nsg create -g $rg -n $nsg                                               **# B0_7\. Create firewall rules** # Only allow outbound to WE storage, port 443 and Azure WE
az network nsg rule create -g $rg --nsg-name $nsg -n allow_we_stor_sql --priority 100 --source-address-prefixes VirtualNetwork --source-port-ranges '*' --destination-address-prefixes Storage.WestEurope --destination-port-ranges '443' '1433' --access Allow --protocol '*' --description "Allow storage West Europe 443" --direction Outbound                       
az network nsg rule create -g $rg --nsg-name $nsg -n allow_azure_internal --priority 110 --source-address-prefixes VirtualNetwork --source-port-ranges '*' --destination-address-prefixes AzureCloud.WestEurope --destination-port-ranges '*' --access Allow --protocol '*' --description "Azure we" --direction Outbound                       
az network nsg rule create -g $rg --nsg-name $nsg -n deny_all_outbound --priority 130 --source-address-prefixes '*' --source-port-ranges '*' --destination-address-prefixes '*' --destination-port-ranges '*' --access Deny --protocol '*' --description "Deny all outbound" --direction Outbound                                               **# B0_8\. Create subnet with NSG to VNET  **                     
az network vnet subnet create -g $rg --vnet-name $vnet -n $subnet --address-prefixes $addressrange/24 --network-security-group $nsg                                               **# B0_9\. Turn on firewall **                      
Update-AzStorageAccountNetworkRuleSet -ResourceGroupName $rg -Name $funstor -DefaultAction Deny                                               **# B0_10\. Set service endpoints for storage and web app to subnet   **                    Get-AzVirtualNetwork -ResourceGroupName $rg -Name $vnet | Set-AzVirtualNetworkSubnetConfig -Name $subnet -AddressPrefix $addressrange/24 -ServiceEndpoint "Microsoft.Storage", "Microsoft.Web", "Microsoft.Sql", "Microsoft.KeyVault" | Set-AzVirtualNetwork                                               
**# B0_11\. Add firewall rules to Storage Account    **                   $subnetobject = Get-AzVirtualNetwork -ResourceGroupName $rg -Name $vnet | Get-AzVirtualNetworkSubnetConfig -Name $subnet                       Add-AzStorageAccountNetworkRule -ResourceGroupName $rg -Name $funstor -VirtualNetworkResourceId $subnetobject.Id                                               **# B0_12\. Create Azure Function**                       
az appservice plan create -n $funplan -g $rg --sku P1v2 --is-linux                       az functionapp create -g $rg --os-type Linux --plan $funplan --runtime python --name $funname --storage-account $funstor                                               **# B0_13\. Turn on managed identity of Azure Function  **                     az webapp identity assign --name $funname --resource-group $rg                                               **# B0_14\. Add VNET integration**
az webapp vnet-integration add -g $rg -n $funname --vnet $vnet --subnet $subnet                                               
**# B0_15\. Create key vault     **                  
az keyvault create --name $akv --resource-group $rg --location $loc                                               **# B0_16\. Set policy such that Azure Function can read from AKV   **                    $objectid_funname = az functionapp identity show -n $funname -g $rg --query "principalId"                       
az keyvault set-policy -n $akv --secret-permissions set get list --object-id $objectid_funname                                               
**# B0_17\. Set acl on key vault  **                     
az keyvault network-rule add -n $akv -g $rg --subnet $subnet --vnet-name $vnet                                               
**# B0_18\. Get storage connection string and add to key vault   **                    $storageconnectionstring = az storage account show-connection-string -n $funstor --query "connectionString"                       
$keyref = az keyvault secret set -n storageconnectionstring --vault-name $akv --value $storageconnectionstring --query "id"                       $appkeyref = "@Microsoft.KeyVault(SecretUri=" + $keyref + ") " -replace '"',''                                               
**# B0_19\. Set app settings of function** # Function gets function keys from AKV instead of storage account     az functionapp config appsettings set --name $funname --resource-group $rg --settings AzureWebJobsSecretStorageKeyVaultConnectionString="" AzureWebJobsSecretStorageKeyVaultName=$akv AzureWebJobsSecretStorageType="keyvault"                                               az functionapp config appsettings set --name $funname --resource-group $rg --settings AzureWebJobsStorage=$appkeyref                       az functionapp config appsettings set --name $funname --resource-group $rg --settings AzureWebJobsDashboard=$appkeyref                                               **# B0_20\. Done**

B1B3。请求-响应:对函数的安全访问

默认情况下,Azure 功能键用于对 Azure 函数的请求进行身份验证。由于 Azure 功能在 web 应用中运行,因此可以为 Azure 功能启用 Azure AD 身份验证。在这篇博客中,对 Azure 函数的访问是安全的,如下所示:

  • 为 Azure 函数启用了 Azure AD,因此只有此 Azure AD 租户中的对象可以调用该函数。Azure AD 中的对象可以是用户、服务主体或托管身份
  • (可选)仅将 Azure AD 租户中可以访问该功能的特定对象列入白名单。例如,只有 Azure 数据工厂实例的托管身份可以执行一个函数(参见这个[博客](/(e.g. an ADFv2 managed identity))
  • (可选)在 Azure 功能的防火墙规则中添加访问限制

限制对 Azure 函数的访问如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

B1B3。请求-响应安全性

这一步的代码通过使用下面找到,脚本也可以在 my github 上找到。

**# B1B3_1\. Login** 
Clear-AzContext -Scope CurrentUser -Force                       Connect-AzAccount
**# B1B3_2\. Variables, take same id in all B0/B1B3/B2 scripts**
$id = "3405" # take same id in all B0/B1B3/B2 scripts                                               $rg = "test-funappsec" + $id + "-rg"                       
$funname = "test-funappsec" + $id + "-func"                                               # 0.2 connect to AAD                       
$Environment = "AzureCloud"                       
$aadConnection = Connect-AzureAD -AzureEnvironmentName $Environment                                               **# B1B3_3\. Creat App registration    **                   
# step 2 is derived from https://devblogs.microsoft.com/azuregov/web-app-easy-auth-configuration-using-powershell/                       $Password = [System.Convert]::ToBase64String($([guid]::NewGuid()).ToByteArray())                       $startDate = Get-Date                       
$PasswordCredential = New-Object -TypeName Microsoft.Open.AzureAD.Model.PasswordCredential                       $PasswordCredential.StartDate = $startDate                       $PasswordCredential.EndDate = $startDate.AddYears(10)                       $PasswordCredential.Value = $Password                       $identifier_url = "https://" + $funname + ".azurewebsites.net"                       [string[]]$reply_url = $identifier_url + "/.auth/login/aad/callback"                       $reqAAD = New-Object -TypeName "Microsoft.Open.AzureAD.Model.RequiredResourceAccess"                       $reqAAD.ResourceAppId = "00000002-0000-0000-c000-000000000000"                       $delPermission1 = New-Object -TypeName "Microsoft.Open.AzureAD.Model.ResourceAccess" -ArgumentList "311a71cc-e848-46a1-bdf8-97ff7156d8e6","Scope"              
$reqAAD.ResourceAccess = $delPermission1                                               $appRegName = $funname + "_easyauth"                       
$appReg = New-AzureADApplication -DisplayName $appRegName -IdentifierUris $identifier_url -Homepage $identifier_url -ReplyUrls $reply_url -PasswordCredential $PasswordCredential -RequiredResourceAccess $reqAAD                                               **# B1B3_4\. Add new AppRole object to app registration **                      # step 3 is derived from https://gist.github.com/psignoret/45e2a5769ea78ae9991d1adef88f6637                       
$newAppRole = [Microsoft.Open.AzureAD.Model.AppRole]::new()                       $newAppRole.DisplayName = "Allow MSI SPN of ADFv2 to authenticate to Azure Function using its MSI"                       $newAppRole.Description = "Allow MSI SPN of ADFv2 to authenticate to Azure Function using its MSI"
$newAppRole.Value = "Things.Read.All"                       
$Id = [Guid]::NewGuid().ToString()                       $newAppRole.Id = $Id                       
$newAppRole.IsEnabled = $true                       $newAppRole.AllowedMemberTypes = "Application"                       $appRoles = $appReg.AppRoles                       
$appRoles += $newAppRole                       
$appReg | Set-AzureADApplication -AppRoles $appRoles                                               **# B1B3_5\. Add app registration to web app **                      $authResourceName = $funname + "/authsettings"                       $auth = Invoke-AzResourceAction -ResourceGroupName $rg -ResourceType Microsoft.Web/sites/config -ResourceName $authResourceName -Action list -ApiVersion 2016-08-01 -Force                       $auth.properties.enabled = "True"                       $auth.properties.unauthenticatedClientAction = "RedirectToLoginPage"                       $auth.properties.tokenStoreEnabled = "True"                       $auth.properties.defaultProvider = "AzureActiveDirectory"                       $auth.properties.isAadAutoProvisioned = "False"                       $auth.properties.clientId = $appReg.AppId                       $auth.properties.clientSecret = $Password                       $loginBaseUrl = $(Get-AzEnvironment -Name $environment).ActiveDirectoryAuthority                       $auth.properties.issuer = $loginBaseUrl + $aadConnection.Tenant.Id.Guid + "/"                       $auth.properties.allowedAudiences = @($identifier_url)                       New-AzResource -PropertyObject $auth.properties -ResourceGroupName $rg -ResourceType Microsoft.Web/sites/config -ResourceName $authResourceName -ApiVersion 2016-08-01 -Force                                               **# B1B3_6\. Create SPN connected to app registration   **                    $SPN = New-AzADServicePrincipal -ApplicationId $appReg.AppId -DisplayName $appRegName                                                                                             
**# B1B3_7\. Set "User assignment required?" to true in SPN** # (optional, in case you want to whitelist AAD users)                      #Set-AzureADServicePrincipal -ObjectId $SPN.Id -AppRoleAssignmentRequired $true                                                                  **# B1B3_8\. Set obj of ADFv2 as only authorized user to log in web app**
# (optional, in case you want to whitelist AAD users)                        #$adfv2_resource = Get-AzDataFactoryV2 -ResourceGroupName $rg -Name $adfv2_name                       
#New-AzureADServiceAppRoleAssignment -ObjectId $adfv2_resource.Identity.PrincipalId -Id $newAppRole.Id -PrincipalId $adfv2_resource.Identity.PrincipalId -ResourceId $SPN.Id
**# B1B3_9\. Done**

B2。进程:从函数安全访问 SQLDB

Azure SQL(又名 SQLDB)用于从。在这篇博客中,Azure SQL 的数据处理受到如下保护:

  • Azure 功能的托管身份(MI)已启用,此 MI 用于向 SQLDB 进行身份验证
  • Azure 函数的 MI 被配置为 SQLDB 中的外部 Azure AD 对象,并被授予读取者角色以检索数据
  • 只有 Azure 函数的 VNET 可以使用防火墙规则访问 SQLDB

下面描述了如何限制从 Azure 函数访问 SQLD。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.在 SQLDB 安全性中处理数据

这一步的代码通过使用下面找到,脚本也可以在 my github 上找到。

**# B2_1\. Login** 
Clear-AzContext -Scope CurrentUser -Force                       Connect-AzAccount
**# B2_2\. Variables, take same id in all B0/B1B3/B2 scripts** $id = "3405" # take same id in all B0/B1B3/B2 scripts                                               $rg = "test-funappsec" + $id + "-rg"                       
$rg_sql = "test-funappsec" + $id + "-rg"                       
$loc = "westeurope"                       
$funname = "test-funappsec" + $id + "-func"                       $vnet = "test-funappsec" + $id + "-vnet"                       $subnet = "azurefunction"                                               $sqlserver = "test-funappsec" + $id + "-dbs"                       $sqldb = "test-funappsec" + $id + "-sqldb"                       $sqluser = "testfunappsec" + $id + "sqluser"                       $pass = "<<SQLDB password, use https://passwordsgenerator.net/>>"                       $aaduser = "<<your AAD email account>>"                                              **# B2_3\. Create logical SQL server and SQLDB**
az sql server create -l $loc -g $rg_sql -n $sqlserv -u sqluser -p $pass                       
az sql db create -g $rg_sql -s $sqlserver -n $sqldb --service-objective Basic --sample-name AdventureWorksLT                                               **# B2_4\. Configure AAD access to logical SQL server **                      
# Connect-AzureAD                       
Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName $rg_sql -ServerName $sqlserver -DisplayName $aaduser                                                **# B2_5\. log in SQL with AAD (e.g. via portal query editor/SSMS/VSC) **                      # Execute following SQL statement                       
#CREATE USER [<<your azure function name, equal to $funname>>] FROM EXTERNAL PROVIDER;                       
#EXEC sp_addrolemember [db_datareader], [<<your azure function name, equal to $funname>>];                                               
**# B2_6\. point app settings to database **                      
az functionapp config appsettings set --name $funname --resource-group $rg --settings sqlserver=$sqlserver sqldb=$sqldb                                               **# B2_7\. Add firewall rules    **                   
$subnetobject = Get-AzVirtualNetwork -ResourceGroupName $rg -Name $vnet | Get-AzVirtualNetworkSubnetConfig -Name $subnet                       New-AzSqlServerVirtualNetworkRule -ResourceGroupName $rg_sql -ServerName $sqlserver -VirtualNetworkRuleName $subnet -VirtualNetworkSubnetId $subnetobject.Id                                               **# B2_8\. Upload code Azure Function **                      
# To create Azure Function in Python, see https://github.com/MicrosoftDocs/azure-docs/blob/master/articles/azure-functions/functions-create-first-function-python.md                       
# Get code from __init__.py and requirements.txt from this git repo, then run command below                                               func azure functionapp publish $funname
**# B2_9\. Done**

C.结论

Azure 函数是一个流行的工具,用来创建可以执行简单任务的小代码片段。在这篇博客中,讨论了如何保护一个典型的 Azure 函数,如下所示

  • 0.init:Azure 函数的安全存储帐户
  • 1/3.请求-响应:对 Azure 函数的安全访问
  • 2.处理数据:从 Azure 函数安全访问 SQLDB

下面也描述了具有安全性的模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

C.具有安全性的 Azure 函数模式

来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

如何获得你的第一份数据科学实习

原文:https://towardsdatascience.com/how-to-secure-your-first-data-science-internship-7bbfd8b87bdc?source=collection_archive---------19-----------------------

#3 停止在线申请

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

赢得实习机会。(图片由来自 PexelsAndrea Piacquadio 拍摄)

5 年前,我疯狂地在黑暗中寻找实习机会,抓住每一个机会。没用。我明白找到一份实习工作有多难,因为我经历过。我甚至支付了被贴上实习标签的培训课程,因为我并不知情。我甚至不再在我的简历中提到他们。

如果你被要求支付实习费用,那就不是实习。

现在时代变了,数据科学世界与 5 年前大不相同。我终于站在了另一边。我面试未来的工程师、分析师和数据科学团队的实习生。作为一名面试官(和许多其他面试官),我在实习生身上寻找某些东西。

你不需要工作经验,但你需要某些其他的东西。这些是你可以控制的事情,可以用来增加获得实习的机会。本文将详细讨论它们。扣起来;你的实习求职将被简化为 7 个简单的步骤!

1.获得技能

现在就开始追求技能!没有获得最基本的相关技能,你真的不能指望得到实习机会。即使你成功了,对不起,但你也活不下去。你如何获得技能?

这没有唯一的公式,但是你可以上在线课程(有很多免费的),但是记住你追求的不是证书,而是技能。你可以从专家们在 Kaggle 上分享的内容中学习。有很多资源是免费的;你需要去寻找它们。

现在就开始追求技能!

如果您仍然停滞不前,这里有一个我不久前写的指南,概述了您需要学习的内容和在哪里找到它们,以及数据科学的一般方法。我强烈建议花点时间来看一下这个。

大学本科需要入学吗?一些公司要求你这样做,但是如果你有技能——确切地说是可展示的技能,大多数公司会很乐意雇佣你。

一旦你获得了技能,你如何展示它们?

2.创建(至少)一个可论证的项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

做你需要做的。(图片由来自 PexelsAndrea Piacquadio 拍摄)

一个可论证的项目组合是你吹嘘自己技能的最佳方式。它是如此令人信服,当它就在那里给面试官看的时候是如此令人信服!

从探索 KaggleUCI 的数据集开始,或者继续收集数据并构建您的项目。思考一个成功的可演示组合项目的一个好方法是问,它覆盖了端到端机器学习管道的所有典型步骤吗?您是否清理了数据,处理了异常值和类别,构建了模型,评估了它们,并部署了它们?你是否试图有效地解决问题,并能很好地沟通?如果你能回答这些问题是,那么你已经得到了这个项目。

不要展示传统入门问题之外的东西。泰坦尼克号生存预测虹膜分类,或 MNIST 数字识别是入门和学习的好问题,但不能展示你的投资组合项目。每个人都这样做,你不会有一个区分因素。

你可能已经在你的本科项目中做过这样的项目;你可以微调一下,让它看起来更像样。这个项目应该在你的 GitHub 上,你甚至可以在实习期间把它部署在云上。

你有一个可论证的项目;你会在网上申请每一个职位空缺吗?

3.停止在线申请

我在找实习的时候,曾经在网上申请过。我相信我申请的公司越多,我的机会就越大。因为我是批量申请,所以我会对每份申请使用相同的求职信和相同的简历。我为此付出了很多努力,但没人注意到我。

你答对了问题——我做了其他人都在做的事情,但我希望被注意到。

与软件工程不同,没有确定的数据科学家角色;没有两个职位发布是相同的。数据科学家的角色因公司而异。一家公司需要的不仅仅是数据科学家。例如,大多数公司还需要一名数据工程师、数据分析师、机器学习工程师,这样的例子不胜枚举。他们都在数据科学领域工作,你可能也会喜欢。

你需要对你申请的公司真正感兴趣。看看他们在哪个领域工作,他们的文化是什么样的。根据他们的要求和职位空缺,定制你的简历和求职信。我怎么强调这一点都不为过,**定制让你在获得实习机会的道路上更进一步!**但是你如何申请呢?

4.获得推荐

这里有一个圈内人的秘密。**任何招聘流程的第一步都是从询问现有员工是否认识适合这个职位的人开始的。**如果你梦想中的公司的员工认识你,并且看到了你的潜力,猜猜谁会快速进入招聘流程?当其他人的在线申请到达人力资源部时,你已经拿着录取通知书了,我的朋友。

等等,但是我怎么被推荐呢?我知道说起来容易做起来难。但是我在这里告诉你;这是可行的。

你对公司有真正的兴趣。你知道他们在做什么。您已经构建了至少一个可演示的项目。你有这个技能。是你和公司员工建立关系的时候了。

这可以简单到要求对你的项目进行评审(不过要注意他们的时间)。或者是为你将来要做的项目征求一些建议。或者你可以简单地询问他们在公司做什么工作,以及他们是否在招聘实习生。

如果没有空缺,不要推送,而是要求他们随时向你更新。如果一名员工没有回应,没关系,同一家公司可能有许多其他员工愿意回应。我能想到的最好的平台就是 LinkedIn。利用它!

当你对这家公司表现出真正的兴趣时,作为回报,这家公司会给你一次机会。你如何让它有价值?

5.为面试做准备和练习

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

和朋友一起练习。(照片由塞巴斯蒂安·赫尔曼Unsplash 上拍摄)

在面试中尽你最大的努力是非常非常非常重要的。这是你被评估的唯一方法,而且,不要让你的推荐人失望。你可以做一些让你感觉舒服的事情,

  • glassdoorgeeks for geeks 或类似的网站中找出面试中的期待。在安排面试的时候,你也可以问人力资源部这个问题。一般来说,根据公司的不同,您需要通过技术和编码轮次。
  • 查找常见的面试问题,温习你的理论。
  • 对你的项目了如指掌,并能自如地从头到尾解释它(在面试中,你可以随意吹嘘它)。
  • LeetcodeHackerrank 等常见网站上练习编码。你应该对解决问题有一定程度的了解。
  • 和一个朋友轮流练习模拟面试。它可以帮助你减少在面试官面前的紧张感。当你练习这样回答时,你将学会如何更好地组织你的答案。

面试成功后走出房间是有史以来最棒的感觉!你在面试中尽力了。现在怎么办?

6.寻求反馈

结束后,可以向面试官寻求反馈。如果几天后没有收到人力资源部的反馈,也可以要求反馈。大多数公司会毫不犹豫地给你建设性的反馈(除非政策禁止他们这样做),所以去问吧。

如果你第一次做不到,利用反馈来提高自己,并重复这个过程。根据我的经验,在几次面试后,你会开始注意到同样的提问模式,并最终感到自信。你自然会得 a!

最后一步。重要的那个。

7.不要放弃

有时候你可以做好每一件事,但仍然得不到工作。很可悲,但这是事实。对公司的要求可能会改变,你可能会穿疫情,他们可能会冻结招聘,等等。

不断提高自己,获得更多的技能,做更多的项目。建立更强大的专业网络。如果我放弃了,我就不会在这里写这些了。任何人都有更强的理由雇佣你!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当你最终拿到 offer 的时候!(图片由来自 PexelsAndrea Piacquadio 拍摄)

在你走之前

如果你已经走了这么远,谢谢你的阅读。我希望它在某些方面对你有用。最重要的是,请将此分享给正在寻找实习机会的人。如果你在这些步骤中需要更多的指导,请不要犹豫。

我在媒体上根据我的个人经历撰写了大量关于数据科学和机器学习入门的文章。我将非常乐意在 LinkedIn 上与你联系并听取你的反馈。我迫不及待地想看到你成功!

要获得更多关于进入数据科学、令人兴奋的合作和指导的有用见解,请考虑 加入我的电子邮件好友私人列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值