跳转到主要内容

合并SpendRight爬虫数据

项目描述

合并爬虫数据(为了伟大的正义!)

在互联网上有许多消费者运动。这些消费者运动由完美可爱的组织支持,围绕您全心全意支持的议题组织起来,如果足够的人采取行动,将会改变世界。

但是,将这些运动付诸实践很难。一次将多个运动付诸实践更是难上加难。不同的运动有不同的评分系统,对同一家公司的不同名称,以及,当它们有这些时,不同的应用无法相互通信。

msd从多个不同的消费者运动中提取杂乱的数据,并将其放入一个单一的统一格式中。

msd目前为SpendRightmsd的创造者)和thinkContext浏览器扩展提供动力。

使用数据

如果您还不在那里,请查看msd的morph.io页面,您可以在那里查看和下载来自SpendRight爬虫合并的数据。

请注意,原始的消费者运动通常由创建它们的非营利组织拥有版权,并且它们有许多不同的条款/许可协议。您是否现在请求它们的许可,还是稍后请求原谅,取决于您。

(这主要适用于索赔评级表;关于公司和品牌的事实几乎肯定是公平游戏。)

安装

它在PyPI上:pip install msd

用法

msd db1.sqlite [db2.sqlite ...]

这会生成一个名为 msd.sqlite 的文件(你可以通过 -o 开关来更改此名称)。

msd 也可以接受 YAML 文件作为输入。这些 YAML 文件应该包含从表名到行列表的映射(这些行是列名到值的映射)。例如:

campaign:
- author: Greenpeace International
  campaign_id: greenpeace_palm_oil
rating:
- campaign_id: greenpeace_palm_oil
  company: Colgate-Palmolive
  judgment: -1
- campaign_id: greenpeace_palm_oil
  company: Danone
  judgment: 0

如果你没有安装库(例如,用于开发),你可以用 python -m msd.cmd 来代替 msd

数据格式

msd 使用 SQLite 数据格式,无论是输入还是输出。

输入和输出格式几乎相同;不同之处用 斜体 标注。

输入数据中的每个活动都应该有一个 campaign_id,该 ID 将作为 Python 标识符使用(例如 wwf_palm_oil)。

虽然没有 company_id 字段;我们只使用公司通常使用的最短名称。``msd`` 足够智能,知道例如可口可乐公司可以被称为 Coca-Cola,但我们不能把学习公司简单地称为“学习”。

类似地,也没有 brand_id 字段,msd 只会找出品牌的正确名称(去掉™等),并将其放入 brand 字段;任何给定品牌的“键”是 companybrand 的组合。

同样,也没有(产品)类别键;我们只需将类别名称(例如 Chocolate)放入 category 字段。

最后,每个初始数据源都会得到一个 scraper_id,这是一个或多个用点分隔的标识符(例如 sr.campaign.wwf_palm_oil)。这些仅用于帮助你在输入数据中追踪问题。

输入数据中的每个表都可以有一个 scraper_id 字段来帮助识别收集该数据的代码。来自任何输入文件数据的根将附加形成输出中的 scraper_id

例如,来自名为 sr.campaign.sqlite 的输入文件的 scraper_id wwf_palm_oil ,将在输出数据中变为 sr.campaign.wwf_palm_oil

杂乱无章的输入数据

msd 可以接受非常、非常杂乱的输入数据。目标是让你尽可能少地付出努力来编写爬虫。

没有主键

首先,输入数据不需要有主键,或任何键。我们首先会把所有输入数据推入一个单一的“临时”表中。

输出数据中两行具有相同键的情况是完全可以接受的; msd 会为你合并它们。

缺少/多余的字段

