{ "info": { "author": "Saul Shanabrook", "author_email": "s.shanabrook@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# dc-campaign-finance-scraper\n\n## Install\n```bash\n$ pip install dc-campaign-finance-scraper\nDownloading/unpacking dc-campaign-finance-scraper\n...\n```\n\n## CLI Usage\n\nThe easiest way to get data out from the scraper is to use the CLI. Once you\nit installed, you should be able to run the `dc-campaign-finance-scraper`\ncommand\n\n```bash\n$ dc-campaign-finance-scraper --help\nUsage: dc-campaign-finance-scraper [OPTIONS] COMMAND [ARGS]...\n\nOptions:\n --log / --no-log Print log of all HTTP requests [default:\n False]\n --persistant-cache / --in-memory-cache\n Cache all responses to a file. [default:\n True]\n --help Show this message and exit.\n\nCommands:\n cache_file Prints the path of the persistant cache.\n clear_cache Clear persistant cache\n committees_dup Checks to see if any committees are duplicated in multiple\n race\n offices Offices that are contested\n records List of records\n years Available Election Years\n```\n\nTo get a list of records of all contributions or expenditures, use the `records`\nsubcommand.\n\n```bash\n$ Usage: dc-campaign-finance-scraper records [OPTIONS]\n\n A list all transactions for all campaigns, between FROM-DATE and TO-DATE.\n\n Also, if specified, only those for the elction in ELECTION-YEAR and\n running for the office OFFICE.\n\n Either the expenses of the campaign or the contributions of the campaign,\n based on REPORT-TYPE.\n\nOptions:\n --office [Mayor|Council Chairman|Council At-Large|Council Ward 1|Council Ward 2|Council Ward 3|Council Ward 4|Council Ward 5|Council Ward 6|Council Ward 7|Council Ward 8|US Representative|Democratic National Committeeman|Democratic National Committeewoman|Alternate Democratic National Committeeman|Alternate Democratic National Committeewoman|At-Large DC Democratic State Committee|Ward 1 DC Democratic State Committee |Ward 2 DC Democratic State Committee|Ward 3 DC Democratic State Committee|Ward 4 DC Democratic State Committee|Ward 5 DC Democratic State Committee|Ward 6 DC Democratic State Committee|Ward 7 DC Democratic State Committee|Ward 8 DC Democratic State Committee|Democratic Delegates|Democratic Delegates Alternates|Republican Delegates|Republican Delegates Alternates|Republican National Committeeman|Republican National Committeewoman|At-Large DC Republican Committee Official|Ward 1 of the DC Republican Committee|Ward 2 of the DC Republican Committee|Ward 3 of the DC Republican Committee|Ward 4 of the DC Republican Committee|Ward 5 of the DC Republican Committee|Ward 6 of the DC Republican Committee|Ward 7 of the DC Republican Committee|Ward 8 of the DC Republican Committee|Other Political Party|Non Supporting|Supporting|US Senator|School Board Ward 1|School Board Ward 2|School Board Ward 3|School Board Ward 4|School Board Ward 5|School Board Ward 6|School Board Ward 7|School Board Ward 8|School Board At-Large|Attorney General]\n --election-year INTEGER RANGE\n --report-type [exp|con] exp -> expenses, con -> contributions\n [default: con]\n --from-date TEXT First date of records. [default:\n 01/01/1999]\n --to-date TEXT Last date of records. Future dates are\n allowed. [default: 01/01/9999]\n --format [json|xls|yaml|csv|tsv|html|xlsx|ods]\n Format of out output.\n --help Show this message and exit.\n```\nAlthough the `records` command can be run without any arguments, this\nwill return every record in the system, and will take a long time.\n\nIf you don't specify a `format` it will default to a text based table\nlike output.\n\nHowever, for something more interesting, let's try finding all the mayoral\ndonation in 2014, for the election in 2014.\n\n```bash\n$ dc-campaign-finance-scraper records --office Mayor --election-year 2014 --from-date 01/01/2014 --to-date 01/01/2015\nCommittee Name |Candidate Name |Contributor |Address |city |state|Zip |Contributor Type |Contribution Type|Employer Name |Employer Address |Amount |Date of Receipt|Office|Election Year\n------------------------------------------|---------------|---------------------------------------------|----------------------------------------|----------------------------|-----|-----|-----------------------|-----------------|--------------------------------------------------|-----------------------------------------------------------------|-----------|---------------|------|-------------\nBruce Majors, Libertarian for Mayor |Bruce Majors |Rufer, Chris |724 Main |Woodland |CA |95695|Individual |Check |Retired | CA |$2,000.00 |3/3/2014 |Mayor |2014\nBruce Majors, Libertarian for Mayor |Bruce Majors |Majors, Mary |11 Redbud |Shelbyville |TN |37160|Individual |Check |Retired | TN |$300.00 |2/27/2014 |Mayor |2014\nBruce Majors, Libertarian for Mayor |Bruce Majors |Majors, Bruce |1200 23rd Street, NW. #711 |Washington |DC |20037|Candidate |Check | | |$1,500.00 |3/1/2014 |Mayor |2014\nBruce Majors, Libertarian for Mayor |Bruce Majors |Snead, Edward |111 redbud |Georgetown |TX |67676|Individual |Check | | |$1,000.00 |4/8/2014 |Mayor |2014\nBruce Majors, Libertarian for Mayor |Bruce Majors |Delhomme, Laura |1515 North Couthouse |Arlington |VA |22203|Individual |Check |CKI | 1515 North Couthouse, VA 22201 |$150.00 |6/7/2014 |Mayor |2014\nBruce Majors, Libertarian for Mayor |Bruce Majors |Palmer, Tom |1735 |17th Street NW |DC |20009|Individual |CASH |Atlas Foundation | 1201 L Street NW, Washington, DC 20005 |$25.00 |6/8/2014 |Mayor |2014\nBruce Majors, Libertarian for Mayor |Bruce Majors |Majors, Bruce |1200 23rd Street, NW. #711 |Washington |DC |20037|Candidate |Check | | |$500.00 |6/1/2014 |Mayor |2014\nCarlos Allen For Mayor |Carlos Allen |Sewell, Anthony |507 Louise Avenue |Linthicum Heights |MD |21090|Individual |Credit Card | | |$100.00 |2/5/2014 |Mayor |2014\nCarlos Allen For Mayor |Carlos Allen |Brooks, Karen |9709 Manteo Ct |Ft Washington |MD |20744|Individual |Credit Card | | |$15.00 |2/25/2014 |Mayor |2014\nCarlos Allen For Mayor |Carlos Allen |Alsbrook, Darrell |2470 |LakeMeadow Ln |GA |30017|Individual |Credit Card | | |$20.00 |3/4/2014 |Mayor |2014\n...\n```\n\n*Notice* Behind the scenes, all the records between the `from-date`\nand `to-date` are requested from the server, and only filtered locally.\nAlso, because office and election year are not included in the source\nrecord set, it is neccesary to try to guess them from the committee\nname and date of donation. What this ends up meaning is that\na whole lot of HTTP requests must happen if you request the whole\ndate range, which will in turn, take a while.\n\n\nAlso, to get all the possible years, in which data office data is available, use\n`years`\n\n```bash\n$ dc-campaign-finance-scraper years\n2010\n2011\n2012\n2013\n2014\u23ce\n```\n\nAnd then to see all the possible offices, use `offices`\n\n```bash\ndc-campaign-finance-scraper offices --help\nUsage: dc-campaign-finance-scraper offices [OPTIONS]\n\n A list of all the offices that are contested, in a certain ELECTION-YEAR.\n If no ELECTION-YEAR provided, returns all the offices.\n\n Returns each office on a new line.\n\nOptions:\n --election-year INTEGER RANGE\n --help Show this message and exit.\n```\n\n## API Usage\n\nFeel free to access the pythonn api. Take a look at the functions in\n[dc_campaign_finance-scraper/scraper.py](dc_campaign_finance_scraper/scraper.py).\n\nIf you want to use the permenant, file based cache, call\n`dc_campaign_finance_scraper.cache.use_persistant_cache()` before calling any\nscraper functions. To clear the cache use \n`dc_campaign_finance_scraper.cache.clear_persistant_cache()`\n\n\n## Release instructions\n1. `pip install -e .` to make sure it works\n2. Bump version in `./setup.py`\n3. Commit and create tag for version prefixed with \"v\"\n4. `pip install wheel`\n5. `python setup.py sdist bdist_wheel upload`\n\n\n## Developing locally with Docker\n\n```bash\nfig build python\nfig run fig run python dc-campaign-finance-scraper --help\nfig run fig run python test\n```\n\n## How did I do it?\n### Manual Process\n1. Go to\n [www.ocf.dc.gov/serv/download.asp](http://www.ocf.dc.gov/serv/download.asp)\n ![Screenshot of unfilled in serv/download.asp](http://f.cl.ly/items/3J2k2O05223Y1K2T0C43/District%20of%20Columbia%20%20Office%20of%20Campaign%20Finance%20%20Contribution%20%20%20Expenditure%20Search.png)\n2. Fill in `From Date`, `To Date`, and `Payment Type`.\n ![Screenshot of filled in serv/download.asp](http://f.cl.ly/items/0T3N0O1I1W0A1t2W1t3N/District%20of%20Columbia%20%20Office%20of%20Campaign%20Finance%20%20Contribution%20%20%20Expenditure%20Search%20filled%20in.png)\n3. Click `Submit` and it sends a `POST` to\n [www.ocf.dc.gov/serv/download.asp](http://www.ocf.dc.gov/serv/download.asp)\n and displays the entered form.\n ![Screenshot of submitted form](http://f.cl.ly/items/0Z3k1P2W0l1G2P080o2K/District%20of%20Columbia%20%20Office%20of%20Campaign%20Finance%20%20Contribution%20%20%20Expenditure%20Search%20submitted.png)\n4. Click `Click here to download the CSV File` and it sends a `POST` to\n [www.ocf.dc.gov/serv/download_conexp.asp](http://www.ocf.dc.gov/serv/download_conexp.asp)\n5. Returns `POST` with CSV text.\n\n### Automation\n#### Selenium\nAt first I tried using\n[Selenium with Python](http://selenium-python.readthedocs.org) to fill in\nthe forms and click the buttons. This will actually run a real(ish) browser\nand execute all the the JS and simulate user input. This worked, but\nit couldn't really handle the returned CSV text from step 5. In a browser\nthis opens in a new window and downloads to your computer, but the\n[PhantomJS driver for Selenium and Python](http://www.realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/)\nwasn't really working for that new window. I might have been able to get\nit to work eventually, but it prompted me to search for a different approach.\n\n#### Requests\nI then started experimenting with\n[Requests for Python](http://docs.python-requests.org/en/latest) to just\ncall the to just make the actual HTTP calls, instead of pretending to be a\nhuman and filling in the form. This was 1) faster 2) less verbose 3) easier\nto understand.\n\n##### Chrome Dev Tools\nI fired up my Chrome Dev Tools and looked at what requests\nwere being made. So I tried to figure out in step 4, what request was actually being sent,\nso that I could replay it programatically. However, since that opened\nin a new window, the Dev Tools didn't save the request.\n![GIF of clicking on download button and it downloading in chrome](http://zippy.gfycat.com/PinkAccomplishedBuffalo.gif)\nIt [isn't possible](http://stackoverflow.com/a/13747562) with chrome\nto open a new window with Dev Tools already open.\n\n##### Chrome Net Internals\nI then tried [chrome://net-internals/#events](chrome://net-internals/#events)\nto see the actual HTTP request being processed. I could see it was sending\na `POST` to`/serv/download_conexp.asp`\nand the returned CSV. However it didn't show the `POST` data or the\ncookies.\n![chrome net internals events showing POST](http://f.cl.ly/items/050P46040W3o2t30431M/Screen%20Shot%202014-06-15%20at%2012.54.33%20PM.png)\n\n##### Charles\nFor that I found [Charles](http://www.charlesproxy.com/)\n(`brew cask install charles`) which provides a HTTP proxy to run your web\ntraffic through and then you can inspect every request.\n\n#### Cookie\nI checked the `POST` headers for the request and tried making it myself.\nI got a response of\n\n```html\n \n```\n\nI found that it was setting a cookie when I requested\n`/serv/download.asp`. I first tried it with a cookie I got from the browser\nand IT WORKED! I got back the CSV.\n\nSo I began using\n[Requests Sessions](http://docs.python-requests.org/en/latest/user/advanced/#session-objects)\nto first `GET` at `/serv/download.asp` to get a session cookie and then\n`POST` to `/serv/download_conexp.asp` with that cookie. That didn't work,\nI got the `Your Session is expired. Please try again` response.\nSo then I tried doing step 3, sending a `POST` to `/serv/download.asp` and then\nthe identical post to `/serve/download_conexp.asp`, thinking maybe the server\nchecked to see if I submitted the form before letting me download. It worked!\nHowever the next day when I tried again I go the\n`Your Session is expired. Please try again`. Very weird. I tried getting a\ncookie from the my chrome session and using that and it forked. So something\nabout how I get my session on chrome is different from how I get my session\non Requests. I needed to figure out what the difference was.\n\nThen I tried it again and it worked. So who knows. Maybe their site is weird.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/codefordc/dc-campaign-finance-scraper", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "dc-campaign-finance-scraper", "package_url": "https://pypi.org/project/dc-campaign-finance-scraper/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/dc-campaign-finance-scraper/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/codefordc/dc-campaign-finance-scraper" }, "release_url": "https://pypi.org/project/dc-campaign-finance-scraper/0.6.2/", "requires_dist": null, "requires_python": null, "summary": "Provides data from http://www.ocf.dc.gov/serv/download.asp in a nicer way", "version": "0.6.2" }, "last_serial": 1169746, "releases": { "0.4.2": [ { "comment_text": "", "digests": { "md5": "c94c25cde509b128f126a8139ac0d16a", "sha256": "a43cecfb8ba00c476e204aa3f31d05299821bf27049e473c1c1545f5fcb63015" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.4.2-py27-none-any.whl", "has_sig": false, "md5_digest": "c94c25cde509b128f126a8139ac0d16a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 15060, "upload_time": "2014-07-12T18:41:08", "url": "https://files.pythonhosted.org/packages/9d/fc/84e262a33fc3828e8b406d2f34ea69cf40c04e56e2d9f8a486cda443007f/dc_campaign_finance_scraper-0.4.2-py27-none-any.whl" }, { "comment_text": "", "digests": { "md5": "892aa3dc9e62133664c1bfc9c1559b14", "sha256": "25cd4fb7c032bd6de3bcb2384a27c7a9a9bc24e5acc0cfd28b93263b8be6359d" }, "downloads": -1, "filename": "dc-campaign-finance-scraper-0.4.2.tar.gz", "has_sig": false, "md5_digest": "892aa3dc9e62133664c1bfc9c1559b14", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9038, "upload_time": "2014-07-12T18:41:06", "url": "https://files.pythonhosted.org/packages/6d/5b/44707a116a8e8bb59d7b5370539dbffa95e6c638d240258f2dfac2e47cf9/dc-campaign-finance-scraper-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "3b901a7bca5f12e610e77902a8457cf8", "sha256": "4bc0613aab61e1829ea4fc8b2757eca6efea2a1e761ff973f4c2b92fa77ead70" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.5.0-cp34-cp34m-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "3b901a7bca5f12e610e77902a8457cf8", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 11382, "upload_time": "2014-07-17T03:10:09", "url": "https://files.pythonhosted.org/packages/66/a5/fb342e1f121d7e70f210ffcfdbd2513c1a7ab9116492dfe47609d54a2ca5/dc_campaign_finance_scraper-0.5.0-cp34-cp34m-macosx_10_9_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "59fa74a5284467cab9a017507b0ec10a", "sha256": "ce1304df42047988aee4a96fb23921db8c78cc143625f88f18029cf4fe75fe38" }, "downloads": -1, "filename": "dc-campaign-finance-scraper-0.5.0.tar.gz", "has_sig": false, "md5_digest": "59fa74a5284467cab9a017507b0ec10a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6712, "upload_time": "2014-07-17T03:10:05", "url": "https://files.pythonhosted.org/packages/56/d5/5efb14d42fe4b9c57c5bfa60611d9640adcca4e056600a0884490fb1ce98/dc-campaign-finance-scraper-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "2b2f1eaf8123356930c03146397b7508", "sha256": "1be47089a214e7ea0bb948629906ff4dea8f6441db4727c51e7b9c76717f9bef" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.5.1-py27-none-any.whl", "has_sig": false, "md5_digest": "2b2f1eaf8123356930c03146397b7508", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 17821, "upload_time": "2014-07-24T20:41:11", "url": "https://files.pythonhosted.org/packages/e1/a2/366d650eb141921d6a56536dfb9b0c8601fa9bf9d56002eabe1ccdb74cf4/dc_campaign_finance_scraper-0.5.1-py27-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f88826a93fbd2d9446018f649d6c2271", "sha256": "c7f45c48c14ee00a73154dc5bd200ca7062715caa5903cdeb535358031bf022b" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f88826a93fbd2d9446018f649d6c2271", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 16368, "upload_time": "2014-07-17T03:11:35", "url": "https://files.pythonhosted.org/packages/1b/ec/6739a2543fa333b8bec0d9e83a408d929f4ce714c282a659db73e0ce5080/dc_campaign_finance_scraper-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "43a198a52791f30c6f1c6ed235018dc1", "sha256": "93f1247ca74c416d3d60fe4d5afeed6c580d1409c678ce1400c86d26d9c0b9a8" }, "downloads": -1, "filename": "dc-campaign-finance-scraper-0.5.1.tar.gz", "has_sig": false, "md5_digest": "43a198a52791f30c6f1c6ed235018dc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10192, "upload_time": "2014-07-17T03:11:32", "url": "https://files.pythonhosted.org/packages/a4/d9/7b671e53d3a543988b28113412d88e783d27ec2543f8639b30a870a4da43/dc-campaign-finance-scraper-0.5.1.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "0c8f4d7b2d11ceaed9e0a74f8f2c4af6", "sha256": "8346db6840b12f236791178b2f160cf8dbf99ef578d31df99c91d6b7b328ac88" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0c8f4d7b2d11ceaed9e0a74f8f2c4af6", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18098, "upload_time": "2014-07-26T00:17:54", "url": "https://files.pythonhosted.org/packages/57/ef/202339e7d54525a73a431b63d9de31d1b4eee6695633b371b7edc31d524d/dc_campaign_finance_scraper-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "616ffc9ff531d9814a72f70d18a90b4e", "sha256": "278e75636fe0158a79914871a37b1c436cba4481b33fd8fdca656080c021e15f" }, "downloads": -1, "filename": "dc-campaign-finance-scraper-0.6.0.tar.gz", "has_sig": false, "md5_digest": "616ffc9ff531d9814a72f70d18a90b4e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11347, "upload_time": "2014-07-26T00:17:51", "url": "https://files.pythonhosted.org/packages/18/50/d48e21e20ee2809182e88be5848bf9d60d9bb197bc899c5ab31ec890dd54/dc-campaign-finance-scraper-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "b1ebeb1e7fb6ebc0fa185150afaa1432", "sha256": "a4decbcef6654f656c3783e202c61a20df821c52c3c88f094f60728ba9764536" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b1ebeb1e7fb6ebc0fa185150afaa1432", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18140, "upload_time": "2014-07-26T00:45:19", "url": "https://files.pythonhosted.org/packages/86/5f/26bce76b8ef41ba1291a7165f95fdd777ae317c0862ced61174e7839e057/dc_campaign_finance_scraper-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "01466f2d756709f050a58dc30dc03887", "sha256": "90eef8ca81f96ffba083534c8b208366fe7620759cb93298286db13d57b617ef" }, "downloads": -1, "filename": "dc-campaign-finance-scraper-0.6.1.tar.gz", "has_sig": false, "md5_digest": "01466f2d756709f050a58dc30dc03887", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11385, "upload_time": "2014-07-26T00:45:16", "url": "https://files.pythonhosted.org/packages/5d/64/c203203d6627a2c9826c9beb82efdf06b8ab9644753628a1eea6ba612a00/dc-campaign-finance-scraper-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "bd939acb2e3f403c540d8d261056bb98", "sha256": "94103762318584a9d15fa2d3708625b8b05db1d0eba0dea2347c5a77be5de2ec" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bd939acb2e3f403c540d8d261056bb98", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18141, "upload_time": "2014-07-26T01:04:29", "url": "https://files.pythonhosted.org/packages/84/a2/8d357732ca71799dcaca96146463f9da4b21d2f1c37558bf9412b8bd35eb/dc_campaign_finance_scraper-0.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "072e22089b8a086ae4f66a62d4f766f4", "sha256": "53931cb75e63dbd6d562d124afbe9befa14820ec9ed1b5f603fa89316600b57c" }, "downloads": -1, "filename": "dc-campaign-finance-scraper-0.6.2.tar.gz", "has_sig": false, "md5_digest": "072e22089b8a086ae4f66a62d4f766f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11385, "upload_time": "2014-07-26T01:04:26", "url": "https://files.pythonhosted.org/packages/fc/fd/ee024cf0b6d669e851c3afa660bfccf9ae3cc4392833abebea0e05489aab/dc-campaign-finance-scraper-0.6.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bd939acb2e3f403c540d8d261056bb98", "sha256": "94103762318584a9d15fa2d3708625b8b05db1d0eba0dea2347c5a77be5de2ec" }, "downloads": -1, "filename": "dc_campaign_finance_scraper-0.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "bd939acb2e3f403c540d8d261056bb98", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 18141, "upload_time": "2014-07-26T01:04:29", "url": "https://files.pythonhosted.org/packages/84/a2/8d357732ca71799dcaca96146463f9da4b21d2f1c37558bf9412b8bd35eb/dc_campaign_finance_scraper-0.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "072e22089b8a086ae4f66a62d4f766f4", "sha256": "53931cb75e63dbd6d562d124afbe9befa14820ec9ed1b5f603fa89316600b57c" }, "downloads": -1, "filename": "dc-campaign-finance-scraper-0.6.2.tar.gz", "has_sig": false, "md5_digest": "072e22089b8a086ae4f66a62d4f766f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11385, "upload_time": "2014-07-26T01:04:26", "url": "https://files.pythonhosted.org/packages/fc/fd/ee024cf0b6d669e851c3afa660bfccf9ae3cc4392833abebea0e05489aab/dc-campaign-finance-scraper-0.6.2.tar.gz" } ] }