{ "info": { "author": "Erick Shaffer", "author_email": "erick.shaffer321@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent" ], "description": "# BankofAmerica-Web-Scraper\n\n\n[![PyPI version](https://badge.fury.io/py/boas.svg)](https://badge.fury.io/py/boas)\n\nSelenium web scraper used to pull personal financial data from bankofamerica.com\n\n\n## About\nThis web scraper will pull account balances and all transactions from credit and checking accounts. This is meant to be\nused with a [node.js server](https://github.com/eshaffer321/BankOfAmerica-2-GoogleSheet-API) which will re-categorize and\ninsert into a [google sheet](https://docs.google.com/spreadsheets/d/14GYLeWTUBPFWYzXMAJJV4YPmwcsf6vabkQ0-CeHSqHQ/edit#gid=759515713). \n\n## Installing\n\nTo install dependencies, run\n```.env\npip install python-dotenv\npip install knack\npip install boas\n```\n\n## Usage\n\nTo run the program in a multi-threaded way, using account details from `accounts.json` run\n```.env\nboas parse run --threaded=yes --file=accounts.json\n```\n\n\n## Environment variables\n\nThis project require a `.env` file or environment variables. The only value required is the sheet api endpoint of the \n[node.js server](https://github.com/eshaffer321/BankOfAmerica-2-GoogleSheet-API).\n\nHere is an example file:\n```\nSHEET_API=\n```\n\n### Account File\nThe account credentials are stored in a json file. If you would like to login even with the security v2 security,\n you can provide the security answers in the file.\n```.env\n[{\n \"name\": \"\",\n \"username\": \"\",\n \"password\": \"\",\n \"security_questions\": {\n \"What is the name of your first employer?\": \"\",\n \"What is the street you grew up on\": \"\",\n \"What is the name of your best friend\": \"\"\n }\n}]\n\n```\n\n## How it works\n\nThis service first logs in, and then start to collect the account balances and overview from the my accounts page. Next, \nit will visit all checking and credit cards and start collecting the transaction info. This is the following information\nthat the program collects:\n\n```\nmerchant_name\ncategory\ndate\ndescription\namount\n```\n\nOnly the transactions from the current month are collected. Currently, the savings scraper isn't implemented. For my use\ncase I did not have many important transactions in savings. The amounts are still collected in the overview and displayed \nin the sheet. If you would like to implement savings, just create another entry in `page.py` and locators in `locator.py`.\nTo learn more about the page object design pattern, look at [the selenium docs](https://selenium-python.readthedocs.io/page-objects.html)\n\n\n## Important Notes / Future work\n\nI have not found a way to run selenium in headless mode. It seems bank of america detects this and asks for a capcha, \nwhich block logging in. I have not explored what options chrome driver might have to mask the headless mode.\n\n## Development\n### Testing\n\nThere is a few tests located in the test directory. These will test basic login functionality, account summary recording,\nand a full functional test of the scraper. Please replace the empty strings with your account information to run these tests.\n\nHere is an example run of a full functional test run:\n```.env\npython src/FullTests.py\n```\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/eshaffer321/BankofAmerica-Web-Scraper", "keywords": "bankofamerica,python,boa,web scraper,selenium,screen scraper,data", "license": "", "maintainer": "", "maintainer_email": "", "name": "boas", "package_url": "https://pypi.org/project/boas/", "platform": "", "project_url": "https://pypi.org/project/boas/", "project_urls": { "Homepage": "https://github.com/eshaffer321/BankofAmerica-Web-Scraper" }, "release_url": "https://pypi.org/project/boas/1.7/", "requires_dist": [ "knack" ], "requires_python": "", "summary": "Bank of America personal financial web scraper", "version": "1.7" }, "last_serial": 5565234, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "6bc61c7fd48d52d24ce75f2b2d9e956f", "sha256": "ee75a863f40504ae73f9e3e5347840c39dc5df3ee32942e70081a64c9078fd9a" }, "downloads": -1, "filename": "boas-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6bc61c7fd48d52d24ce75f2b2d9e956f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5794, "upload_time": "2019-07-21T01:24:25", "url": "https://files.pythonhosted.org/packages/10/89/a6e72001fb01cb90202c209856b8988f1612315d06fcbf449490f2ccca3f/boas-1.0-py3-none-any.whl" } ], "1.1": [ { "comment_text": "", "digests": { "md5": "5e2dab9b6fa3c48818b156f5920e7ad9", "sha256": "7c6c33c7e9bbb344d20d6e0c6acffbccab64959045205461119d73d6a0588410" }, "downloads": -1, "filename": "boas-1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "5e2dab9b6fa3c48818b156f5920e7ad9", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4139, "upload_time": "2019-07-21T22:48:32", "url": "https://files.pythonhosted.org/packages/03/61/5bb9672ca7529e28e75dbe3ed008c0a3bd0ef6cb84c7aeed6882e245f7cf/boas-1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3043cd33e530d465dde95e9b77b2165a", "sha256": "c7b1b869a291aebde9975386efdef4256f52d68a2d1b420effd6beb15b424819" }, "downloads": -1, "filename": "boas-1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3043cd33e530d465dde95e9b77b2165a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 10287, "upload_time": "2019-07-21T01:35:29", "url": "https://files.pythonhosted.org/packages/3a/a5/e1f9403c3c6a6ecb1f1338a6551073123e8701d7611cfa80dba4b9c5eebf/boas-1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e401437d0dc6a3860e47c402c53a6ea9", "sha256": "1c3c1ad4e0fdb273db961a7e93520d7e534037d342ff92df37cad96387f10809" }, "downloads": -1, "filename": "boas-1.1.tar.gz", "has_sig": false, "md5_digest": "e401437d0dc6a3860e47c402c53a6ea9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7621, "upload_time": "2019-07-21T01:35:31", "url": "https://files.pythonhosted.org/packages/de/e0/853706a3daab3124b5c71e66c526e3de44d89f5e684e821c2fd4ca5eee5c/boas-1.1.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "3a53b83054be2a023cddb5cec20ab091", "sha256": "0e94af8c588ba377f5b12d1501896674950feaf498c29cc38a31135b10fe4dd1" }, "downloads": -1, "filename": "boas-1.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "3a53b83054be2a023cddb5cec20ab091", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4165, "upload_time": "2019-07-21T22:52:04", "url": "https://files.pythonhosted.org/packages/5b/b4/bab186b359fab8e1c780908265455d0f9cef9fa740d78bfffea17f6336e7/boas-1.1.1-py2-none-any.whl" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "beb2a76026f4b1f994d1e80080f775eb", "sha256": "b2171e4657d8857bed9ce1b8b41a787f0619588607f5c9cdedef2c3a5ab2b1da" }, "downloads": -1, "filename": "boas-1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "beb2a76026f4b1f994d1e80080f775eb", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4135, "upload_time": "2019-07-21T22:59:44", "url": "https://files.pythonhosted.org/packages/17/14/3aa096ecd898ca036425f5845868287c2392bd406351396ba5696e99561c/boas-1.2-py2-none-any.whl" } ], "1.3": [ { "comment_text": "", "digests": { "md5": "e1530e11ef70bed06259cd7df6e49682", "sha256": "a19c2389dc4ab5f59f129a9322ebc5149953f1806e7b1639830488d58ec74e53" }, "downloads": -1, "filename": "boas-1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "e1530e11ef70bed06259cd7df6e49682", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 4119, "upload_time": "2019-07-21T23:13:21", "url": "https://files.pythonhosted.org/packages/b6/c0/ff91dc0d3e1e7ccabb85d0fceb907f69ce453986f6446d4797c78b940dbb/boas-1.3-py2-none-any.whl" } ], "1.4": [ { "comment_text": "", "digests": { "md5": "363d5aabeffdd12712f621421c0e86c3", "sha256": "e142424e1ab8a709081f6c5be47ba56e77c4281571917079742ba056efcef846" }, "downloads": -1, "filename": "boas-1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "363d5aabeffdd12712f621421c0e86c3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4111, "upload_time": "2019-07-21T23:51:53", "url": "https://files.pythonhosted.org/packages/83/04/fad42176e0d487b6149a98aae53a9e7d3e8443e1668432ee49e6f23c94e3/boas-1.4-py3-none-any.whl" } ], "1.5": [ { "comment_text": "", "digests": { "md5": "610acdd7f7ef48464b585637c357eb71", "sha256": "de81e35d17cdd27b37e592824fe8413de5fe52eedadd27b11d2cca3e7e6b06ac" }, "downloads": -1, "filename": "boas-1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "610acdd7f7ef48464b585637c357eb71", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5835, "upload_time": "2019-07-22T00:01:14", "url": "https://files.pythonhosted.org/packages/27/60/b84bac104aac4e698d72f7785d8d9dbef3ecbe7c34173c94399bd1465069/boas-1.5-py3-none-any.whl" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "1a92063aaca294f62af26c043391c5a2", "sha256": "2dfb3184f9399247a2f322788bb076fa78cf11b68101ae532544ce411f4259fa" }, "downloads": -1, "filename": "boas-1.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1a92063aaca294f62af26c043391c5a2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8698, "upload_time": "2019-07-22T01:16:43", "url": "https://files.pythonhosted.org/packages/fe/c8/4b95a5c1bcfa72050bae7ef28ec70d702b41587e54912a46aaf468a4c164/boas-1.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cb9a28c581ce5e50882cacc119db9010", "sha256": "94614c75781331fe2fd46d1fd2f428a1cd98d9dc2b67e0249a0a378ef5cc0a53" }, "downloads": -1, "filename": "boas-1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "cb9a28c581ce5e50882cacc119db9010", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8695, "upload_time": "2019-07-22T00:21:15", "url": "https://files.pythonhosted.org/packages/ed/33/e8c0af3d744de98f1c91bcdaede1e9fa91c8f25206d0faecabd274fd9306/boas-1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5dc74bc7c07ba49d224652e654d4d45", "sha256": "9d579e96ca62ca2f4d6e2ad0865741d93b7d32cdbc5ead4ffa7b06b69ec77d2f" }, "downloads": -1, "filename": "boas-1.6.tar.gz", "has_sig": false, "md5_digest": "b5dc74bc7c07ba49d224652e654d4d45", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6201, "upload_time": "2019-07-22T01:16:47", "url": "https://files.pythonhosted.org/packages/4b/5e/07a2c0721d4518812fb6ac93683c21d3c67be59ca7872f6176078d5e25b5/boas-1.6.tar.gz" } ], "1.7": [ { "comment_text": "", "digests": { "md5": "6d194835d06b5618a98e97a267e723c2", "sha256": "532856f21619b738f7ef65c2c7ecf6d9cc6fb9649e67b8d3551e5435ce04ed30" }, "downloads": -1, "filename": "boas-1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "6d194835d06b5618a98e97a267e723c2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13804, "upload_time": "2019-07-22T01:16:45", "url": "https://files.pythonhosted.org/packages/ea/42/c128a46e3c8179532fdaad676e4153af0cf9c8566b539ecea80eaa27a526/boas-1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "01bc8cb9e0c03dd51d0b31c47532963e", "sha256": "5d5cfddd95021cc51117ae1bbf2c4dda70d88bee6640aaad38b7a3fc725c157b" }, "downloads": -1, "filename": "boas-1.7.tar.gz", "has_sig": false, "md5_digest": "01bc8cb9e0c03dd51d0b31c47532963e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7403, "upload_time": "2019-07-22T01:16:48", "url": "https://files.pythonhosted.org/packages/a2/f9/d2e455bd1884a4c96bb0370043ea3857ff6cb04f39f61268a850ab707d1c/boas-1.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6d194835d06b5618a98e97a267e723c2", "sha256": "532856f21619b738f7ef65c2c7ecf6d9cc6fb9649e67b8d3551e5435ce04ed30" }, "downloads": -1, "filename": "boas-1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "6d194835d06b5618a98e97a267e723c2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13804, "upload_time": "2019-07-22T01:16:45", "url": "https://files.pythonhosted.org/packages/ea/42/c128a46e3c8179532fdaad676e4153af0cf9c8566b539ecea80eaa27a526/boas-1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "01bc8cb9e0c03dd51d0b31c47532963e", "sha256": "5d5cfddd95021cc51117ae1bbf2c4dda70d88bee6640aaad38b7a3fc725c157b" }, "downloads": -1, "filename": "boas-1.7.tar.gz", "has_sig": false, "md5_digest": "01bc8cb9e0c03dd51d0b31c47532963e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7403, "upload_time": "2019-07-22T01:16:48", "url": "https://files.pythonhosted.org/packages/a2/f9/d2e455bd1884a4c96bb0370043ea3857ff6cb04f39f61268a850ab707d1c/boas-1.7.tar.gz" } ] }