合并SpendRight爬虫数据
项目描述
合并爬虫数据(为了伟大的正义!)
在互联网上有许多消费者运动。这些消费者运动由完美可爱的组织支持,围绕您全心全意支持的议题组织起来,如果足够的人采取行动,将会改变世界。
但是,将这些运动付诸实践很难。一次将多个运动付诸实践更是难上加难。不同的运动有不同的评分系统,对同一家公司的不同名称,以及,当它们有这些时,不同的应用无法相互通信。
msd从多个不同的消费者运动中提取杂乱的数据,并将其放入一个单一的统一格式中。
msd目前为SpendRight(msd的创造者)和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 字段;任何给定品牌的“键”是 company 和 brand 的组合。
同样,也没有(产品)类别键;我们只需将类别名称(例如 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 表中为您创建相应的条目。
而且不仅仅是这些...
不,这几乎就是全部内容。以下是表定义
表定义
品牌:关于品牌的详细信息
主键:company,brand
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-DD、YYYY-MM或YYYY。字符串,不是数字。有时最好的数据可能已有几年历史,消费者有权利知道!
捐赠链接:可选的捐赠链接,您可以在此页面向活动/作者捐款。尽量在您构建的任何内容中包含此链接;创造一个良性循环,帮助这些消费者活动实现财务自给自足!
电子邮件:可选的联系电子邮件(例如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-DD、YYYY-MM或YYYY。字符串,不是数字。
判断:-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:可选的指向该公司官方网站/页面的链接。
公司名称:公司的规范名称、全称和别名
主键:company,company_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-DD、YYYY-MM或YYYY。字符串,不是数字。
描述:对评级(例如 翱翔,无法推荐)的简要、自由形式描述。
等级:可选的字母等级(例如 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_id,scraper_company,scraper_brand
其他索引:(company,brand)
品牌:品牌的规范名称。 (这永远不应该为空;这是 scraper_company_map 的作用。)
公司:公司的规范名称
scraper_brand:在输入数据中使用的品牌名称
scraper_company:在输入数据中使用的公司名称
scraper_id:使用此品牌和公司名称的抓取器的唯一标识符
scraper_category_map:输入数据中的类别名称
这主要用于调试您的输出数据。
msd 忽略如果它在输入数据中出现此表
主键:scraper_id,category,scraper_brand
其他索引:(category)
类别:类别的规范名称(例如 食品和饮料)
scraper_brand:在输入数据中使用的品牌名称(例如 `` food & beverages``)。
scraper_id:使用此类别名称的抓取器的唯一标识符
scraper_company_map:输入数据中的公司名称
这主要用于调试您的输出数据。
msd 忽略如果它在输入数据中出现此表
主键: scraper_id,scraper_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 非常直接。以下是它如何工作的简要概述
msd 从 msd/cmd.py 开始(查找 msd.cmd.run())。
首先,它将所有输入数据以正确的列和有用的索引形式倒入一个临时的“刮擦”数据库(msd-scratch.sqlite)(查找 msd.scratch.build_scratch_db())。
然后,它创建输出数据库(msd.sqlite)并逐表填充它(查找 msd.fill_output_db())。
此外,表定义位于 msd/table.py。
将 msd 作为库使用
msd 实际上不是一个库,但在 msd 中有一些有用的东西(例如,msd/company.py 知道如何从公司名称中删除所有版本的“Inc.”)。
如果您想从其他项目调用这些内容,请让我们知道,这样我们就可以为您制定一个合理、稳定的接口!
项目详细信息
msd-0.1.5.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 2d6690048c4dc770cfdec20a729207e647dfced77953cde2a67215f6b8ccf12b |
|
MD5 | eb2d8de8e3512c2017c0ab90f1bc7b2a |
|
BLAKE2b-256 | 5c65aea162d245319793f7bebdbbbb42fb9559e1bba1dc593d7fc0dfadd54162 |