输入数据缺少字段,或某些字段被设置为应该有值的 NULL 是完全正常的(在最坏的情况下,如果你省略了必需的值, msd 会忽略那一行。

有多余的字段也是完全正常的; msd 会忽略它们。

公司和品牌的名称不同

对于相同的公司或品牌使用不同的名称是完全正常的; msd 会找出这一点,并适当地合并它们。

一般文本清洁度

对于每个文本字段, msd 为你执行以下操作:

  • 将所有空白(制表符、双空格等)转换为单个空格

  • 删除前导和尾随空白

  • 将“智能引号”、连字符号和其他无聊的字符转换为普通等价物。

  • 将所有Unicode字符标准化为NFKD形式(这基本上意味着没有多种方式来表示相同的带重音字符)。

品牌名称清理

此外,您还可以品牌 字段中更加偷懒。 msd 会自动找到 ™、® 等标志,将其移至其他地方保存(见下文的 tm 字段),并忽略其后的所有内容。

例如,如果您在 brand 字段中输入类似 INVOKANA™ (canagliflozin) USPI 的内容,它就会知道品牌名称为 INVOKANA 并在其后应有™标志。

类别名称清理

msd 会以一致的方式格式化类别名称。例如,输入数据中的 food & beverages 将转换为输出数据中的 Food and Beverages

评分清理

msd 可以进行有限的评分清理,包括从等级中推断出判断。请参阅评分表以获取详细信息。

推断行

msd 将推断公司或品牌的存在。例如,如果您在 rating 表中包含公司的评分,系统会自动在 company 表中为您创建相应的条目。

而且不仅仅是这些...

不,这几乎就是全部内容。以下是表定义

表定义

品牌:关于品牌的详细信息

主键companybrand

brand:品牌的规范名称(例如 Dove

company:公司的规范名称(例如 Unilever

facebook_url:可选的品牌官方Facebook页面的链接。(如果只有公司页面,请将其放在 company.facebook_url)。这样消费者就可以在其Facebook页面上发表好评或直言不讳的意见。

is_former:0或1。如果为1,则此品牌不再存在(例如 Sanyo)或已被其他公司收购(例如 LU不再是Groupe Danone的所有者)。请在输入数据中将此设置为1,以从过时的消费者活动中删除过时的品牌信息。

is_licensed:0或1。如果为1,则此品牌实际上属于另一家公司(例如 The Coca-Cola Company在Evian品牌下销售产品)。通常将品牌责任放在其实际所有者身上是一个好主意。

is_prescription:0或1。如果为1,则此品牌只能通过处方购买(所以您可能无法在亚马逊.com等网站上购买)。

logo_url:0或1。可选的指向品牌标志图片的链接(不需要在品牌的网站上)。

tm:空字符串、™、® 或 ℠。公司喜欢直接跟在品牌名称后面的那个东西。

twitter_handle:可选的指向品牌Twitter账户的昵称,包括 @(例如 @BrownCowYogurt)。这样消费者就可以在Twitter上对他们表示祝贺或公开批评。

url:指向此品牌的官方网站/页面的可选链接。如果这只是公司的官方网站的一个子页面,那是可以的。

活动:消费者活动

实际上,向用户介绍消费者活动是您构建的任何工具最重要的部分之一;您可能只需要使用此表作为起点,并包含一些您自己的内容。

主键campaign_id

作者:活动背后组织的可选自由形式名称(例如绿色和平国际)。

作者链接:可选作者网站的链接

活动名称:活动的自由形式名称(例如绿色电子产品指南

活动ID:本活动的唯一标识符(例如greenpeace_electronics)。由您选择一个有意义的名称,并且不要与其他活动ID冲突。

贡献者:可选其他对消费者活动贡献者的自由形式描述(例如国际劳工权利论坛,浸信会世界援助)。

版权:可选版权声明。通常以©开始(例如© 2006-2014 气候计分。版权所有。)。

日期:可选创建活动的日期,格式为YYYY-MM-DDYYYY-MMYYYY。字符串,不是数字。有时最好的数据可能已有几年历史,消费者有权利知道!

捐赠链接:可选的捐赠链接,您可以在此页面向活动/作者捐款。尽量在您构建的任何内容中包含此链接;创造一个良性循环,帮助这些消费者活动实现财务自给自足!

电子邮件:可选的联系电子邮件(例如feedback@free2work.org

Facebook链接:可选的官方Facebook页面链接,以便消费者可以参与到运动中来!

目标:通过参与此活动,某人帮助实现的非常简短描述(40个字符以内)(例如停止乌兹别克斯坦的强制劳动)。最好以小写字母开始,除非第一个词是专有名词。

Twitter账号:可选的Twitter账号处理方式,以便消费者可以在Twitter上关注/引用他们。包括@(例如@WWF)。

网站链接:可选的活动网站链接,以便消费者可以了解更多信息并参与其中。

类别:公司和品牌的商品类别

msd不会构建像在线零售商那样的有组织的类别树;这些更像是一些提示。有关详细信息,请参阅子类别表。

主键公司品牌类别

品牌:品牌的规范名称。如果我们正在对公司进行分类,则为空字符串

类别:类别的自由形式名称(例如食品和饮料)。

公司:公司的规范名称

is_implied:0或1。如果为1,则此类别仅由子类别关系暗示(请参阅子类别表)。输入数据中忽略。

声明:支持评分的要点

主键campaign_id公司品牌范围声明

声明是自由形式的,因此这更像是一个非唯一键)

品牌:品牌的规范名称。如果是关于公司的声明,则为空字符串。

campaign_id:提出此声明的活动的唯一标识符(请参阅campaign.campaign_id

声明:自由形式的声明。应该足够小,可以放入一个项目符号中,并且能够独立存在(解释难以理解的缩写和其他上下文)。最好以小写字母开始,除非第一个词是专有名词。

公司:公司的规范名称

日期:可选的声明日期,格式为YYYY-MM-DDYYYY-MMYYYY。字符串,不是数字。

判断:-1、0或1。声明是否对该公司或品牌有好的(1)、混合的(0)或坏的(-1)评价?不一定与活动的评级相匹配。如果声明完全中立(例如,生产大型家电),则根本不属于这个表格!

范围:可选的针对适用产品的自由形式限制(例如,公平贸易)。通常是空字符串,表示没有限制或它仅在数据中的其他地方不是某个范围(不要设置为未认证)。

URL:可选的指向声明所在的网页/PDF文档等的链接。有些人喜欢看到支持数据!

公司:有关公司的信息

主键company

company:公司的规范名称(例如,迪士尼

company_full:公司的全称,正式名称(例如,华特迪士尼公司)。

email:公司的联系/反馈电子邮件(例如,consumer.relations@adidas.com)。

facebook_url:可选的指向公司官方Facebook页面的链接。

feedback_url:可选的指向消费者可以提交反馈给公司的页面的链接(一些公司不喜欢通过电子邮件这样做)。

hq_company:可选的公司总部所在国家的名称(例如,美国)。

logo_url:0或1。可选的指向公司标志图像的链接(不必在公司网站上)。

phone:可选的客户反馈/投诉电话号码(字符串,不是数字)

twitter_handle:可选的指向公司Twitter账号的名称,包括@(例如,@Stonyfield)。

url:可选的指向该公司官方网站/页面的链接。

公司名称:公司的规范名称、全称和别名

主键companycompany_name

company:公司的规范名称(例如,迪士尼

company_name:公司的名称。可以是规范名称、全名(参见company.company_full)或其他名称(例如,华特迪士尼)。

is_alias:0或1。如果是1,则此名称某人曾在某处使用,但并不是公司的可识别名称(例如,“AEO”代表美国鹰服饰或“LGE”代表“LG电子”)。将此输入数据设置为消除奇特的别名。

is_full:0或1。如果是1,则是公司的全名,也出现在company.company_full中。(没有is_canonical字段;只需检查company = company_name。)

评级:活动对品牌和公司的评价

这里发生魔法。

品牌:品牌的规范名称。如果是公司评级,则为空字符串。

campaign_id:此评级来源的活动的唯一标识符(参见campaign.campaign_id

公司:公司的规范名称

日期:可选的此评级上次更新的日期,格式为YYYY-MM-DDYYYY-MMYYYY。字符串,不是数字。

描述:对评级(例如 翱翔无法推荐)的简要、自由形式描述。

等级:可选的字母等级(例如 A+C-F)。一些活动使用 E 来代替 F

判断:-1,0 或 1。消费者应该支持(1)、考虑(0)还是避免(-1)该公司或品牌?一些活动将所有内容都给 1(例如认证机构)或所有内容都给 -1(例如抵制活动)。

msd 可以从 等级 推断 判断,但否则您需要在输入数据中自行设置。

红色表示避免,黄色表示考虑,绿色表示支持,这是消费者活动中的事实标准。如果其他方法都失败,请联系活动的作者并询问。

最高分:如果设置了 分数,则评级尺度上可能获得的最高分(一个数字)。

最低分:如果设置了 分数,则评级尺度上可能获得的最低分(一个数字)。如果 分数 设置了但 最低分 没有设置,msd 将假设 最低分 为零。

已评级数量:如果设置了 排名,则评定的物品数量(一个整数)

排名:如果活动对公司/品牌进行排名,那么这个排名(这是一个整数,最佳排名是 1,不是 0)。

范围:可选的针对适用产品的自由形式限制(例如,公平贸易)。通常是空字符串,表示没有限制或它仅在数据中的其他地方不是某个范围(不要设置为未认证)。

分数:可选的数字分数(例如 57.5)。

URL:可选的链接到网页/PDF 文档等,其中包含此评级。有些人喜欢看到支持数据!

scraper:数据上次收集的时间

主键scraper_id

最后抓取时间:此数据上次收集的时间,作为 UTC ISO 时间戳(例如,2015-08-03T20:55:36.795227Z)。

scraper_id:收集此数据的抓取器的唯一标识符

scraper_brand_map:输入数据中的品牌名称

这主要用于调试您的输出数据。

msd 忽略如果它在输入数据中出现此表

主键scraper_idscraper_companyscraper_brand

其他索引:(companybrand

品牌:品牌的规范名称。 (这永远不应该为空;这是 scraper_company_map 的作用。)

公司:公司的规范名称

scraper_brand:在输入数据中使用的品牌名称

scraper_company:在输入数据中使用的公司名称

scraper_id:使用此品牌和公司名称的抓取器的唯一标识符

scraper_category_map:输入数据中的类别名称

这主要用于调试您的输出数据。

msd 忽略如果它在输入数据中出现此表

主键scraper_idcategoryscraper_brand

其他索引:(category

类别:类别的规范名称(例如 食品和饮料

scraper_brand:在输入数据中使用的品牌名称(例如 `` food & beverages``)。

scraper_id:使用此类别名称的抓取器的唯一标识符

scraper_company_map:输入数据中的公司名称

这主要用于调试您的输出数据。

msd 忽略如果它在输入数据中出现此表

主键scraper_idscraper_company

其他索引: (company)

公司:公司的规范名称

scraper_brand:在输入数据中使用的品牌名称

scraper_id:使用此公司名称的爬虫的唯一标识符

子类别:产品类别关系

msd 不尝试构建合适的类别树;它实际上只是一个类别关系的有向图:如果某物位于类别 A(子类别),则它也必须位于类别 B(类别)。

msd 自动推断隐含关系:如果 A 是 B 的子类别,并且 B 是 C 的子类别,则 A 是 C 的子类别。

category:类别的规范名称

is_implied:0 或 1。如果 1,则此关系由 msd 推断。 输入数据中忽略。

subcategory:类别 category 的规范子类别名称

url:在爬虫数据中抓取 URL 的钩子

此表仅存在于输入数据中,并且仅用于填充输出数据中其他情况下可能为空的字段。

这使我们能够构建通用的爬虫,可以直接从公司或品牌的官方页面抓取 Twitter 处理方式、Facebook URL 等。有关示例,请参阅 SpendRight 的 scrape-urls

facebook_url:公司/品牌的可选 Facebook 页面

last_scraped:公司/品牌页面被抓取的时间,作为 UTC iso 时间戳(例如,2015-08-03T20:55:36.795227Z)。 目前未使用。

twitter_handle:公司/品牌的可选 Twitter 处理方式,包括前面的 @

url:抓取此数据的 URL

编写自己的爬虫

如果您想用 Python 编写,请查看 SpendRight 的 scrape-campaigns 项目,并提交一个 pull request(请参阅 scrapers/)以获取示例。

如果您想用其他语言编写,请考虑在 morph.io 上设置自己的爬虫,它还可以处理 Ruby、PHP、Perl 和 Node.js 的爬虫。有关详细信息,请参阅 morph.io 文档。并让我们知道,这样我们就可以将 msd 的 morph.io 页面 指向它。

在 msd 上工作

msd 非常直接。以下是它如何工作的简要概述

  1. msdmsd/cmd.py 开始(查找 msd.cmd.run())。

  2. 首先,它将所有输入数据以正确的列和有用的索引形式倒入一个临时的“刮擦”数据库(msd-scratch.sqlite)(查找 msd.scratch.build_scratch_db())。

  3. 然后,它创建输出数据库(msd.sqlite)并逐表填充它(查找 msd.fill_output_db())。

此外,表定义位于 msd/table.py

将 msd 作为库使用

msd 实际上不是一个库,但在 msd 中有一些有用的东西(例如,msd/company.py 知道如何从公司名称中删除所有版本的“Inc.”)。

如果您想从其他项目调用这些内容,请让我们知道,这样我们就可以为您制定一个合理、稳定的接口!

项目详细信息


下载文件

下载适用于您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。

源代码分发

msd-0.1.5.tar.gz (27.8 kB 查看散列值)

上传时间 源代码

由以下支持