运行选举之夜API的一组实用程序和说明。

election-night-api的Python项目详细描述


#选举之夜api

一套工具、配置和说明,用于在选举之夜收集和提供选举结果-超级碗数据新闻-同时仍提供淡季服务,并专注于尽可能节省资源。

无法负担美联社或路透社选举等服务的中型组织,或需要更多地方选举结果的组织。这对那些有选举晚间新闻的州最有效。

此应用程序的架构基于[scraperwiki](https://scraperwiki.com),这是一个收集和提供数据的平台。其主要原因是,在选举之夜或前后,一个组织可以用大量资源运行自己的服务器,当使用[免费](https://scraperwiki.com/pricing)(对于[记者](https://wordpress.scraperwiki.com/solutions/data journaling/))scraperwiki的基础设施时,今年剩下的时间里。


api有两部分。

运行每个状态的scraper方法的包装器。可以在不同的计划上运行不同的scraper方法,以说明在给定状态下更新数据的频率。

*获取命令帮助:`bin/ena-h`
*更新mn中最新选举的结果:`bin/ena mn results`
*更新mn中特定选举的区域数据:`bin/anamn areas-e 20141104`

\api

api允许任意sql选择数据并返回json。这意味着很容易获得在网站或其他应用程序上显示所需的任何数据。您可能正在使用3台服务器。

*对于开发,您可以使用本地api服务器(请参见下文)。
*对于生产,即选举之夜,请参见下文的部署说明。
*在淡季,您可以使用scraperwiki节省资金

有点,那个?q=`参数仍然在查询的输入机制中。以下是一些例子。

*获取所有竞赛:`/?Q=select*比赛`
*使用结果获得特定比赛:`/?q=select*from competits as c join results as r on c.id=r.contest廑d and c.state=r.state and s.election=r.election其中c.id='some contest id'`





安装


安装[git](http://git scm.com/)。
1.安装[python](https://www.python.org/downloads/)。
*大多数系统已经安装了python。
1。安装[libxml](http://xmlsoft.org/)。
*在Mac上,这应该与Xcode开发人员工具一起安装:`Xcode select--install`
1。(可选)使用[virtualenv](http://virtualenv.readthedocs.org/en/latest/)和[virtualenvwrapper](http://virtualenvwrapper.readthedocs.org/en/latest/install.html)
1。` pip install virtualenv virtualenvwrapper`
*这可能需要与"sudo"一起运行;您应该能够判断是否存在权限错误。
*若要在启动时加载virtualenvwrapper,请执行以下操作,但如果您安装了非标准的python或不在bash上系统,请参阅[完整说明](http://virtualenvwrapper.readthedocs.org/en/latest/install.html)。` echo"export working庠u home=$home/.virtualenvs">;~/.bash庠profile&;echo"export project庠u home=$home/devel">;~/.bash庠u profile&;echo"source/usr/local/bin/virtualenvwrapper.sh">;~/.bash庠profile&;source~/.bash_u配置文件`


\获取代码并更改到目录:`git clone https://github.com/minnpost/election-night-api.git&;cd election night api`
1。(可选)创建一个virtualenv以在中工作:`mkvirtualenv election night api`
1。安装库:`pip install-r requirements.txt`

n准备就绪,本地API应用程序。

1.用[刮刀工具](刮刀工具)刮掉一些数据。
1.使用以下命令运行本地api:`python tests/local_api.py`
1。发出类似于以下内容的请求:`http://localhost:5000/?q=从竞赛限制10中选择*添加或管理状态,尽管有一些基础知识(请参见下面的**编写刮刀**和**数据建模**)和需要遵循的特定文件和名称,但需要刮削的数据因州而异。最好的方法是复制示例并查看文件中的注释。

1。复制示例:`cp-r states/example states/xx`
1。"xx_meta.py"文件管理州内每个选举的每个信息和配置。根据您的状态创建所需的配置;只有几个必需字段。
1。将"example_meta.py"重命名为"xx_meta.py"
1。更改选举ID。建议的格式为选举日期,格式为yyyymmdd
1。(可选)指向选举结果文件的URL可以放在此处。
1。py保存了scraper类,该类包含通过命令行工具运行的方法。其中大部分都是针对你的州和来源的。
1.将"example.py"重命名为"xx.py"
1。确保在构造函数中调用"utility.setup()"。
1。"test_xx.py"文件用于保存测试,以帮助对文件进行单元测试。
1.将"test_example.py"重命名为"test_xx.py"

由于州与州之间的选举结果文件格式差别很大,因此每个州都需要一种自定义方法,但下面是编写scraper的一些一般指导原则。


或者最近选举的档案。结果是提供给整个种族的还是由选区的?每个种族都有唯一的标识符吗?每个候选人都有吗?提供了哪些结果数据-原始投票总数、投票百分比或两者?

在某些情况下,这些已经存在于结果文件中的单个字段中,并且可以读入scraper(请注意验证id实际上是唯一的)。如果没有单个字段包含唯一标识符,则需要从scraper中的数据字段构造一个标识符。例如,在明尼苏达州scraper中,我们通过组合state、county和辖区和办事处:

```
请参阅下面的**数据建模**。

直接到数据库。

您至少需要一个结果表(每个选项的数据)和一个竞赛表(每个竞赛/办公室的数据)的数据。

所需的最小结果字段是"id、state、election、updated、contest-id、choice、party、votes、percentage、winner"。所需的最小竞赛字段是"id、state、election、updated、title、precincts_reporting、total_precincts、percent_reporting、total_vots、seats"。(注意:state、election和updated可以使用"self.util"方法填充。请参阅下面的**数据建模**。)

骗子的"id"测试表应与结果表中的"比赛id"匹配,并用于将候选人/选项链接到其整个比赛。有关所需字段的详细信息,请参阅下面的*数据建模*。

这些数据字段中的一些可以直接从结果文件中访问,但其他字段需要在scraper脚本中进行计算或其他操作。请查看现有的状态刮板,以获取此数据处理的一些示例。


一个简单的方法是用额外的数据创建一个google电子表格。"utility.google_spreadsheet(spreadsheet_id,worksheet_id,gs_types_dict)"方法为您提供特定google电子表格中的所有行,您可以遍历这些行以读取其他数据,以便写入"results"或"contests"表。您可能希望匹配此电子表格中结果或竞赛的唯一ID。

有关详细信息,请参阅下面的**实用程序库**。


这将是一个"enautility"类实例,与正在处理的选择建立连接。

*`utility.state`:正在处理的状态。
*`utility.election\u id`:正在处理的选择id。
*`utility.election`:在中找到的选择元数据。` xx_meta.py`用于正在处理的选择。
*`utility.setup()`:这将连接到正确的数据库。
*`utility.timestamp()`:立即获取整数时间戳。
*`utility.save(id_array,data_dict,table_name,index_method`:将一行或多行保存(插入或更新)到数据库。第一次插入表时将调用index方法。
*`utility.has_table(table_name)`:检查数据库中是否存在表。
*`utility.save_meta(key_name,value)`:将值保存到meta table。
*`utility.google_spreadsheet(spreadsheet_id,worksheet_id,从谷歌电子表格中获取数据,具体的表格。如果给定字典类型,实用程序将尝试键入数据。
*`utility.save_results(data)`:保存结果数据。检查是否存在基本结果字段。
*`实用程序.保存竞赛(数据)`:保存竞赛数据。检查是否存在基本竞赛字段。
*"utility.scrape()":仅指向[scraperwiki.scrape]的链接(https://github.com/scraperwiki/scraperwiki python scraping)。
*"utility.sql":指向[scraperwiki.sql]的链接(https://github.com/scraperwiki/scraperwiki python保存数据)。


###测试

`py.test`将在给定目录中找到所有具有[特定名称](http://pytest.org/latest/goodpractices.html test discovery)的python文件。

1。运行所有测试(包括所有状态):`py.test`
1。运行所有状态测试:`py.test states/`
1。运行一个特定的状态测试:`py.test states/mn/`

全民公决等。此数据至少应包含以下字段,但您可以拥有任意多的字段。

*`id`:州内竞赛和选举的唯一ID
*`state`:州代码,可以提供"self.util.state`
*`election`:选举ID,可以是提供"self.util.election"id`
*`updated`:上次更新的时间戳整数,可以使用"self.util.timestamp()`
*`title`:比赛的标题,例如,"美国众议员第二选区"或"拟议宪法修正案"
*"选区报告":选区报告的整数
*"选区总数":受竞赛影响的选区总数
*"百分比报告":浮动百分比(85.0,不是0.85)的选区报告
*`总票数':总票数的整数所有投票
*`席位':可赢得的席位数,通常为1
*…无论与此竞赛相关的其他数据是什么,实用程序对象都有一个方便的"保存竞赛"方法来更新结果。


每个比赛通常至少有两行结果。

*`id`:整个州和选举中候选人/答案/选择等的唯一ID。
*`state`:州代码,可以提供"self.util.state`
*`election`:选举ID,可以提供"self.util.election\u id"
*"updated":上次更新的时间戳整数,可以使用"self.util.timestamp()`
*`contest_id`:竞赛表中相应的竞赛id
*`choice`:候选人或问题答案的名称(通常是或否)
*`party`:参与方标识符,例如"d"或"r"
*"投票":到目前为止,此选项获得的投票数的整数
*"百分比":到目前为止,此选项在竞赛中获得的总投票数的浮动百分比(85.0,而不是0.85)
*"获胜者":布尔值表示此选项是否赢得了竞赛
*…无论与此结果相关的任何其他数据

utility对象都有一个方便的"保存结果"方法来更新结果。


` save`根据需要将任何数据保存到任何表中的方法。

尽管这些东西也是需要的。以下说明和提供的配置旨在将api安装在ubuntu服务器(ec2上)上。

建议使用ec2中的"ubuntu server 14.04 lts 64位(ami-9eaa1cf6)"ami。您的安全组将需要打开端口"80"(http)和ssh连接到的任何端口(默认为"22")。


请注意,这些说明适用于没有运行其他应用程序的新服务器。如果服务器上正在运行现有的应用程序,请详细查看说明和配置。


确保ubuntu是最新的:`sudo aptitude up date&;sudo aptitude safe upgrade`
1.安装系统和python基本包:`sudo aptitude install git core git python pip python dev build essential python lxml sqlite3 nginx full fcgiwrap`
1.安装python基本软件包:`sudo pip install--upgrade pip&;sudo pip install--upgrade virtualenv`
1。转到主目录;您可以将代码放在其他地方,但可能需要手动更新部署的其他部分:`cd~ `
1。获取代码:`git clone https://github.com/minnpost/election-night-api.git&;cd election night api`
1。` sudo pip install-r requirements.txt`
1.添加路径,以便我们以后有参考:`echo"export ena_path=$(pwd)">;~/.bash_profile`

[转储卡车](https://github.com/scraperwiki/dumptruck-web)是一个python脚本,用于在sqlite数据库上创建api。它由scraperwiki构建,还可以处理多个用户位置。
1.` sudo git clone https://github.com/scraperwiki/dumptruck-web.git/var/www/dumptruck web&;sudo chown-r www data:www data/var/www/dumptruck web&;sudo pip install-r/var/www/dumptruck web/requirements.txt`
1.fcgiwrap用于在自卸车和nginx之间创建接口。我们使用一个简单的脚本来配置要使用的子级数目。
1。` sudo cp deploy/fcgiwrap/etc/default/fcgiwrap`
1.重新启动服务(不是e这可能需要一分钟):`sudo service fcgiwrap restart`
1.nginx用作顶级web服务器。它允许缓存和其他细节。这将复制我们的配置,启用它并删除默认值。
1。` sudo cp deploy/nginx-scraper-api.conf/etc/nginx/sites available/election-night-api.conf&;sudo ln-s/etc/nginx/sites available/election-night-api.conf/etc/nginx/sites enabled/election-night-api.conf&;sudo rm/etc/nginx/sites enabled/default`
1。重启服务:`sudo service nginx restart`
1.使用以下内容进行测试:http://ec2-xx-xx-xx.compute-1.amazonaws.com/sql?box=ubuntu/election night api&;method=sql&q=select%20*%20 from%20results%20limit%2010
*box参数实际上是scraperwiki.sqlite文件所在的目录路径。TOdo:找出如何使nginx为此提供默认值。
*如果代码安装在另一个位置,则更新"box"参数。


\cron

可能有一些方法偶尔运行,而至少有一个方法连续运行。利用cron来实现这一点是最好的。有一个有用的包装纸,` deploy/continuous wrapper.sh`它将连续运行scraper工具。

*在cron文件中设置'ena_path',因为这不会从用户那里传递:`ena_path=/home/ubuntu/election night api`
*连续获取结果:`*****$ena_path/deploy/continuous-wrapper.sh mn结果`
*记录到主目录:`*****$ena_path/deploy/continuous-wrapper.sh mn results>;~/logs/ena.log`
*运行不太重要的刮片:`0 7***$ena_path/bin/ena mn questions`

节省资源和使用scraperwiki架构是有意义的。我们需要在scraper上安装应用程序,然后根据需要运行命令。

1。确保您在scraperwiki上有帐户
1。为选举结果创建新的或使用现有的scraper。选择python作为语言。
1.在命令行上,ssh进入"浏览器中的代码"工具;单击选项卡并使用gear图标下拉列表。这应该类似于:`ssh xxxxx@premium.scraperwiki.com`
1。获取代码:`git clone https://github.com/minnpost/election night api.git`
1。回到scraperwiki编辑器中,从这个存储库中复制"deploy/scraperwiki example.py"中的代码,然后编辑所需的scraping命令。
1。安排一下!可能是每天或每周。
1.关闭应用程序中的api url。您可以在scraperwiki接口中使用"query with sql"工具来获取url,但它应该类似于:https://premium.scraperwiki.com/xxxxx/yyyyy/sql/?q =

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java无法使用JAXB配置Moxy   java如何让我的简单Swing telnet客户端正确显示字符?   java中从可运行线程调用主线程的多线程处理   java数据源。EBJ3会话bean中的getConnection()   使用java和正则表达式从xml文件提取值时出现问题   java定制Jersy胡须Mvc   在Java中,“限制并发”是什么意思?   java有没有更干净的方法可以在这里使用Optional,而不在三个地方返回“NA”?   java Tomcat启动,然后崩溃,除非我打电话   java理解客户机和服务器   java时间戳将在视图对象>实体转换期间丢失   如何在java中返回布尔值(基元)?   java使用spring mvc设置日志记录,希望仅对我的代码进行跟踪/调试   用Jackson解析嵌套对象