├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── config_files ├── config.yml └── scraper_rules.json ├── config_yaml.png ├── docker-compose.yml ├── environment.yml ├── linkedin-clean.ipynb ├── lk_scraper ├── __init__.py ├── config │ ├── __init__.py │ ├── config.py │ └── init.py └── scraper │ ├── __init__.py │ ├── driver.py │ └── scraper.py ├── setup.cfg └── setup.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 98 | __pypackages__/ 99 | 100 | # Celery stuff 101 | celerybeat-schedule 102 | celerybeat.pid 103 | 104 | # SageMath parsed files 105 | *.sage.py 106 | 107 | # Environments 108 | .env 109 | .venv 110 | env/ 111 | venv/ 112 | ENV/ 113 | env.bak/ 114 | venv.bak/ 115 | 116 | # Spyder project settings 117 | .spyderproject 118 | .spyproject 119 | 120 | # Rope project settings 121 | .ropeproject 122 | 123 | # mkdocs documentation 124 | /site 125 | 126 | # mypy 127 | .mypy_cache/ 128 | .dmypy.json 129 | dmypy.json 130 | 131 | # Pyre type checker 132 | .pyre/ 133 | 134 | # pytype static type analyzer 135 | .pytype/ 136 | 137 | # Cython debug symbols 138 | cython_debug/ 139 | .idea 140 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.7 2 | RUN pip install git+https://github.com/Hugoch/lk_scraper.git 3 | CMD ["python"] 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020, JEAN-LOUIS QUEGUINER 2 | All rights reserved. 3 | Modified 3-Clause BSD 4 | 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | * Redistributions of source code must retain the above copyright 10 | notice, this list of conditions and the following disclaimer. 11 | * Redistributions in binary form must reproduce the above copyright 12 | notice, this list of conditions and the following disclaimer in the 13 | documentation and/or other materials provided with the distribution. 14 | * Neither the name of OVH SAS nor the 15 | names of its contributors may be used to endorse or promote products 16 | derived from this software without specific prior written permission. 17 | 18 | THIS SOFTWARE IS PROVIDED BY OVH SAS AND CONTRIBUTORS ``AS IS'' AND ANY 19 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 | DISCLAIMED. IN NO EVENT SHALL OVH SAS AND CONTRIBUTORS BE LIABLE FOR ANY 22 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LinkedIn Scraper 2 | Scrapes Any LinkedIn Data 3 | 4 | ## Installation 5 | 6 | ```bash 7 | $ pip install git+git://github.com/jqueguiner/lk_scraper 8 | ``` 9 | 10 | 11 | ## Setup 12 | ### Using Docker compose 13 | ```bash 14 | $ docker-compose up -d 15 | $ docker-compose run lk_scraper python3 16 | ``` 17 | 18 | ### Using Docker only for Selenium server 19 | First, you need to run a Selenium server 20 | 21 | ```bash 22 | $ docker run -d -p 4444:4444 --shm-size 2g selenium/standalone-firefox:3.141.59-20200326 23 | ``` 24 | 25 | After running this command, from the browser navigate to your IP address followed by the port number and /grid/console. So the command will be 26 | [http://localhost:4444/grid/console](http://localhost:4444/grid/console). 27 | 28 | 29 | ## Retrieving Cookie 30 | 31 | ### Browser-Independent: 32 | Navigate to LinkedIn.com and log in 33 | Open up the browser developer tools (Ctrl-Shift-I or right click -> inspect element) 34 | ![https://www.nextscripts.com/images/sc/alt-LI-002-ch.png](https://www.nextscripts.com/images/sc/alt-LI-002-ch.png) 35 | ![https://i.stack.imgur.com/pVMyz.png](https://i.stack.imgur.com/pVMyz.png) 36 | 37 | ### Chrome: 38 | Select the Application tab 39 | Under the Storage header on the left-hand menu, click the Cookies dropdown and select www.linkedin.com 40 | Find the li_at cookie, and double click the value to select it before copying 41 | 42 | ### Firefox: 43 | Select Storage tab 44 | Click the Cookies dropdown and select www.linkedin.com 45 | Find and copy the li_at value 46 | 47 | 48 | 49 | ## Setting up the cookie 50 | ### Method 1 : Setting the cookie in the config file 51 | You can add your LinkedIn li_at cookie in the config file that is located in your home (~/.lk_scraper/config.yml) 52 | see 53 | ![https://github.com/jqueguiner/lk_scraper/raw/master/config_yaml.png](https://github.com/jqueguiner/lk_scraper/raw/master/config_yaml.png) 54 | 55 | ## Method 2 : Setting the cookie at the Scraper level 56 | ```python 57 | from lk_scraper import Scraper 58 | li_at = "My_super_linkedin_cookie" 59 | scraper = Scraper(li_at=li_at) 60 | ``` 61 | 62 | ## Method 3 : Using Variable Environment 63 | (Not implemented Yet) 64 | ```bash 65 | $ export LI_AT="My_super_linkedin_cookie" 66 | ``` 67 | 68 | ## A full working example 69 | Run the Jupyter notebook linkedin-example.ipynb 70 | 71 | 72 | ## Usage 73 | 74 | ```python 75 | from lk_scraper import Scraper 76 | scraper = Scraper() 77 | ``` 78 | 79 | ### Company Scraping 80 | 81 | ```python 82 | from lk_scraper import Scraper 83 | scraper = Scraper() 84 | company = scraper.get_object(object_name='company', object_id='apple') 85 | ``` 86 | 87 | ### Profil Scraping 88 | 89 | ```python 90 | from lk_scraper import Scraper 91 | scraper = Scraper() 92 | profil = scraper.get_object(object_name='profil', object_id='jlqueguiner') 93 | ``` 94 | 95 | -------------------------------------------------------------------------------- /config_files/config.yml: -------------------------------------------------------------------------------- 1 | selenium: 2 | protocol: "http" 3 | host: "selenium" 4 | port: 4444 5 | browserName: "firefox" 6 | javascriptEnabled: True 7 | linkedin: 8 | cookies: 9 | - name: "li_at" 10 | value: "mon_super_cookie_linkedin" 11 | domain: ".www.linkedin.com" 12 | -------------------------------------------------------------------------------- /config_files/scraper_rules.json: -------------------------------------------------------------------------------- 1 | { 2 | "company":{ 3 | "url_placeholder":"https://www.linkedin.com/company/%s/", 4 | "extract_rules":{ 5 | "com.linkedin.voyager.common.FollowingInfo":{ 6 | "list":false, 7 | "fields":[ 8 | "followerCount" 9 | ] 10 | }, 11 | "com.linkedin.voyager.deco.organization.web.WebFullCompanyMain":{ 12 | "list":false, 13 | "fields":[ 14 | "staffCount", 15 | "companyEmployeesSearchPageUrl", 16 | "acquirerCompany", 17 | "phone", 18 | "entityUrn", 19 | "headquarter", 20 | "universalName", 21 | "companyPageUrl", 22 | "url", 23 | "jobSearchPageUrl", 24 | "staffingCompany", 25 | "staffCountRange", 26 | "school", 27 | "specialities", 28 | "confirmedLocations", 29 | "name", 30 | "fundingData", 31 | "description", 32 | "partnerCompanyUrl", 33 | "rankForTopCompanies", 34 | "topCompaniesListName", 35 | "paidCompany", 36 | "affiliatedCompanies", 37 | "foundedOn", 38 | "companyType", 39 | "groups" 40 | ], 41 | "custom_fields":{ 42 | "id":{ 43 | "field":"entityUrn", 44 | "regex":":(\\d*)$" 45 | } 46 | } 47 | }, 48 | "com.linkedin.voyager.deco.organization.web.WebSimilarCompanyCardWithRelevanceReason":{ 49 | "list":true, 50 | "fields":[ 51 | "name", 52 | "url", 53 | "universalName", 54 | "school", 55 | "staffCountRange", 56 | "entityUrn" 57 | ] 58 | }, 59 | "com.linkedin.voyager.deco.organization.web.WebCompanyStockQuote":{ 60 | "list":false, 61 | "fields":[ 62 | "stockQuotes" 63 | ] 64 | } 65 | }, 66 | "subsections":{ 67 | "employees":{ 68 | "url_placeholder":"https://www.linkedin.com/search/results/people/?facetCurrentCompany=[\"{WebFullCompanyMain.id}\"]", 69 | "extract_rules":{ 70 | "com.linkedin.voyager.identity.shared.MiniProfile":{ 71 | "list":true, 72 | "fields":[ 73 | "firstName", 74 | "lastName", 75 | "occupation", 76 | "objectUrn", 77 | "publicIdentifier" 78 | ] 79 | } 80 | }, 81 | "crawler":{ 82 | "prefix":"&page=", 83 | "limit":2 84 | } 85 | }, 86 | "jobs":{ 87 | "url_placeholder":"https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C={WebFullCompanyMain.id}", 88 | "extract_rules":{ 89 | "com.linkedin.voyager.deco.jserp.WebSearchJobJserpJobPostingLite":{ 90 | "list":true, 91 | "fields":[ 92 | "title", 93 | "formattedLocation", 94 | "listedAt" 95 | ] 96 | } 97 | }, 98 | "crawler":{ 99 | "prefix":"&start=", 100 | "limit":10 101 | } 102 | } 103 | } 104 | }, 105 | "profil":{ 106 | "url_placeholder":"https://www.linkedin.com/in/%s/", 107 | "extract_rules":{ 108 | "com.linkedin.voyager.dash.deco.identity.profile.FullProfileWithEntities":{ 109 | "list":false, 110 | "fields":[ 111 | "name", 112 | "lastName", 113 | "firstName", 114 | "summary", 115 | "publicIdentifier", 116 | "volunteerCauses", 117 | "primaryLocale", 118 | "birthDateOn" 119 | ] 120 | }, 121 | "com.linkedin.voyager.dash.deco.identity.profile.FullProfileSkill":{ 122 | "list":true, 123 | "fields":[ 124 | "name" 125 | ] 126 | }, 127 | "com.linkedin.voyager.dash.deco.identity.profile.FullProfileEducation":{ 128 | "list":true, 129 | "fields":[ 130 | "degreeName", 131 | "schoolName", 132 | "fieldOfStudy", 133 | "dateRange", 134 | "entityUrn" 135 | ] 136 | }, 137 | "com.linkedin.voyager.dash.deco.identity.profile.FullProfilePosition":{ 138 | "list":true, 139 | "fields":[ 140 | "title", 141 | "companyName", 142 | "companyUrn", 143 | "fieldOfStudy", 144 | "dateRange", 145 | "companyUrn", 146 | "entityUrn", 147 | "description", 148 | "geoLocationName", 149 | "locationName" 150 | ] 151 | } 152 | } 153 | } 154 | } -------------------------------------------------------------------------------- /config_yaml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jqueguiner/lk_scraper/2c9b31baca212dfcd4d3e13a2a0ee0b7f5de658a/config_yaml.png -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.2" 2 | networks: 3 | lk_scraper-network: 4 | driver: bridge 5 | services: 6 | selenium: 7 | image: selenium/standalone-firefox:3.141.59-20200326 8 | shm_size: 2G 9 | ports: 10 | - 4444:4444 11 | networks: 12 | - lk_scraper-network 13 | lk_scraper: 14 | build: . 15 | stdin_open: true 16 | tty: true 17 | networks: 18 | - lk_scraper-network 19 | volumes: 20 | - type: bind 21 | source: ./config_files 22 | target: /root/.lk_scraper 23 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: lk_scraper 2 | channels: 3 | - conda-forge 4 | dependencies: 5 | - python 6 | - numpy 7 | - pip 8 | - pip: 9 | - selenium 10 | - PyYAML 11 | - beautifulsoup4 12 | -------------------------------------------------------------------------------- /linkedin-clean.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from lk_scraper import Scraper" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": null, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 2, 22 | "metadata": {}, 23 | "outputs": [ 24 | { 25 | "name": "stdout", 26 | "output_type": "stream", 27 | "text": [ 28 | "Loading configuration file /Users/jqueguin/.lk_scraper/config.yml\n", 29 | "Loading rules file /Users/jqueguin/.lk_scraper/scraper_rules.json\n", 30 | "Loading configuration file /Users/jqueguin/.lk_scraper/config.yml\n", 31 | "Loading rules file /Users/jqueguin/.lk_scraper/scraper_rules.json\n", 32 | "Driver loaded\n", 33 | "Cookies loaded\n" 34 | ] 35 | } 36 | ], 37 | "source": [ 38 | "scraper = Scraper()" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 3, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "name": "stdout", 48 | "output_type": "stream", 49 | "text": [ 50 | "scraping : https://www.linkedin.com/company/apple/\n", 51 | "scraping : https://www.linkedin.com/search/results/people/?facetCurrentCompany=[\"162479\"]&page=1\n", 52 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1\n", 53 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2\n", 54 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2&start=3\n", 55 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2&start=3&start=4\n", 56 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2&start=3&start=4&start=5\n", 57 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2&start=3&start=4&start=5&start=6\n", 58 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2&start=3&start=4&start=5&start=6&start=7\n", 59 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2&start=3&start=4&start=5&start=6&start=7&start=8\n", 60 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=162479&start=1&start=2&start=3&start=4&start=5&start=6&start=7&start=8&start=9\n" 61 | ] 62 | } 63 | ], 64 | "source": [ 65 | "apple = scraper.get_object(object_name='company', object_id='apple')" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 4, 71 | "metadata": {}, 72 | "outputs": [ 73 | { 74 | "name": "stdout", 75 | "output_type": "stream", 76 | "text": [ 77 | "scraping : https://www.linkedin.com/in/jlqueguiner/\n" 78 | ] 79 | } 80 | ], 81 | "source": [ 82 | "jlqueguiner = scraper.get_object(object_name='profil', object_id='jlqueguiner')" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 8, 88 | "metadata": {}, 89 | "outputs": [ 90 | { 91 | "data": { 92 | "text/plain": [ 93 | "{'FullProfilePosition': [{'dateRange': {'start': {'month': 9,\n", 94 | " 'year': 2008,\n", 95 | " '$type': 'com.linkedin.common.Date'},\n", 96 | " 'end': {'month': 12, 'year': 2011, '$type': 'com.linkedin.common.Date'},\n", 97 | " '$type': 'com.linkedin.common.DateRange'},\n", 98 | " 'multiLocaleCompanyName': {'en_US': \"Arts et Métiers ParisTech - École Nationale Supérieure d'Arts et Métiers\"},\n", 99 | " 'companyName': \"Arts et Métiers ParisTech - École Nationale Supérieure d'Arts et Métiers\",\n", 100 | " '*company': 'urn:li:fsd_company:1280025',\n", 101 | " 'title': 'MSc. Student in mecanical and industrial engineering',\n", 102 | " 'companyUrn': 'urn:li:fsd_company:1280025',\n", 103 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,193664622)',\n", 104 | " 'multiLocaleTitle': {'en_US': 'MSc. Student in mecanical and industrial engineering'}},\n", 105 | " {'dateRange': {'start': {'month': 2,\n", 106 | " 'year': 2013,\n", 107 | " '$type': 'com.linkedin.common.Date'},\n", 108 | " 'end': {'month': 2, 'year': 2015, '$type': 'com.linkedin.common.Date'},\n", 109 | " '$type': 'com.linkedin.common.DateRange'},\n", 110 | " 'multiLocaleCompanyName': {'en_US': 'CGI'},\n", 111 | " 'companyName': 'CGI',\n", 112 | " 'description': 'Spend management (shared services)',\n", 113 | " '*company': 'urn:li:fsd_company:1415',\n", 114 | " 'title': 'Data Scientist',\n", 115 | " 'companyUrn': 'urn:li:fsd_company:1415',\n", 116 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,397310790)',\n", 117 | " 'multiLocaleGeoLocationName': {'en_US': 'Montreal, Canada Area'},\n", 118 | " 'locationName': 'Montreal, Canada Area',\n", 119 | " 'multiLocaleTitle': {'en_US': 'Data Scientist'},\n", 120 | " 'geoLocationName': 'Montreal, Canada Area',\n", 121 | " 'multiLocaleDescription': {'en_US': 'Spend management (shared services)'},\n", 122 | " 'multiLocaleLocationName': {'en_US': 'Montreal, Canada Area'}},\n", 123 | " {'dateRange': {'start': {'month': 1,\n", 124 | " 'year': 2011,\n", 125 | " '$type': 'com.linkedin.common.Date'},\n", 126 | " 'end': {'month': 8, 'year': 2011, '$type': 'com.linkedin.common.Date'},\n", 127 | " '$type': 'com.linkedin.common.DateRange'},\n", 128 | " 'multiLocaleCompanyName': {'en_US': 'École de technologie supérieure (ÉTS)'},\n", 129 | " 'companyName': 'École de technologie supérieure (ÉTS)',\n", 130 | " 'description': 'Chargé de laboratoire planification et gestion de la construction.',\n", 131 | " '*company': 'urn:li:fsd_company:231953',\n", 132 | " 'title': 'Chargé de laboratoire',\n", 133 | " 'companyUrn': 'urn:li:fsd_company:231953',\n", 134 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,214886774)',\n", 135 | " 'multiLocaleGeoLocationName': {'en_US': 'Montreal, Canada Area'},\n", 136 | " 'locationName': 'Montreal, Canada Area',\n", 137 | " 'multiLocaleTitle': {'en_US': 'Chargé de laboratoire'},\n", 138 | " 'geoLocationName': 'Montreal, Canada Area',\n", 139 | " 'multiLocaleDescription': {'en_US': 'Chargé de laboratoire planification et gestion de la construction.'},\n", 140 | " 'multiLocaleLocationName': {'en_US': 'Montreal, Canada Area'}},\n", 141 | " {'dateRange': {'start': {'month': 9,\n", 142 | " 'year': 2011,\n", 143 | " '$type': 'com.linkedin.common.Date'},\n", 144 | " 'end': {'month': 2, 'year': 2013, '$type': 'com.linkedin.common.Date'},\n", 145 | " '$type': 'com.linkedin.common.DateRange'},\n", 146 | " 'multiLocaleCompanyName': {'en_US': 'Groupe AXOR Inc.'},\n", 147 | " 'companyName': 'Groupe AXOR Inc.',\n", 148 | " 'title': 'Project management - CUSM - 2.5 G$',\n", 149 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,218195140)',\n", 150 | " 'multiLocaleGeoLocationName': {'en_US': 'Montreal, Canada Area'},\n", 151 | " 'locationName': 'Montreal, Canada Area',\n", 152 | " 'multiLocaleTitle': {'en_US': 'Project management - CUSM - 2.5 G$'},\n", 153 | " 'geoLocationName': 'Montreal, Canada Area',\n", 154 | " 'multiLocaleLocationName': {'en_US': 'Montreal, Canada Area'}},\n", 155 | " {'dateRange': {'start': {'month': 9,\n", 156 | " 'year': 2010,\n", 157 | " '$type': 'com.linkedin.common.Date'},\n", 158 | " 'end': {'month': 11, 'year': 2011, '$type': 'com.linkedin.common.Date'},\n", 159 | " '$type': 'com.linkedin.common.DateRange'},\n", 160 | " 'multiLocaleCompanyName': {'en_US': 'École de technologie supérieure (ÉTS)'},\n", 161 | " 'companyName': 'École de technologie supérieure (ÉTS)',\n", 162 | " 'description': 'Design and developed a web based decision tree for project planning.',\n", 163 | " '*company': 'urn:li:fsd_company:231953',\n", 164 | " 'title': 'MSc. Research Student in construction planning',\n", 165 | " 'companyUrn': 'urn:li:fsd_company:231953',\n", 166 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,193664021)',\n", 167 | " 'multiLocaleTitle': {'en_US': 'MSc. Research Student in construction planning'},\n", 168 | " 'multiLocaleDescription': {'en_US': 'Design and developed a web based decision tree for project planning.'}},\n", 169 | " {'dateRange': {'start': {'month': 8,\n", 170 | " 'year': 2013,\n", 171 | " '$type': 'com.linkedin.common.Date'},\n", 172 | " 'end': {'month': 12, 'year': 2016, '$type': 'com.linkedin.common.Date'},\n", 173 | " '$type': 'com.linkedin.common.DateRange'},\n", 174 | " 'multiLocaleCompanyName': {'en_US': 'Madgency'},\n", 175 | " 'companyName': 'Madgency',\n", 176 | " 'description': 'Promote web sport management systems:\\n- registration, \\n- league management, \\n- fees collection & invoicing,\\n- medical records, \\n- coach & referees training certification management\\n- field & schedule management\\n- result/ ranking/ tournament management\\n- live embedded scoring\\n- media integration\\n\\nSport processes consultancy.\\n\\nMySQL/MariaDB, Groovy, Grails, Java, PHP, AJAX, JQuery, Node.js, AngularJS, AWS, EC2, Linux, RDS, Amazon S3, Load Balancing, Kafka',\n", 177 | " '*company': 'urn:li:fsd_company:3282411',\n", 178 | " 'title': 'Founder And President',\n", 179 | " 'companyUrn': 'urn:li:fsd_company:3282411',\n", 180 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,565012100)',\n", 181 | " 'multiLocaleGeoLocationName': {'en_US': 'montreal, quebec'},\n", 182 | " 'locationName': 'montreal, quebec',\n", 183 | " 'multiLocaleTitle': {'en_US': 'Founder And President'},\n", 184 | " 'geoLocationName': 'montreal, quebec',\n", 185 | " 'multiLocaleDescription': {'en_US': 'Promote web sport management systems:\\n- registration, \\n- league management, \\n- fees collection & invoicing,\\n- medical records, \\n- coach & referees training certification management\\n- field & schedule management\\n- result/ ranking/ tournament management\\n- live embedded scoring\\n- media integration\\n\\nSport processes consultancy.\\n\\nMySQL/MariaDB, Groovy, Grails, Java, PHP, AJAX, JQuery, Node.js, AngularJS, AWS, EC2, Linux, RDS, Amazon S3, Load Balancing, Kafka'},\n", 186 | " 'multiLocaleLocationName': {'en_US': 'montreal, quebec'}},\n", 187 | " {'dateRange': {'start': {'month': 6,\n", 188 | " 'year': 2016,\n", 189 | " '$type': 'com.linkedin.common.Date'},\n", 190 | " 'end': {'month': 6, 'year': 2017, '$type': 'com.linkedin.common.Date'},\n", 191 | " '$type': 'com.linkedin.common.DateRange'},\n", 192 | " 'multiLocaleCompanyName': {'en_US': 'Auchan'},\n", 193 | " 'companyName': 'Auchan',\n", 194 | " '*company': 'urn:li:fsd_company:6533',\n", 195 | " 'title': 'CTO Big Data',\n", 196 | " 'companyUrn': 'urn:li:fsd_company:6533',\n", 197 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,823628353)',\n", 198 | " 'multiLocaleGeoLocationName': {'en_US': 'Région de Lille , France'},\n", 199 | " 'locationName': 'Région de Lille , France',\n", 200 | " 'multiLocaleTitle': {'en_US': 'CTO Big Data'},\n", 201 | " 'geoLocationName': 'Région de Lille , France',\n", 202 | " 'multiLocaleLocationName': {'en_US': 'Région de Lille , France'}},\n", 203 | " {'dateRange': {'start': {'month': 6,\n", 204 | " 'year': 2017,\n", 205 | " '$type': 'com.linkedin.common.Date'},\n", 206 | " '$type': 'com.linkedin.common.DateRange'},\n", 207 | " 'multiLocaleCompanyName': {'en_US': 'OVHcloud'},\n", 208 | " 'companyName': 'OVHcloud',\n", 209 | " '*company': 'urn:li:fsd_company:1883877',\n", 210 | " 'title': 'Product Unit Lead : Data & AI | Director Database, Big Data & AI',\n", 211 | " 'companyUrn': 'urn:li:fsd_company:1883877',\n", 212 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,1015387408)',\n", 213 | " 'multiLocaleGeoLocationName': {'en_US': 'Région de Rennes, France'},\n", 214 | " 'locationName': 'Région de Rennes, France',\n", 215 | " 'multiLocaleTitle': {'en_US': 'Product Unit Lead : Data & AI | Director Database, Big Data & AI'},\n", 216 | " 'geoLocationName': 'Région de Rennes, France',\n", 217 | " 'multiLocaleLocationName': {'en_US': 'Région de Rennes, France'}},\n", 218 | " {'dateRange': {'start': {'month': 9,\n", 219 | " 'year': 2010,\n", 220 | " '$type': 'com.linkedin.common.Date'},\n", 221 | " 'end': {'month': 12, 'year': 2011, '$type': 'com.linkedin.common.Date'},\n", 222 | " '$type': 'com.linkedin.common.DateRange'},\n", 223 | " 'multiLocaleCompanyName': {'en_US': 'École de technologie supérieure (ÉTS)'},\n", 224 | " 'companyName': 'École de technologie supérieure (ÉTS)',\n", 225 | " 'description': 'Research assistant of Professor Adel Francis.\\n\\nDeveloped meta-conceptual data model as a support tool for planning based on the Chronographical Classification and Representation Model',\n", 226 | " '*company': 'urn:li:fsd_company:231953',\n", 227 | " 'title': 'Research assistant',\n", 228 | " 'companyUrn': 'urn:li:fsd_company:231953',\n", 229 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,214886380)',\n", 230 | " 'multiLocaleGeoLocationName': {'en_US': 'Montreal, Canada Area'},\n", 231 | " 'locationName': 'Montreal, Canada Area',\n", 232 | " 'multiLocaleTitle': {'en_US': 'Research assistant'},\n", 233 | " 'geoLocationName': 'Montreal, Canada Area',\n", 234 | " 'multiLocaleDescription': {'en_US': 'Research assistant of Professor Adel Francis.\\n\\nDeveloped meta-conceptual data model as a support tool for planning based on the Chronographical Classification and Representation Model'},\n", 235 | " 'multiLocaleLocationName': {'en_US': 'Montreal, Canada Area'}},\n", 236 | " {'dateRange': {'start': {'month': 3,\n", 237 | " 'year': 2015,\n", 238 | " '$type': 'com.linkedin.common.Date'},\n", 239 | " 'end': {'month': 6, 'year': 2016, '$type': 'com.linkedin.common.Date'},\n", 240 | " '$type': 'com.linkedin.common.DateRange'},\n", 241 | " 'multiLocaleCompanyName': {'en_US': 'Wajam'},\n", 242 | " 'companyName': 'Wajam',\n", 243 | " '*company': 'urn:li:fsd_company:1025636',\n", 244 | " 'title': 'Senior Big Data Developer',\n", 245 | " 'companyUrn': 'urn:li:fsd_company:1025636',\n", 246 | " 'entityUrn': 'urn:li:fsd_profilePosition:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,643417928)',\n", 247 | " 'multiLocaleGeoLocationName': {'en_US': 'Région de Montréal, Canada'},\n", 248 | " 'locationName': 'Région de Montréal, Canada',\n", 249 | " 'multiLocaleTitle': {'en_US': 'Senior Big Data Developer'},\n", 250 | " 'geoLocationName': 'Région de Montréal, Canada',\n", 251 | " 'multiLocaleLocationName': {'en_US': 'Région de Montréal, Canada'}}],\n", 252 | " 'FullProfilePositionGroup': {'entityUrn': 'urn:li:fsd_profilePositionGroup:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,6b3139d1640751e5b7e65be977ac833a4ca93c61)'},\n", 253 | " 'FullProfileSkill': [{'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,71)',\n", 254 | " 'name': 'Industrial Engineering',\n", 255 | " 'multiLocaleName': {'en_US': 'Industrial Engineering'}},\n", 256 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,67)',\n", 257 | " 'name': 'Project Planning',\n", 258 | " 'multiLocaleName': {'en_US': 'Project Planning'}},\n", 259 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,55)',\n", 260 | " 'name': 'Tableau',\n", 261 | " 'multiLocaleName': {'en_US': 'Tableau'}},\n", 262 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,79)',\n", 263 | " 'name': 'Manufacturing',\n", 264 | " 'multiLocaleName': {'en_US': 'Manufacturing'}},\n", 265 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,70)',\n", 266 | " 'name': 'Simulations',\n", 267 | " 'multiLocaleName': {'en_US': 'Simulations'}},\n", 268 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,54)',\n", 269 | " 'name': 'Python',\n", 270 | " 'multiLocaleName': {'en_US': 'Python'}},\n", 271 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,78)',\n", 272 | " 'name': 'Risk Management',\n", 273 | " 'multiLocaleName': {'en_US': 'Risk Management'}},\n", 274 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,53)',\n", 275 | " 'name': 'Data Modeling',\n", 276 | " 'multiLocaleName': {'en_US': 'Data Modeling'}},\n", 277 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,89)',\n", 278 | " 'name': 'Web Development',\n", 279 | " 'multiLocaleName': {'en_US': 'Web Development'}},\n", 280 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,49)',\n", 281 | " 'name': 'Java',\n", 282 | " 'multiLocaleName': {'en_US': 'Java'}},\n", 283 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,92)',\n", 284 | " 'name': 'Data Analysis',\n", 285 | " 'multiLocaleName': {'en_US': 'Data Analysis'}},\n", 286 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,80)',\n", 287 | " 'name': 'Project Management',\n", 288 | " 'multiLocaleName': {'en_US': 'Project Management'}},\n", 289 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,52)',\n", 290 | " 'name': 'SQL',\n", 291 | " 'multiLocaleName': {'en_US': 'SQL'}},\n", 292 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,64)',\n", 293 | " 'name': 'Test Driven Development',\n", 294 | " 'multiLocaleName': {'en_US': 'Test Driven Development'}},\n", 295 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,63)',\n", 296 | " 'name': 'Linux server administration',\n", 297 | " 'multiLocaleName': {'en_US': 'Linux server administration'}},\n", 298 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,51)',\n", 299 | " 'name': 'MySQL',\n", 300 | " 'multiLocaleName': {'en_US': 'MySQL'}},\n", 301 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,50)',\n", 302 | " 'name': 'Scala',\n", 303 | " 'multiLocaleName': {'en_US': 'Scala'}},\n", 304 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,73)',\n", 305 | " 'name': 'Business Process Improvement',\n", 306 | " 'multiLocaleName': {'en_US': 'Business Process Improvement'}},\n", 307 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,72)',\n", 308 | " 'name': 'Management',\n", 309 | " 'multiLocaleName': {'en_US': 'Management'}},\n", 310 | " {'entityUrn': 'urn:li:fsd_skill:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,56)',\n", 311 | " 'name': 'C++',\n", 312 | " 'multiLocaleName': {'en_US': 'C++'}}],\n", 313 | " 'LinkablePositionCompany': [{'industry': {'*urn:li:fsd_industry:68': 'urn:li:fsd_industry:68'},\n", 314 | " 'industryUrns': ['urn:li:fsd_industry:68'],\n", 315 | " 'url': 'https://www.linkedin.com/company/-cole-de-technologie-sup-rieure-ts-/',\n", 316 | " 'employeeCountRange': {'start': 501,\n", 317 | " 'end': 1000,\n", 318 | " '$recipeTypes': ['com.linkedin.voyager.dash.deco.common.IntegerRange'],\n", 319 | " '$type': 'com.linkedin.common.IntegerRange'},\n", 320 | " 'entityUrn': 'urn:li:fsd_company:231953',\n", 321 | " 'name': 'École de technologie supérieure',\n", 322 | " 'universalName': '-cole-de-technologie-sup-rieure-ts-'},\n", 323 | " {'industryUrns': None,\n", 324 | " 'url': 'https://www.linkedin.com/company/madgency/',\n", 325 | " 'employeeCountRange': None,\n", 326 | " 'entityUrn': 'urn:li:fsd_company:3282411',\n", 327 | " 'name': 'Madgency',\n", 328 | " 'universalName': 'madgency'},\n", 329 | " {'industry': {'*urn:li:fsd_industry:6': 'urn:li:fsd_industry:6'},\n", 330 | " 'industryUrns': ['urn:li:fsd_industry:6'],\n", 331 | " 'url': 'https://www.linkedin.com/company/ovhgroup/',\n", 332 | " 'employeeCountRange': {'start': 1001,\n", 333 | " 'end': 5000,\n", 334 | " '$recipeTypes': ['com.linkedin.voyager.dash.deco.common.IntegerRange'],\n", 335 | " '$type': 'com.linkedin.common.IntegerRange'},\n", 336 | " 'entityUrn': 'urn:li:fsd_company:1883877',\n", 337 | " 'name': 'OVHcloud',\n", 338 | " 'universalName': 'ovhgroup'},\n", 339 | " {'industry': {'*urn:li:fsd_industry:96': 'urn:li:fsd_industry:96'},\n", 340 | " 'industryUrns': ['urn:li:fsd_industry:96'],\n", 341 | " 'url': 'https://www.linkedin.com/company/cgi/',\n", 342 | " 'employeeCountRange': {'start': 10001,\n", 343 | " '$recipeTypes': ['com.linkedin.voyager.dash.deco.common.IntegerRange'],\n", 344 | " '$type': 'com.linkedin.common.IntegerRange'},\n", 345 | " 'entityUrn': 'urn:li:fsd_company:1415',\n", 346 | " 'name': 'CGI',\n", 347 | " 'universalName': 'cgi'},\n", 348 | " {'industry': {'*urn:li:fsd_industry:6': 'urn:li:fsd_industry:6'},\n", 349 | " 'industryUrns': ['urn:li:fsd_industry:6'],\n", 350 | " 'url': 'https://www.linkedin.com/company/wajam/',\n", 351 | " 'employeeCountRange': {'start': 11,\n", 352 | " 'end': 50,\n", 353 | " '$recipeTypes': ['com.linkedin.voyager.dash.deco.common.IntegerRange'],\n", 354 | " '$type': 'com.linkedin.common.IntegerRange'},\n", 355 | " 'entityUrn': 'urn:li:fsd_company:1025636',\n", 356 | " 'name': 'Wajam',\n", 357 | " 'universalName': 'wajam'},\n", 358 | " {'industry': {'*urn:li:fsd_industry:68': 'urn:li:fsd_industry:68'},\n", 359 | " 'industryUrns': ['urn:li:fsd_industry:68'],\n", 360 | " 'url': 'https://www.linkedin.com/company/arts-et-m-tiers-paristech/',\n", 361 | " 'employeeCountRange': None,\n", 362 | " 'entityUrn': 'urn:li:fsd_company:1280025',\n", 363 | " 'name': \"Arts et Métiers ParisTech - École Nationale Supérieure d'Arts et Métiers\",\n", 364 | " 'universalName': 'arts-et-m-tiers-paristech'},\n", 365 | " {'industry': {'*urn:li:fsd_industry:27': 'urn:li:fsd_industry:27'},\n", 366 | " 'industryUrns': ['urn:li:fsd_industry:27'],\n", 367 | " 'url': 'https://www.linkedin.com/company/auchan/',\n", 368 | " 'employeeCountRange': {'start': 10001,\n", 369 | " '$recipeTypes': ['com.linkedin.voyager.dash.deco.common.IntegerRange'],\n", 370 | " '$type': 'com.linkedin.common.IntegerRange'},\n", 371 | " 'entityUrn': 'urn:li:fsd_company:6533',\n", 372 | " 'name': 'Auchan Retail',\n", 373 | " 'universalName': 'auchan'}],\n", 374 | " 'MiniSchool': [{'url': 'https://www.linkedin.com/company/14034/',\n", 375 | " 'entityUrn': 'urn:li:fsd_school:12398',\n", 376 | " 'name': 'École Polytechnique'},\n", 377 | " {'url': 'https://www.linkedin.com/company/231953/',\n", 378 | " 'entityUrn': 'urn:li:fsd_school:10897',\n", 379 | " 'name': 'École de technologie supérieure'},\n", 380 | " {'url': 'https://www.linkedin.com/company/1280025/',\n", 381 | " 'entityUrn': 'urn:li:fsd_school:12364',\n", 382 | " 'name': \"Arts et Métiers ParisTech - École Nationale Supérieure d'Arts et Métiers\"}],\n", 383 | " 'CountryGeo': {'countryUrn': None,\n", 384 | " 'entityUrn': 'urn:li:fsd_geo:105015875',\n", 385 | " 'defaultLocalizedName': 'France'},\n", 386 | " 'Geo': {'countryUrn': 'urn:li:fsd_geo:105015875',\n", 387 | " 'defaultLocalizedNameWithoutCountryName': 'Greater Rennes Metropolitan Area',\n", 388 | " '*country': 'urn:li:fsd_geo:105015875',\n", 389 | " 'entityUrn': 'urn:li:fsd_geo:90009682',\n", 390 | " 'defaultLocalizedName': 'Greater Rennes Metropolitan Area'},\n", 391 | " 'Industry': [{'entityUrn': 'urn:li:fsd_industry:6', 'name': 'Internet'},\n", 392 | " {'entityUrn': 'urn:li:fsd_industry:84', 'name': 'Information Services'},\n", 393 | " {'entityUrn': 'urn:li:fsd_industry:68', 'name': 'Higher Education'},\n", 394 | " {'entityUrn': 'urn:li:fsd_industry:96',\n", 395 | " 'name': 'Information Technology & Services'},\n", 396 | " {'entityUrn': 'urn:li:fsd_industry:27', 'name': 'Retail'}],\n", 397 | " 'FullProfileEducation': [{'dateRange': {'start': {'year': 2008,\n", 398 | " '$type': 'com.linkedin.common.Date'},\n", 399 | " 'end': {'year': 2011, '$type': 'com.linkedin.common.Date'},\n", 400 | " '$type': 'com.linkedin.common.DateRange'},\n", 401 | " 'degreeName': 'Master of science',\n", 402 | " 'multiLocaleSchoolName': {'en_US': \"Ecole nationale supérieure d'Arts et Métiers\"},\n", 403 | " 'schoolUrn': 'urn:li:fsd_school:12364',\n", 404 | " 'entityUrn': 'urn:li:fsd_profileEducation:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,64762590)',\n", 405 | " '*school': 'urn:li:fsd_school:12364',\n", 406 | " 'multiLocaleFieldOfStudy': {'en_US': 'engineering'},\n", 407 | " 'schoolName': \"Ecole nationale supérieure d'Arts et Métiers\",\n", 408 | " 'fieldOfStudy': 'engineering',\n", 409 | " 'multiLocaleDegreeName': {'en_US': 'Master of science'}},\n", 410 | " {'dateRange': {'start': {'year': 2017, '$type': 'com.linkedin.common.Date'},\n", 411 | " 'end': {'year': 2017, '$type': 'com.linkedin.common.Date'},\n", 412 | " '$type': 'com.linkedin.common.DateRange'},\n", 413 | " 'degreeName': 'Data Science Summer School',\n", 414 | " 'multiLocaleSchoolName': {'en_US': 'École Polytechnique'},\n", 415 | " 'schoolUrn': 'urn:li:fsd_school:12398',\n", 416 | " 'entityUrn': 'urn:li:fsd_profileEducation:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,446372139)',\n", 417 | " '*school': 'urn:li:fsd_school:12398',\n", 418 | " 'multiLocaleFieldOfStudy': {'en_US': 'Data Science'},\n", 419 | " 'schoolName': 'École Polytechnique',\n", 420 | " 'fieldOfStudy': 'Data Science',\n", 421 | " 'multiLocaleDegreeName': {'en_US': 'Data Science Summer School'}},\n", 422 | " {'dateRange': {'start': {'year': 2010, '$type': 'com.linkedin.common.Date'},\n", 423 | " 'end': {'year': 2011, '$type': 'com.linkedin.common.Date'},\n", 424 | " '$type': 'com.linkedin.common.DateRange'},\n", 425 | " 'degreeName': 'Master of science',\n", 426 | " 'multiLocaleSchoolName': {'en_US': 'Université du Québec - Ecole de Technologie supérieure'},\n", 427 | " 'schoolUrn': 'urn:li:fsd_school:10897',\n", 428 | " 'entityUrn': 'urn:li:fsd_profileEducation:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,74007404)',\n", 429 | " '*school': 'urn:li:fsd_school:10897',\n", 430 | " 'multiLocaleFieldOfStudy': {'en_US': 'engineering'},\n", 431 | " 'schoolName': 'Université du Québec - Ecole de Technologie supérieure',\n", 432 | " 'fieldOfStudy': 'engineering',\n", 433 | " 'multiLocaleDegreeName': {'en_US': 'Master of science'}}],\n", 434 | " 'FullProfileLanguage': [{'entityUrn': 'urn:li:fsd_profileLanguage:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,36)',\n", 435 | " 'name': 'Spanish',\n", 436 | " 'multiLocaleName': {'en_US': 'Spanish'},\n", 437 | " 'proficiency': 'ELEMENTARY'},\n", 438 | " {'entityUrn': 'urn:li:fsd_profileLanguage:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,35)',\n", 439 | " 'name': 'Chinese',\n", 440 | " 'multiLocaleName': {'en_US': 'Chinese'},\n", 441 | " 'proficiency': 'ELEMENTARY'},\n", 442 | " {'entityUrn': 'urn:li:fsd_profileLanguage:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,37)',\n", 443 | " 'name': 'French',\n", 444 | " 'multiLocaleName': {'en_US': 'French'},\n", 445 | " 'proficiency': 'NATIVE_OR_BILINGUAL'},\n", 446 | " {'entityUrn': 'urn:li:fsd_profileLanguage:(ACoAAAZZM00BEZ1khtdIdKiAX_Wf0Id-G08JUBw,34)',\n", 447 | " 'name': 'English',\n", 448 | " 'multiLocaleName': {'en_US': 'English'},\n", 449 | " 'proficiency': 'NATIVE_OR_BILINGUAL'}]}" 450 | ] 451 | }, 452 | "execution_count": 8, 453 | "metadata": {}, 454 | "output_type": "execute_result" 455 | } 456 | ], 457 | "source": [ 458 | "jlqueguiner" 459 | ] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": 9, 464 | "metadata": {}, 465 | "outputs": [ 466 | { 467 | "name": "stdout", 468 | "output_type": "stream", 469 | "text": [ 470 | "scraping : https://www.linkedin.com/company/google/\n", 471 | "Loading configuration file /Users/jqueguin/.lk_scraper/config.yml\n", 472 | "Loading rules file /Users/jqueguin/.lk_scraper/scraper_rules.json\n", 473 | "Driver loaded\n", 474 | "Cookies loaded\n", 475 | "scraping : https://www.linkedin.com/search/results/people/?facetCurrentCompany=[\"1441\"]&page=1\n", 476 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1\n", 477 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2\n", 478 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2&start=3\n", 479 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2&start=3&start=4\n", 480 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2&start=3&start=4&start=5\n", 481 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2&start=3&start=4&start=5&start=6\n", 482 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2&start=3&start=4&start=5&start=6&start=7\n", 483 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2&start=3&start=4&start=5&start=6&start=7&start=8\n", 484 | "scraping : https://www.linkedin.com/jobs/search/?locationId=OTHERS.worldwide&f_C=1441&start=1&start=2&start=3&start=4&start=5&start=6&start=7&start=8&start=9\n" 485 | ] 486 | }, 487 | { 488 | "ename": "TypeError", 489 | "evalue": "list indices must be integers or slices, not str", 490 | "output_type": "error", 491 | "traceback": [ 492 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 493 | "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", 494 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcompany_name\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcompanies\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mcompanies_infos\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcompany_name\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mscraper\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_object\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'company'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mobject_id\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcompany_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", 495 | "\u001b[0;31mTypeError\u001b[0m: list indices must be integers or slices, not str" 496 | ] 497 | } 498 | ], 499 | "source": [ 500 | "\n", 501 | "companies_infos = list()\n", 502 | "companies = ['google', 'apple']\n", 503 | "\n", 504 | "for company_name in companies:\n", 505 | " companies_infos[company_name] = scraper.get_object(object_name='company', object_id=company_name)\n", 506 | " " 507 | ] 508 | }, 509 | { 510 | "cell_type": "code", 511 | "execution_count": 6, 512 | "metadata": {}, 513 | "outputs": [ 514 | { 515 | "data": { 516 | "text/plain": [ 517 | "[{'FollowingInfo': {'followerCount': None},\n", 518 | " 'WebFullCompanyMain': {'staffCount': 192000,\n", 519 | " 'companyEmployeesSearchPageUrl': 'https://www.linkedin.com/vsearch/p?f_CC=1441',\n", 520 | " 'acquirerCompany': None,\n", 521 | " 'phone': None,\n", 522 | " 'entityUrn': 'urn:li:fs_normalized_company:1441',\n", 523 | " 'headquarter': {'country': 'US',\n", 524 | " 'geographicArea': 'CA',\n", 525 | " 'city': 'Mountain View',\n", 526 | " 'postalCode': '94043',\n", 527 | " 'line1': '1600 Amphitheatre Parkway',\n", 528 | " '$type': 'com.linkedin.common.Address'},\n", 529 | " 'universalName': 'google',\n", 530 | " 'companyPageUrl': 'https://careers.google.com/?src=Online/LinkedIn/linkedin_profilepage&utm_source=linkedin&utm_medium=profilepage&utm_campaign=profilepage',\n", 531 | " 'url': 'https://www.linkedin.com/company/1441',\n", 532 | " 'jobSearchPageUrl': 'https://www.linkedin.com/jobs/search?locationId=OTHERS%2Eworldwide&f_C=1441%2C791962%2C2374003%2C18950635%2C16140%2C10440912',\n", 533 | " 'staffingCompany': False,\n", 534 | " 'staffCountRange': {'start': 10001,\n", 535 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 536 | " 'school': None,\n", 537 | " 'specialities': ['search',\n", 538 | " 'ads',\n", 539 | " 'mobile',\n", 540 | " 'android',\n", 541 | " 'online video',\n", 542 | " 'apps',\n", 543 | " 'machine learning',\n", 544 | " 'virtual reality',\n", 545 | " 'cloud',\n", 546 | " 'hardware',\n", 547 | " 'artificial intelligence',\n", 548 | " 'youtube',\n", 549 | " 'software'],\n", 550 | " 'confirmedLocations': [{'country': 'US',\n", 551 | " 'geographicArea': 'CA',\n", 552 | " 'city': 'Mountain View',\n", 553 | " 'postalCode': '94043',\n", 554 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 555 | " 'streetAddressOptOut': False,\n", 556 | " 'headquarter': True,\n", 557 | " 'line1': '1600 Amphitheatre Parkway'},\n", 558 | " {'country': 'US',\n", 559 | " 'geographicArea': 'NY',\n", 560 | " 'city': 'New York',\n", 561 | " 'postalCode': '10011',\n", 562 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 563 | " 'streetAddressOptOut': False,\n", 564 | " 'headquarter': False,\n", 565 | " 'line1': '111 8th Ave'},\n", 566 | " {'country': 'NL',\n", 567 | " 'geographicArea': 'North Holland',\n", 568 | " 'city': 'Amsterdam',\n", 569 | " 'postalCode': '1082 MD',\n", 570 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 571 | " 'streetAddressOptOut': False,\n", 572 | " 'headquarter': False,\n", 573 | " 'line1': 'Claude Debussylaan 34'},\n", 574 | " {'country': 'BR',\n", 575 | " 'geographicArea': 'SP',\n", 576 | " 'city': 'Sao Paulo',\n", 577 | " 'postalCode': '04538-133',\n", 578 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 579 | " 'streetAddressOptOut': False,\n", 580 | " 'headquarter': False,\n", 581 | " 'line1': 'Avenida Brigadeiro Faria Lima, 3477'},\n", 582 | " {'country': 'CA',\n", 583 | " 'geographicArea': 'ON',\n", 584 | " 'city': 'Kitchener',\n", 585 | " 'postalCode': 'N2H 5G5',\n", 586 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 587 | " 'streetAddressOptOut': False,\n", 588 | " 'headquarter': False,\n", 589 | " 'line1': '51 Breithaupt St'},\n", 590 | " {'country': 'IE',\n", 591 | " 'geographicArea': 'County Dublin',\n", 592 | " 'city': 'Dublin',\n", 593 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 594 | " 'streetAddressOptOut': False,\n", 595 | " 'headquarter': False,\n", 596 | " 'line1': 'Barrow Street'},\n", 597 | " {'country': 'IN',\n", 598 | " 'geographicArea': 'Karnataka',\n", 599 | " 'city': 'Bengaluru',\n", 600 | " 'postalCode': '560016',\n", 601 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 602 | " 'streetAddressOptOut': False,\n", 603 | " 'headquarter': False,\n", 604 | " 'line1': 'Old Madras Road'},\n", 605 | " {'country': 'US',\n", 606 | " 'geographicArea': 'CO',\n", 607 | " 'city': 'Boulder',\n", 608 | " 'postalCode': '80302',\n", 609 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 610 | " 'streetAddressOptOut': False,\n", 611 | " 'headquarter': False,\n", 612 | " 'line1': '2590 Pearl St'},\n", 613 | " {'country': 'US',\n", 614 | " 'geographicArea': 'WA',\n", 615 | " 'city': 'Seattle',\n", 616 | " 'postalCode': '98103',\n", 617 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 618 | " 'streetAddressOptOut': False,\n", 619 | " 'headquarter': False,\n", 620 | " 'line1': '601 N 34th St'},\n", 621 | " {'country': 'AU',\n", 622 | " 'geographicArea': 'NSW',\n", 623 | " 'city': 'Sydney',\n", 624 | " 'postalCode': '2009',\n", 625 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 626 | " 'streetAddressOptOut': False,\n", 627 | " 'headquarter': False,\n", 628 | " 'line1': '48 Pirrama Rd'},\n", 629 | " {'country': 'US',\n", 630 | " 'geographicArea': 'CA',\n", 631 | " 'city': 'Irvine',\n", 632 | " 'postalCode': '92612',\n", 633 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 634 | " 'streetAddressOptOut': False,\n", 635 | " 'headquarter': False,\n", 636 | " 'line1': '19510 Jamboree Rd'},\n", 637 | " {'country': 'US',\n", 638 | " 'geographicArea': 'IL',\n", 639 | " 'city': 'Chicago',\n", 640 | " 'postalCode': '60607',\n", 641 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 642 | " 'streetAddressOptOut': False,\n", 643 | " 'headquarter': False,\n", 644 | " 'line1': '320 N Morgan St'},\n", 645 | " {'country': 'IN',\n", 646 | " 'geographicArea': 'Maharashtra',\n", 647 | " 'city': 'Mumbai',\n", 648 | " 'postalCode': '400051',\n", 649 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 650 | " 'streetAddressOptOut': False,\n", 651 | " 'headquarter': False,\n", 652 | " 'line1': '3 Bandra Kurla Complex Road'},\n", 653 | " {'country': 'PH',\n", 654 | " 'geographicArea': 'National Capital Region',\n", 655 | " 'city': 'Taguig City',\n", 656 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 657 | " 'streetAddressOptOut': False,\n", 658 | " 'headquarter': False,\n", 659 | " 'line1': '5th Ave'},\n", 660 | " {'country': 'SG',\n", 661 | " 'geographicArea': 'Singapore',\n", 662 | " 'city': 'Singapore',\n", 663 | " 'postalCode': '118484',\n", 664 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 665 | " 'streetAddressOptOut': False,\n", 666 | " 'headquarter': False,\n", 667 | " 'line1': '3 Pasir Panjang Rd'},\n", 668 | " {'country': 'IN',\n", 669 | " 'geographicArea': 'TS',\n", 670 | " 'city': 'Hyderabad',\n", 671 | " 'postalCode': '500084',\n", 672 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 673 | " 'streetAddressOptOut': False,\n", 674 | " 'headquarter': False,\n", 675 | " 'line1': '13'},\n", 676 | " {'country': 'AU',\n", 677 | " 'geographicArea': 'VIC',\n", 678 | " 'city': 'Melbourne',\n", 679 | " 'postalCode': '3000',\n", 680 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 681 | " 'streetAddressOptOut': False,\n", 682 | " 'headquarter': False,\n", 683 | " 'line1': '90 Collins St'},\n", 684 | " {'country': 'US',\n", 685 | " 'geographicArea': 'CA',\n", 686 | " 'city': 'San Bruno',\n", 687 | " 'postalCode': '94066',\n", 688 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 689 | " 'streetAddressOptOut': False,\n", 690 | " 'headquarter': False,\n", 691 | " 'line1': '901 Cherry Ave'},\n", 692 | " {'country': 'ES',\n", 693 | " 'geographicArea': 'Community of Madrid',\n", 694 | " 'city': 'Madrid',\n", 695 | " 'postalCode': '28046',\n", 696 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 697 | " 'streetAddressOptOut': False,\n", 698 | " 'headquarter': False,\n", 699 | " 'line1': 'Plaza Pablo Ruiz Picasso'},\n", 700 | " {'country': 'US',\n", 701 | " 'geographicArea': 'DC',\n", 702 | " 'city': 'Washington',\n", 703 | " 'postalCode': '20001',\n", 704 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 705 | " 'streetAddressOptOut': False,\n", 706 | " 'headquarter': False,\n", 707 | " 'line1': '25 Massachusetts Ave NW'},\n", 708 | " {'country': 'IN',\n", 709 | " 'geographicArea': 'HR',\n", 710 | " 'city': 'Gurugram',\n", 711 | " 'postalCode': '122001',\n", 712 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 713 | " 'streetAddressOptOut': False,\n", 714 | " 'headquarter': False,\n", 715 | " 'line1': '15'},\n", 716 | " {'country': 'CO',\n", 717 | " 'geographicArea': 'Bogota, D.C.',\n", 718 | " 'city': 'Bogota',\n", 719 | " 'postalCode': '110221',\n", 720 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 721 | " 'streetAddressOptOut': False,\n", 722 | " 'headquarter': False,\n", 723 | " 'line1': 'Carrera 11A 94-45'},\n", 724 | " {'country': 'HK',\n", 725 | " 'geographicArea': 'Hong Kong',\n", 726 | " 'city': 'Wan Chai',\n", 727 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 728 | " 'streetAddressOptOut': False,\n", 729 | " 'headquarter': False,\n", 730 | " 'line1': '2 Matheson St'},\n", 731 | " {'country': 'US',\n", 732 | " 'geographicArea': 'VA',\n", 733 | " 'city': 'Reston',\n", 734 | " 'postalCode': '20190',\n", 735 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 736 | " 'streetAddressOptOut': False,\n", 737 | " 'headquarter': False,\n", 738 | " 'line1': '1875 Explorer St'},\n", 739 | " {'country': 'CA',\n", 740 | " 'geographicArea': 'ON',\n", 741 | " 'city': 'Toronto',\n", 742 | " 'postalCode': 'M5H 2G4',\n", 743 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 744 | " 'streetAddressOptOut': False,\n", 745 | " 'headquarter': False,\n", 746 | " 'line1': '111 Richmond St W'},\n", 747 | " {'country': 'US',\n", 748 | " 'geographicArea': 'CA',\n", 749 | " 'city': 'San Francisco',\n", 750 | " 'postalCode': '94105',\n", 751 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 752 | " 'streetAddressOptOut': False,\n", 753 | " 'headquarter': False,\n", 754 | " 'line1': '345 Spear St'},\n", 755 | " {'country': 'US',\n", 756 | " 'geographicArea': 'MA',\n", 757 | " 'city': 'Cambridge',\n", 758 | " 'postalCode': '02142',\n", 759 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 760 | " 'streetAddressOptOut': False,\n", 761 | " 'headquarter': False,\n", 762 | " 'line1': '355 Main St'},\n", 763 | " {'country': 'IT',\n", 764 | " 'geographicArea': 'Lomb.',\n", 765 | " 'city': 'Milan',\n", 766 | " 'postalCode': '20124',\n", 767 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 768 | " 'streetAddressOptOut': False,\n", 769 | " 'headquarter': False,\n", 770 | " 'line1': 'Via Federico Confalonieri, 4'},\n", 771 | " {'country': 'GB',\n", 772 | " 'geographicArea': 'England',\n", 773 | " 'city': 'London',\n", 774 | " 'postalCode': 'WC2H 8AG',\n", 775 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 776 | " 'streetAddressOptOut': False,\n", 777 | " 'headquarter': False,\n", 778 | " 'line1': 'St Giles High Street'},\n", 779 | " {'country': 'US',\n", 780 | " 'geographicArea': 'TX',\n", 781 | " 'city': 'Austin',\n", 782 | " 'postalCode': '78759',\n", 783 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 784 | " 'streetAddressOptOut': False,\n", 785 | " 'headquarter': False,\n", 786 | " 'line1': '9606 N Mopac Expy'},\n", 787 | " {'country': 'US',\n", 788 | " 'geographicArea': 'CA',\n", 789 | " 'city': 'Los Angeles',\n", 790 | " 'postalCode': '90291',\n", 791 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 792 | " 'streetAddressOptOut': False,\n", 793 | " 'headquarter': False,\n", 794 | " 'line1': '340 Main St'},\n", 795 | " {'country': 'ES',\n", 796 | " 'geographicArea': 'Community of Madrid',\n", 797 | " 'city': 'Madrid',\n", 798 | " 'postalCode': '28020',\n", 799 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 800 | " 'streetAddressOptOut': False,\n", 801 | " 'headquarter': False,\n", 802 | " 'line1': 'Plaza Pablo Ruiz Picasso'},\n", 803 | " {'country': 'US',\n", 804 | " 'geographicArea': 'MI',\n", 805 | " 'city': 'Ann Arbor',\n", 806 | " 'postalCode': '48105',\n", 807 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 808 | " 'streetAddressOptOut': False,\n", 809 | " 'headquarter': False,\n", 810 | " 'line1': '2300 Traverwood Dr'},\n", 811 | " {'country': 'CL',\n", 812 | " 'geographicArea': 'Santiago Metropolitan',\n", 813 | " 'city': 'Las Condes',\n", 814 | " 'postalCode': '7550000',\n", 815 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 816 | " 'streetAddressOptOut': False,\n", 817 | " 'headquarter': False,\n", 818 | " 'line1': 'Avenida Costanera Sur'},\n", 819 | " {'country': 'US',\n", 820 | " 'geographicArea': 'GA',\n", 821 | " 'city': 'Atlanta',\n", 822 | " 'postalCode': '30309',\n", 823 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 824 | " 'streetAddressOptOut': False,\n", 825 | " 'headquarter': False,\n", 826 | " 'line1': '10 10th St NE'},\n", 827 | " {'country': 'PL',\n", 828 | " 'geographicArea': 'MA',\n", 829 | " 'city': 'Warsaw',\n", 830 | " 'postalCode': '00-125',\n", 831 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 832 | " 'streetAddressOptOut': False,\n", 833 | " 'headquarter': False,\n", 834 | " 'line1': 'ulica Emilii Plater 53'},\n", 835 | " {'country': 'IN',\n", 836 | " 'geographicArea': 'Karnataka',\n", 837 | " 'city': 'Bengaluru',\n", 838 | " 'postalCode': '560016',\n", 839 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 840 | " 'streetAddressOptOut': False,\n", 841 | " 'headquarter': False,\n", 842 | " 'line1': '3 Swamy Vivekananda Road'},\n", 843 | " {'country': 'US',\n", 844 | " 'geographicArea': 'WA',\n", 845 | " 'city': 'Kirkland',\n", 846 | " 'postalCode': '98033',\n", 847 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 848 | " 'streetAddressOptOut': False,\n", 849 | " 'headquarter': False,\n", 850 | " 'line1': '777 6th St S'},\n", 851 | " {'country': 'DE',\n", 852 | " 'geographicArea': 'BY',\n", 853 | " 'city': 'Munich',\n", 854 | " 'postalCode': '80636',\n", 855 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 856 | " 'streetAddressOptOut': False,\n", 857 | " 'headquarter': False,\n", 858 | " 'line1': 'Erika-Mann-Strasse 33'},\n", 859 | " {'country': 'MX',\n", 860 | " 'geographicArea': 'CDMX',\n", 861 | " 'city': 'Miguel Hidalgo',\n", 862 | " 'postalCode': '11000',\n", 863 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 864 | " 'streetAddressOptOut': False,\n", 865 | " 'headquarter': False,\n", 866 | " 'line1': 'Montes Urales'},\n", 867 | " {'country': 'AR',\n", 868 | " 'geographicArea': 'Buenos Aires Autonomous City',\n", 869 | " 'city': 'Buenos Aires City',\n", 870 | " 'postalCode': '1107',\n", 871 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 872 | " 'streetAddressOptOut': False,\n", 873 | " 'headquarter': False,\n", 874 | " 'line1': 'Avenida Alicia Moreau de Justo 350'},\n", 875 | " {'country': 'FR',\n", 876 | " 'geographicArea': 'IdF',\n", 877 | " 'city': 'Paris',\n", 878 | " 'postalCode': '75009',\n", 879 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 880 | " 'streetAddressOptOut': False,\n", 881 | " 'headquarter': False,\n", 882 | " 'line1': '8 Rue de Londres'},\n", 883 | " {'country': 'IL',\n", 884 | " 'geographicArea': 'Tel Aviv',\n", 885 | " 'city': 'Tel Aviv-Yafo',\n", 886 | " 'postalCode': '67891',\n", 887 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 888 | " 'streetAddressOptOut': False,\n", 889 | " 'headquarter': False,\n", 890 | " 'line1': 'Yigal Allon 98'},\n", 891 | " {'country': 'DE',\n", 892 | " 'geographicArea': 'BE',\n", 893 | " 'city': 'Berlin',\n", 894 | " 'postalCode': '10117',\n", 895 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 896 | " 'streetAddressOptOut': False,\n", 897 | " 'headquarter': False,\n", 898 | " 'line1': 'Unter den Linden 14'},\n", 899 | " {'country': 'DE',\n", 900 | " 'geographicArea': 'HH',\n", 901 | " 'city': 'Hamburg',\n", 902 | " 'postalCode': '20354',\n", 903 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 904 | " 'streetAddressOptOut': False,\n", 905 | " 'headquarter': False,\n", 906 | " 'line1': 'ABC-Strasse 19'},\n", 907 | " {'country': 'US',\n", 908 | " 'geographicArea': 'TX',\n", 909 | " 'city': 'Frisco',\n", 910 | " 'postalCode': '75034',\n", 911 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 912 | " 'streetAddressOptOut': False,\n", 913 | " 'headquarter': False,\n", 914 | " 'line1': '6175 Main St'},\n", 915 | " {'country': 'CH',\n", 916 | " 'geographicArea': 'ZH',\n", 917 | " 'city': 'Zurich',\n", 918 | " 'postalCode': '8002',\n", 919 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 920 | " 'streetAddressOptOut': False,\n", 921 | " 'headquarter': False,\n", 922 | " 'line1': 'Brandschenkestrasse 110'},\n", 923 | " {'country': 'SE',\n", 924 | " 'geographicArea': 'Stockholm County',\n", 925 | " 'city': 'Stockholm',\n", 926 | " 'postalCode': '111 22',\n", 927 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 928 | " 'streetAddressOptOut': False,\n", 929 | " 'headquarter': False,\n", 930 | " 'line1': 'Kungsbron 2'}],\n", 931 | " 'name': 'Google',\n", 932 | " 'fundingData': {'fundingRoundListCrunchbaseUrl': 'https://www.crunchbase.com/organization/google/funding_rounds/funding_rounds_list?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_fundings',\n", 933 | " 'lastFundingRound': {'investorsCrunchbaseUrl': 'https://www.crunchbase.com/funding_round/google-post-ipo-secondary--1e627a6a?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_investors',\n", 934 | " 'leadInvestors': [],\n", 935 | " 'fundingRoundCrunchbaseUrl': 'https://www.crunchbase.com/funding_round/google-post-ipo-secondary--1e627a6a?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=last_funding',\n", 936 | " 'fundingType': 'POST_IPO_SECONDARY',\n", 937 | " 'numOtherInvestors': 2,\n", 938 | " 'announcedOn': {'month': 1,\n", 939 | " 'year': 2010,\n", 940 | " 'day': 1,\n", 941 | " '$type': 'com.linkedin.common.Date'},\n", 942 | " '$type': 'com.linkedin.voyager.organization.FundingRound'},\n", 943 | " 'companyCrunchbaseUrl': 'https://www.crunchbase.com/organization/google?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=profile_cta',\n", 944 | " 'numFundingRounds': 5,\n", 945 | " 'updatedAt': 1580897298,\n", 946 | " '$type': 'com.linkedin.voyager.organization.FundingData'},\n", 947 | " 'description': 'Google’s mission is to organize the world‘s information and make it universally accessible and useful. \\r\\n\\r\\nSince our founding in 1998, Google has grown by leaps and bounds. From offering search in a single language we now offer dozens of products and services—including various forms of advertising and web applications for all kinds of tasks—in scores of languages. And starting from two computer science students in a university dorm room, we now have thousands of employees and offices around the world. A lot has changed since the first Google search engine appeared. But some things haven’t changed: our dedication to our users and our belief in the possibilities of the Internet itself.',\n", 948 | " 'partnerCompanyUrl': None,\n", 949 | " 'rankForTopCompanies': 20,\n", 950 | " 'topCompaniesListName': 'LinkedIn Top Companies',\n", 951 | " 'paidCompany': True,\n", 952 | " 'affiliatedCompanies': ['urn:li:fs_normalized_company:791962',\n", 953 | " 'urn:li:fs_normalized_company:2374003',\n", 954 | " 'urn:li:fs_normalized_company:18950635',\n", 955 | " 'urn:li:fs_normalized_company:16140',\n", 956 | " 'urn:li:fs_normalized_company:10440912'],\n", 957 | " 'foundedOn': {'year': 1998, '$type': 'com.linkedin.common.Date'},\n", 958 | " 'companyType': {'localizedName': 'Public Company',\n", 959 | " 'code': 'PUBLIC_COMPANY',\n", 960 | " '$type': 'com.linkedin.voyager.organization.CompanyType'},\n", 961 | " 'groups': [],\n", 962 | " 'id': '1441'},\n", 963 | " 'WebSimilarCompanyCardWithRelevanceReason': [{'name': 'Unilever',\n", 964 | " 'url': 'https://www.linkedin.com/company/1248',\n", 965 | " 'universalName': 'unilever',\n", 966 | " 'school': None,\n", 967 | " 'staffCountRange': {'start': 10001,\n", 968 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 969 | " 'entityUrn': 'urn:li:fs_normalized_company:1248'},\n", 970 | " {'name': 'IBM',\n", 971 | " 'url': 'https://www.linkedin.com/company/1009',\n", 972 | " 'universalName': 'ibm',\n", 973 | " 'school': None,\n", 974 | " 'staffCountRange': {'start': 10001,\n", 975 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 976 | " 'entityUrn': 'urn:li:fs_normalized_company:1009'},\n", 977 | " {'name': 'Apple',\n", 978 | " 'url': 'https://www.linkedin.com/company/162479',\n", 979 | " 'universalName': 'apple',\n", 980 | " 'school': None,\n", 981 | " 'staffCountRange': {'start': 10001,\n", 982 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 983 | " 'entityUrn': 'urn:li:fs_normalized_company:162479'},\n", 984 | " {'name': 'Facebook',\n", 985 | " 'url': 'https://www.linkedin.com/company/10667',\n", 986 | " 'universalName': 'facebook',\n", 987 | " 'school': None,\n", 988 | " 'staffCountRange': {'start': 10001,\n", 989 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 990 | " 'entityUrn': 'urn:li:fs_normalized_company:10667'},\n", 991 | " {'name': 'Microsoft',\n", 992 | " 'url': 'https://www.linkedin.com/company/1035',\n", 993 | " 'universalName': 'microsoft',\n", 994 | " 'school': None,\n", 995 | " 'staffCountRange': {'start': 10001,\n", 996 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 997 | " 'entityUrn': 'urn:li:fs_normalized_company:1035'},\n", 998 | " {'name': 'Tesla',\n", 999 | " 'url': 'https://www.linkedin.com/company/15564',\n", 1000 | " 'universalName': 'tesla-motors',\n", 1001 | " 'school': None,\n", 1002 | " 'staffCountRange': {'start': 10001,\n", 1003 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1004 | " 'entityUrn': 'urn:li:fs_normalized_company:15564'},\n", 1005 | " {'name': 'Netflix',\n", 1006 | " 'url': 'https://www.linkedin.com/company/165158',\n", 1007 | " 'universalName': 'netflix',\n", 1008 | " 'school': None,\n", 1009 | " 'staffCountRange': {'start': 5001,\n", 1010 | " 'end': 10000,\n", 1011 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1012 | " 'entityUrn': 'urn:li:fs_normalized_company:165158'},\n", 1013 | " {'name': 'Amazon',\n", 1014 | " 'url': 'https://www.linkedin.com/company/1586',\n", 1015 | " 'universalName': 'amazon',\n", 1016 | " 'school': None,\n", 1017 | " 'staffCountRange': {'start': 10001,\n", 1018 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1019 | " 'entityUrn': 'urn:li:fs_normalized_company:1586'},\n", 1020 | " {'name': 'YouTube',\n", 1021 | " 'url': 'https://www.linkedin.com/company/16140',\n", 1022 | " 'universalName': 'youtube',\n", 1023 | " 'school': None,\n", 1024 | " 'staffCountRange': {'start': 1001,\n", 1025 | " 'end': 5000,\n", 1026 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1027 | " 'entityUrn': 'urn:li:fs_normalized_company:16140'},\n", 1028 | " {'name': 'Oracle',\n", 1029 | " 'url': 'https://www.linkedin.com/company/1028',\n", 1030 | " 'universalName': 'oracle',\n", 1031 | " 'school': None,\n", 1032 | " 'staffCountRange': {'start': 10001,\n", 1033 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1034 | " 'entityUrn': 'urn:li:fs_normalized_company:1028'},\n", 1035 | " {'name': 'LinkedIn',\n", 1036 | " 'url': 'https://www.linkedin.com/company/1337',\n", 1037 | " 'universalName': 'linkedin',\n", 1038 | " 'school': None,\n", 1039 | " 'staffCountRange': {'start': 10001,\n", 1040 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1041 | " 'entityUrn': 'urn:li:fs_normalized_company:1337'},\n", 1042 | " {'name': 'The Coca-Cola Company',\n", 1043 | " 'url': 'https://www.linkedin.com/company/1694',\n", 1044 | " 'universalName': 'the-coca-cola-company',\n", 1045 | " 'school': None,\n", 1046 | " 'staffCountRange': {'start': 10001,\n", 1047 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1048 | " 'entityUrn': 'urn:li:fs_normalized_company:1694'}],\n", 1049 | " 'WebCompanyStockQuote': {'stockQuotes': ['urn:li:fs_organizationStockQuote:(1441,GOOGL)']},\n", 1050 | " 'employees': [{'MiniProfile': [{'firstName': 'Jean-Louis',\n", 1051 | " 'lastName': 'Quéguiner',\n", 1052 | " 'occupation': 'Product Unit Lead : Data & AI | Director Database, Big Data & AI chez OVHcloud',\n", 1053 | " 'objectUrn': 'urn:li:member:106509133',\n", 1054 | " 'publicIdentifier': 'jlqueguiner'},\n", 1055 | " {'firstName': 'Olivier',\n", 1056 | " 'lastName': 'Girard',\n", 1057 | " 'occupation': 'Chief Data Officer chez Auchan Retail International',\n", 1058 | " 'objectUrn': 'urn:li:member:447048',\n", 1059 | " 'publicIdentifier': 'olivier-girard-860196'},\n", 1060 | " {'firstName': 'Maximilien',\n", 1061 | " 'lastName': 'ABIBOU',\n", 1062 | " 'occupation': 'Directeur Commercial Paris-IDF/Hauts de France chez Semarchy',\n", 1063 | " 'objectUrn': 'urn:li:member:144531',\n", 1064 | " 'publicIdentifier': 'maximilien-abibou-7836b'},\n", 1065 | " {'firstName': 'Didier',\n", 1066 | " 'lastName': 'Girard',\n", 1067 | " 'occupation': 'VP Engineering at SFEIR',\n", 1068 | " 'objectUrn': 'urn:li:member:158449',\n", 1069 | " 'publicIdentifier': 'didiergirard'},\n", 1070 | " {'firstName': 'Olivier',\n", 1071 | " 'lastName': 'Novasque',\n", 1072 | " 'occupation': 'Sidetrade Founder & CEO Accelerate Revenues & Cash Flow Generation',\n", 1073 | " 'objectUrn': 'urn:li:member:712068',\n", 1074 | " 'publicIdentifier': 'oliviernovasque'},\n", 1075 | " {'firstName': 'Loick',\n", 1076 | " 'lastName': 'Roche',\n", 1077 | " 'occupation': '92 000 abonnés ; Directeur général de GEM ; Auteur, Conférencier, Créateur de la #ThéorieduLotissement, #PaixEconomique',\n", 1078 | " 'objectUrn': 'urn:li:member:2116385',\n", 1079 | " 'publicIdentifier': 'loickroche'},\n", 1080 | " {'firstName': 'Denis',\n", 1081 | " 'lastName': 'Arnaud',\n", 1082 | " 'occupation': 'Head of Engineering in the Data Strategy and Analytics department at DB Schenker',\n", 1083 | " 'objectUrn': 'urn:li:member:303870',\n", 1084 | " 'publicIdentifier': 'denisarnaud'},\n", 1085 | " {'firstName': 'Soufiane',\n", 1086 | " 'lastName': 'Aazizi',\n", 1087 | " 'occupation': 'Senior Data Scientist at Orange Bank',\n", 1088 | " 'objectUrn': 'urn:li:member:27542364',\n", 1089 | " 'publicIdentifier': 'soufiane-aazizi-a502829'},\n", 1090 | " {'firstName': 'ALEXANDRA',\n", 1091 | " 'lastName': 'SYROVATSKI',\n", 1092 | " 'occupation': 'Senior Sales Director chez Google Cloud',\n", 1093 | " 'objectUrn': 'urn:li:member:88668538',\n", 1094 | " 'publicIdentifier': 'alexandrasyrovatski'},\n", 1095 | " {'firstName': 'Anne-Véronique',\n", 1096 | " 'lastName': 'Baylac',\n", 1097 | " 'occupation': 'Industry Director Luxury, Auto & Mobility at Google',\n", 1098 | " 'objectUrn': 'urn:li:member:13099665',\n", 1099 | " 'publicIdentifier': 'anneveroniquebaylac'},\n", 1100 | " {'firstName': 'François',\n", 1101 | " 'lastName': 'Chollet',\n", 1102 | " 'occupation': 'Artificial Intelligence Researcher',\n", 1103 | " 'objectUrn': 'urn:li:member:54736257',\n", 1104 | " 'publicIdentifier': 'fchollet'},\n", 1105 | " {'firstName': 'Jean Pierre',\n", 1106 | " 'lastName': 'MALLE',\n", 1107 | " 'occupation': 'Cognitive automation, Differenciative AI',\n", 1108 | " 'objectUrn': 'urn:li:member:24769179',\n", 1109 | " 'publicIdentifier': 'jpmalle'},\n", 1110 | " {'firstName': 'Jean-Marc',\n", 1111 | " 'lastName': 'Vogel',\n", 1112 | " 'occupation': 'Partner Sales Manager chez Openvalue',\n", 1113 | " 'objectUrn': 'urn:li:member:535939',\n", 1114 | " 'publicIdentifier': 'jmvogelandadalec'},\n", 1115 | " {'firstName': 'Samy',\n", 1116 | " 'lastName': 'Habib',\n", 1117 | " 'occupation': 'Global Data Solutions Lead chez Google',\n", 1118 | " 'objectUrn': 'urn:li:member:75421693',\n", 1119 | " 'publicIdentifier': 'samy-habib-99131221'},\n", 1120 | " {'firstName': 'Camille',\n", 1121 | " 'lastName': 'Meulien',\n", 1122 | " 'occupation': 'Senior DevOps Architect',\n", 1123 | " 'objectUrn': 'urn:li:member:38015589',\n", 1124 | " 'publicIdentifier': 'camillemeulien'},\n", 1125 | " {'firstName': 'Thomas',\n", 1126 | " 'lastName': 'Tellier',\n", 1127 | " 'occupation': 'Software Engineer',\n", 1128 | " 'objectUrn': 'urn:li:member:252120150',\n", 1129 | " 'publicIdentifier': 'thomas-tellier'},\n", 1130 | " {'firstName': 'Emmanuel',\n", 1131 | " 'lastName': 'DUBOIS',\n", 1132 | " 'occupation': 'Co-founder | Managing partner',\n", 1133 | " 'objectUrn': 'urn:li:member:427570',\n", 1134 | " 'publicIdentifier': 'emmadubois'},\n", 1135 | " {'firstName': 'PingKi',\n", 1136 | " 'lastName': 'HOUANG',\n", 1137 | " 'occupation': 'Chief Executive Omnichannel at Fashion3 (aka Fashion Cube)',\n", 1138 | " 'objectUrn': 'urn:li:member:315379',\n", 1139 | " 'publicIdentifier': 'houangpingki'},\n", 1140 | " {'firstName': 'Eric',\n", 1141 | " 'lastName': 'Fontaine',\n", 1142 | " 'occupation': 'EMEA Strategic partner lead at Google',\n", 1143 | " 'objectUrn': 'urn:li:member:2824788',\n", 1144 | " 'publicIdentifier': 'ericfontainegoogle'},\n", 1145 | " {'firstName': 'Alice Yueheng',\n", 1146 | " 'lastName': 'Wang',\n", 1147 | " 'occupation': 'Software Engineer at Google',\n", 1148 | " 'objectUrn': 'urn:li:member:64287119',\n", 1149 | " 'publicIdentifier': 'aliciaywang'},\n", 1150 | " {'firstName': 'Alain',\n", 1151 | " 'lastName': 'Fiocco',\n", 1152 | " 'occupation': 'EVP, Chief Technology Officer. Head of Products',\n", 1153 | " 'objectUrn': 'urn:li:member:91291',\n", 1154 | " 'publicIdentifier': 'alainfiocco'},\n", 1155 | " {'firstName': 'Alexis',\n", 1156 | " 'lastName': 'Roos',\n", 1157 | " 'occupation': 'Sr Manager, Data Science and Machine Learning at Twitter',\n", 1158 | " 'objectUrn': 'urn:li:member:1108016',\n", 1159 | " 'publicIdentifier': 'alexisroos'},\n", 1160 | " {'firstName': 'Christophe',\n", 1161 | " 'lastName': 'PARENT',\n", 1162 | " 'occupation': 'Customer Engineer, data management - Google Cloud Platform chez Google',\n", 1163 | " 'objectUrn': 'urn:li:member:388714411',\n", 1164 | " 'publicIdentifier': 'christophe-parent-lille'},\n", 1165 | " {'firstName': 'Charlotte',\n", 1166 | " 'lastName': 'Weill',\n", 1167 | " 'occupation': 'CEO & Partner',\n", 1168 | " 'objectUrn': 'urn:li:member:395972',\n", 1169 | " 'publicIdentifier': 'charlotteweill'},\n", 1170 | " {'firstName': 'Eléna',\n", 1171 | " 'lastName': 'GIHAN',\n", 1172 | " 'occupation': 'Advisor at Jems Group',\n", 1173 | " 'objectUrn': 'urn:li:member:1184303',\n", 1174 | " 'publicIdentifier': 'eléna-gihan-43b491'},\n", 1175 | " {'firstName': 'Olivier',\n", 1176 | " 'lastName': 'Cahagne',\n", 1177 | " 'occupation': 'Solutions Architect - Telco',\n", 1178 | " 'objectUrn': 'urn:li:member:4528599',\n", 1179 | " 'publicIdentifier': 'ocahagne'},\n", 1180 | " {'firstName': 'Ori',\n", 1181 | " 'lastName': 'Pekelman',\n", 1182 | " 'occupation': 'Co-Founder & CPO at Platform.sh',\n", 1183 | " 'objectUrn': 'urn:li:member:396107',\n", 1184 | " 'publicIdentifier': 'pekelman'},\n", 1185 | " {'firstName': 'Laurent',\n", 1186 | " 'lastName': 'LETOURMY',\n", 1187 | " 'occupation': 'Ysance CEO',\n", 1188 | " 'objectUrn': 'urn:li:member:484300',\n", 1189 | " 'publicIdentifier': 'letourmy'},\n", 1190 | " {'firstName': 'Jean-Luc',\n", 1191 | " 'lastName': 'Laurent',\n", 1192 | " 'occupation': 'Customer Engineer chez Google',\n", 1193 | " 'objectUrn': 'urn:li:member:4468183',\n", 1194 | " 'publicIdentifier': 'jeanluclaurent1'},\n", 1195 | " {'firstName': 'Pascal',\n", 1196 | " 'lastName': 'Pignon',\n", 1197 | " 'occupation': 'gSuite Business Lead chez Google Cloud',\n", 1198 | " 'objectUrn': 'urn:li:member:350694',\n", 1199 | " 'publicIdentifier': 'pascalpignon'},\n", 1200 | " {'firstName': 'Eric',\n", 1201 | " 'lastName': 'Djatsa Yota',\n", 1202 | " 'occupation': 'Big Data Solutions Architect ( Professional Services ) at Cloudera',\n", 1203 | " 'objectUrn': 'urn:li:member:74451247',\n", 1204 | " 'publicIdentifier': 'ericdjatsa'},\n", 1205 | " {'firstName': 'Antoine',\n", 1206 | " 'lastName': 'Guy',\n", 1207 | " 'occupation': 'Cloud Customer Engineer at Google',\n", 1208 | " 'objectUrn': 'urn:li:member:110868',\n", 1209 | " 'publicIdentifier': 'antoineguy'},\n", 1210 | " {'firstName': 'Nicolas',\n", 1211 | " 'lastName': 'Colardelle ',\n", 1212 | " 'occupation': 'Business Dev Mgr - Senior Sales Director Retail Cloud - Digital transformation specialist',\n", 1213 | " 'objectUrn': 'urn:li:member:91742',\n", 1214 | " 'publicIdentifier': 'nicolas-colardelle-11245'},\n", 1215 | " {'firstName': 'Claude',\n", 1216 | " 'lastName': 'Seyrat',\n", 1217 | " 'occupation': 'HiTech Entrepreneur - Strategic, Product and Digital Marketing Expertise - PhD in Artificial Intelligence',\n", 1218 | " 'objectUrn': 'urn:li:member:576225',\n", 1219 | " 'publicIdentifier': 'claudeseyrat'},\n", 1220 | " {'firstName': 'Michaël',\n", 1221 | " 'lastName': 'Obadia',\n", 1222 | " 'occupation': 'Founder - Upward',\n", 1223 | " 'objectUrn': 'urn:li:member:5430763',\n", 1224 | " 'publicIdentifier': 'michaël-obadia-97799a1'},\n", 1225 | " {'firstName': 'Jean-Claude',\n", 1226 | " 'lastName': 'Rosichini',\n", 1227 | " 'occupation': 'President Aventia, Executive & Entrepreneur # Digital HiTech Alumnus (Intel, Motorola, Nortel, Airbus, VTI)',\n", 1228 | " 'objectUrn': 'urn:li:member:151875',\n", 1229 | " 'publicIdentifier': 'rosichini'}]}],\n", 1230 | " 'jobs': [{'WebSearchJobJserpJobPostingLite': [{'title': 'Global Data Privacy Lead, GCAS',\n", 1231 | " 'formattedLocation': 'Paris, FR',\n", 1232 | " 'listedAt': 1584512480000},\n", 1233 | " {'title': 'Product Lead',\n", 1234 | " 'formattedLocation': 'Bangalore, IN',\n", 1235 | " 'listedAt': 1572985638000},\n", 1236 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1237 | " 'formattedLocation': 'Austin, TX, US',\n", 1238 | " 'listedAt': 1584165745000},\n", 1239 | " {'title': 'Director, Product Management, Local Search',\n", 1240 | " 'formattedLocation': 'Mountain View, CA, US',\n", 1241 | " 'listedAt': 1585766732000},\n", 1242 | " {'title': 'Enterprise Architect, Google Cloud, Telco/Media/Entertainment',\n", 1243 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1244 | " 'listedAt': 1585765947000},\n", 1245 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1246 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1247 | " 'listedAt': 1580796205000},\n", 1248 | " {'title': 'Advanced Data Partnerships Lead, Go-to-Market',\n", 1249 | " 'formattedLocation': 'Singapore, SG',\n", 1250 | " 'listedAt': 1579672926000}]},\n", 1251 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Global Data Privacy Lead, GCAS',\n", 1252 | " 'formattedLocation': 'Paris, FR',\n", 1253 | " 'listedAt': 1584512480000},\n", 1254 | " {'title': 'Product Lead',\n", 1255 | " 'formattedLocation': 'Bangalore, IN',\n", 1256 | " 'listedAt': 1572985638000},\n", 1257 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1258 | " 'formattedLocation': 'Austin, TX, US',\n", 1259 | " 'listedAt': 1584165745000},\n", 1260 | " {'title': 'Enterprise Architect, Google Cloud, Telco/Media/Entertainment',\n", 1261 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1262 | " 'listedAt': 1585765947000},\n", 1263 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1264 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1265 | " 'listedAt': 1580796205000},\n", 1266 | " {'title': 'Data and Tech Lead, Global Client Agency Solutions',\n", 1267 | " 'formattedLocation': 'New York City, NY, US',\n", 1268 | " 'listedAt': 1585721171000},\n", 1269 | " {'title': 'Advanced Data Partnerships Lead, Go-to-Market',\n", 1270 | " 'formattedLocation': 'Singapore, SG',\n", 1271 | " 'listedAt': 1579672926000}]},\n", 1272 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Global Data Privacy Lead, GCAS',\n", 1273 | " 'formattedLocation': 'Paris, FR',\n", 1274 | " 'listedAt': 1584512480000},\n", 1275 | " {'title': 'Product Lead',\n", 1276 | " 'formattedLocation': 'Bangalore, IN',\n", 1277 | " 'listedAt': 1572985638000},\n", 1278 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1279 | " 'formattedLocation': 'Austin, TX, US',\n", 1280 | " 'listedAt': 1584165745000},\n", 1281 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1282 | " 'formattedLocation': 'New York City, NY, US',\n", 1283 | " 'listedAt': 1584165745000},\n", 1284 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1285 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1286 | " 'listedAt': 1580796205000},\n", 1287 | " {'title': 'Data and Tech Lead, Global Client Agency Solutions',\n", 1288 | " 'formattedLocation': 'New York City, NY, US',\n", 1289 | " 'listedAt': 1585721171000},\n", 1290 | " {'title': 'Advanced Data Partnerships Lead, Go-to-Market',\n", 1291 | " 'formattedLocation': 'Singapore, SG',\n", 1292 | " 'listedAt': 1579672926000}]},\n", 1293 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Global Data Privacy Lead, GCAS',\n", 1294 | " 'formattedLocation': 'Paris, FR',\n", 1295 | " 'listedAt': 1584512480000},\n", 1296 | " {'title': 'Technology Practice Lead, Data Analytics, Cloud Customers',\n", 1297 | " 'formattedLocation': 'Singapore, SG',\n", 1298 | " 'listedAt': 1579763453000},\n", 1299 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1300 | " 'formattedLocation': 'Austin, TX, US',\n", 1301 | " 'listedAt': 1584165745000},\n", 1302 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1303 | " 'formattedLocation': 'New York City, NY, US',\n", 1304 | " 'listedAt': 1584165745000},\n", 1305 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1306 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1307 | " 'listedAt': 1580796205000},\n", 1308 | " {'title': 'Data and Tech Lead, Global Client Agency Solutions',\n", 1309 | " 'formattedLocation': 'New York City, NY, US',\n", 1310 | " 'listedAt': 1585721171000},\n", 1311 | " {'title': 'Advanced Data Partnerships Lead, Go-to-Market',\n", 1312 | " 'formattedLocation': 'Singapore, SG',\n", 1313 | " 'listedAt': 1579672926000}]},\n", 1314 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Technology Practice Lead, Data Analytics, Cloud Customers',\n", 1315 | " 'formattedLocation': 'Singapore, SG',\n", 1316 | " 'listedAt': 1579763453000},\n", 1317 | " {'title': 'Director, Outbound Product Management, Database, Google Cloud',\n", 1318 | " 'formattedLocation': 'San Francisco, CA, US',\n", 1319 | " 'listedAt': 1585766807000},\n", 1320 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1321 | " 'formattedLocation': 'Austin, TX, US',\n", 1322 | " 'listedAt': 1584165745000},\n", 1323 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1324 | " 'formattedLocation': 'New York City, NY, US',\n", 1325 | " 'listedAt': 1584165745000},\n", 1326 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1327 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1328 | " 'listedAt': 1580796205000},\n", 1329 | " {'title': 'Data and Tech Lead, Global Client Agency Solutions',\n", 1330 | " 'formattedLocation': 'New York City, NY, US',\n", 1331 | " 'listedAt': 1585721171000},\n", 1332 | " {'title': 'Advanced Data Partnerships Lead, Go-to-Market',\n", 1333 | " 'formattedLocation': 'Singapore, SG',\n", 1334 | " 'listedAt': 1579672926000}]},\n", 1335 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Enterprise Cloud Architect, Google Cloud (English, French)',\n", 1336 | " 'formattedLocation': 'Paris, FR',\n", 1337 | " 'listedAt': 1585765949000},\n", 1338 | " {'title': 'Technology Practice Lead, Data Analytics, Cloud Customers',\n", 1339 | " 'formattedLocation': 'Singapore, SG',\n", 1340 | " 'listedAt': 1579763453000},\n", 1341 | " {'title': 'Director, Outbound Product Management, Database, Google Cloud',\n", 1342 | " 'formattedLocation': 'San Francisco, CA, US',\n", 1343 | " 'listedAt': 1585766807000},\n", 1344 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1345 | " 'formattedLocation': 'Austin, TX, US',\n", 1346 | " 'listedAt': 1584165745000},\n", 1347 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1348 | " 'formattedLocation': 'New York City, NY, US',\n", 1349 | " 'listedAt': 1584165745000},\n", 1350 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1351 | " 'formattedLocation': 'Sunnyvale, CA, US',\n", 1352 | " 'listedAt': 1580796205000},\n", 1353 | " {'title': 'Data and Tech Lead, Global Client Agency Solutions',\n", 1354 | " 'formattedLocation': 'New York City, NY, US',\n", 1355 | " 'listedAt': 1585721171000}]},\n", 1356 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Enterprise Cloud Architect, Google Cloud (English, French)',\n", 1357 | " 'formattedLocation': 'Paris, FR',\n", 1358 | " 'listedAt': 1585765949000},\n", 1359 | " {'title': 'Technology Practice Lead, Data Analytics, Cloud Customers',\n", 1360 | " 'formattedLocation': 'Singapore, SG',\n", 1361 | " 'listedAt': 1579763453000},\n", 1362 | " {'title': 'Director, Outbound Product Management, Database, Google Cloud',\n", 1363 | " 'formattedLocation': 'San Francisco, CA, US',\n", 1364 | " 'listedAt': 1585766807000},\n", 1365 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1366 | " 'formattedLocation': 'Austin, TX, US',\n", 1367 | " 'listedAt': 1584165745000},\n", 1368 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1369 | " 'formattedLocation': 'New York City, NY, US',\n", 1370 | " 'listedAt': 1584165745000},\n", 1371 | " {'title': 'Data and Tech Lead, Global Client Agency Solutions',\n", 1372 | " 'formattedLocation': 'New York City, NY, US',\n", 1373 | " 'listedAt': 1585721171000},\n", 1374 | " {'title': 'Director, Product Management, Google Assistant Developer Platform',\n", 1375 | " 'formattedLocation': 'Mountain View, CA, US',\n", 1376 | " 'listedAt': 1584688328000}]},\n", 1377 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Enterprise Cloud Architect, Google Cloud (English, French)',\n", 1378 | " 'formattedLocation': 'Paris, FR',\n", 1379 | " 'listedAt': 1585765949000},\n", 1380 | " {'title': 'Technology Practice Lead, Data Analytics, Cloud Customers',\n", 1381 | " 'formattedLocation': 'Singapore, SG',\n", 1382 | " 'listedAt': 1579763453000},\n", 1383 | " {'title': 'Enterprise Cloud Architect, Google Cloud',\n", 1384 | " 'formattedLocation': 'Helsinki, FI',\n", 1385 | " 'listedAt': 1585765942000},\n", 1386 | " {'title': 'Director, Outbound Product Management, Database, Google Cloud',\n", 1387 | " 'formattedLocation': 'San Francisco, CA, US',\n", 1388 | " 'listedAt': 1585766807000},\n", 1389 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1390 | " 'formattedLocation': 'New York City, NY, US',\n", 1391 | " 'listedAt': 1584165745000},\n", 1392 | " {'title': 'Data and Tech Lead, Global Client Agency Solutions',\n", 1393 | " 'formattedLocation': 'New York City, NY, US',\n", 1394 | " 'listedAt': 1585721171000},\n", 1395 | " {'title': 'Director, Product Management, Google Assistant Developer Platform',\n", 1396 | " 'formattedLocation': 'Mountain View, CA, US',\n", 1397 | " 'listedAt': 1584688328000}]},\n", 1398 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Enterprise Cloud Architect, Google Cloud (English, French)',\n", 1399 | " 'formattedLocation': 'Paris, FR',\n", 1400 | " 'listedAt': 1585765949000},\n", 1401 | " {'title': 'Technology Practice Lead, Data Analytics, Cloud Customers',\n", 1402 | " 'formattedLocation': 'Singapore, SG',\n", 1403 | " 'listedAt': 1579763453000},\n", 1404 | " {'title': 'Enterprise Cloud Architect, Google Cloud',\n", 1405 | " 'formattedLocation': 'Helsinki, FI',\n", 1406 | " 'listedAt': 1585765942000},\n", 1407 | " {'title': 'Director, Outbound Product Management, Database, Google Cloud',\n", 1408 | " 'formattedLocation': 'San Francisco, CA, US',\n", 1409 | " 'listedAt': 1585766807000},\n", 1410 | " {'title': 'Director, Corporate Engineering, Talent, Google Cloud',\n", 1411 | " 'formattedLocation': 'New York City, NY, US',\n", 1412 | " 'listedAt': 1584165745000},\n", 1413 | " {'title': 'Product Analytics Lead, Data Science',\n", 1414 | " 'formattedLocation': 'New York City, NY, US',\n", 1415 | " 'listedAt': 1572985531000},\n", 1416 | " {'title': 'Director, Product Management, Google Assistant Developer Platform',\n", 1417 | " 'formattedLocation': 'Mountain View, CA, US',\n", 1418 | " 'listedAt': 1584688328000}]}]},\n", 1419 | " {'FollowingInfo': {'followerCount': 16405073},\n", 1420 | " 'WebFullCompanyMain': {'staffCount': 197917,\n", 1421 | " 'companyEmployeesSearchPageUrl': 'https://www.linkedin.com/vsearch/p?f_CC=162479',\n", 1422 | " 'acquirerCompany': None,\n", 1423 | " 'phone': None,\n", 1424 | " 'entityUrn': 'urn:li:fs_normalized_company:162479',\n", 1425 | " 'headquarter': {'country': 'US',\n", 1426 | " 'geographicArea': 'California',\n", 1427 | " 'city': 'Cupertino',\n", 1428 | " 'postalCode': '95014',\n", 1429 | " 'line1': '1 Apple Park Way',\n", 1430 | " '$type': 'com.linkedin.common.Address'},\n", 1431 | " 'universalName': 'apple',\n", 1432 | " 'companyPageUrl': 'http://www.apple.com/',\n", 1433 | " 'url': 'https://www.linkedin.com/company/162479',\n", 1434 | " 'jobSearchPageUrl': 'https://www.linkedin.com/jobs/search?locationId=OTHERS%2Eworldwide&f_C=162479',\n", 1435 | " 'staffingCompany': False,\n", 1436 | " 'staffCountRange': {'start': 10001,\n", 1437 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1438 | " 'school': None,\n", 1439 | " 'specialities': ['Innovative Product Development',\n", 1440 | " 'World-Class Operations',\n", 1441 | " 'Retail',\n", 1442 | " 'Telephone Support'],\n", 1443 | " 'confirmedLocations': [{'country': 'US',\n", 1444 | " 'geographicArea': 'California',\n", 1445 | " 'city': 'Cupertino',\n", 1446 | " 'postalCode': '95014',\n", 1447 | " 'description': 'Corporate Headquarters',\n", 1448 | " '$type': 'com.linkedin.voyager.organization.OrganizationAddress',\n", 1449 | " 'streetAddressOptOut': False,\n", 1450 | " 'headquarter': True,\n", 1451 | " 'line1': '1 Apple Park Way'}],\n", 1452 | " 'name': 'Apple',\n", 1453 | " 'fundingData': {'fundingRoundListCrunchbaseUrl': 'https://www.crunchbase.com/organization/apple/funding_rounds/funding_rounds_list?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_fundings',\n", 1454 | " 'lastFundingRound': {'investorsCrunchbaseUrl': 'https://www.crunchbase.com/funding_round/apple-post-ipo-debt--b81d3aa0?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=all_investors',\n", 1455 | " 'leadInvestors': [],\n", 1456 | " 'fundingRoundCrunchbaseUrl': 'https://www.crunchbase.com/funding_round/apple-post-ipo-debt--b81d3aa0?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=last_funding',\n", 1457 | " 'fundingType': 'POST_IPO_DEBT',\n", 1458 | " 'moneyRaised': {'currencyCode': 'USD',\n", 1459 | " 'amount': '5000000000',\n", 1460 | " '$type': 'com.linkedin.common.MoneyAmount'},\n", 1461 | " 'numOtherInvestors': 0,\n", 1462 | " 'announcedOn': {'month': 9,\n", 1463 | " 'year': 2017,\n", 1464 | " 'day': 6,\n", 1465 | " '$type': 'com.linkedin.common.Date'},\n", 1466 | " '$type': 'com.linkedin.voyager.organization.FundingRound'},\n", 1467 | " 'companyCrunchbaseUrl': 'https://www.crunchbase.com/organization/apple?utm_source=linkedin&utm_medium=referral&utm_campaign=linkedin_companies&utm_content=profile_cta',\n", 1468 | " 'numFundingRounds': 4,\n", 1469 | " 'updatedAt': 1560204322,\n", 1470 | " '$type': 'com.linkedin.voyager.organization.FundingData'},\n", 1471 | " 'description': 'We’re a diverse collective of thinkers and doers, continually reimagining what’s possible to help us all do what we love in new ways. The people who work here have reinvented entire industries with the Mac, iPhone, iPad, and Apple Watch, as well as with services, including Apple TV, the App Store, Apple Music, and Apple Pay. And the same innovation that goes into our products also applies to our practices — strengthening our commitment to leave the world better than we found it.\\n \\nEvery new product we invent, service we create, or store we open is the result of people working together to make each other’s ideas stronger. That happens here because every one of us strives toward a common goal — creating the best customer experiences. So bring your passion, courage, and original thinking and get ready to share it. This is where your work can make a difference in people’s lives. Including your own.\\n\\nDiscover even more benefits of doing what you love. \\n\\nApple’s most important resource, our soul, is our people. Apple benefits help further the well-being of our employees and their families in meaningful ways. No matter where you work at Apple, you can take advantage of our health and wellness resources and time-away programs. We’re proud to provide stock grants to employees at all levels of the company, and we also give employees the option to buy Apple stock at a discount – both offer everyone at Apple the chance to share in the company’s success. You’ll discover many more benefits of working at Apple, such as programs that match your charitable contributions, reimburse you for continuing your education, and give you special employee pricing on Apple products.\\n\\nNote: Apple benefits programs vary by country and are subject to eligibility requirements.\\n\\nApple is an equal opportunity employer that is committed to inclusion and diversity. Visit jobs.apple.com to learn more.',\n", 1472 | " 'partnerCompanyUrl': None,\n", 1473 | " 'rankForTopCompanies': None,\n", 1474 | " 'topCompaniesListName': None,\n", 1475 | " 'paidCompany': True,\n", 1476 | " 'affiliatedCompanies': [],\n", 1477 | " 'foundedOn': {'year': 1976, '$type': 'com.linkedin.common.Date'},\n", 1478 | " 'companyType': {'localizedName': 'Public Company',\n", 1479 | " 'code': 'PUBLIC_COMPANY',\n", 1480 | " '$type': 'com.linkedin.voyager.organization.CompanyType'},\n", 1481 | " 'groups': [],\n", 1482 | " 'id': '162479'},\n", 1483 | " 'WebSimilarCompanyCardWithRelevanceReason': [{'name': 'IBM',\n", 1484 | " 'url': 'https://www.linkedin.com/company/1009',\n", 1485 | " 'universalName': 'ibm',\n", 1486 | " 'school': None,\n", 1487 | " 'staffCountRange': {'start': 10001,\n", 1488 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1489 | " 'entityUrn': 'urn:li:fs_normalized_company:1009'},\n", 1490 | " {'name': 'Johnson & Johnson',\n", 1491 | " 'url': 'https://www.linkedin.com/company/1207',\n", 1492 | " 'universalName': 'johnson-&-johnson',\n", 1493 | " 'school': None,\n", 1494 | " 'staffCountRange': {'start': 10001,\n", 1495 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1496 | " 'entityUrn': 'urn:li:fs_normalized_company:1207'},\n", 1497 | " {'name': 'Google',\n", 1498 | " 'url': 'https://www.linkedin.com/company/1441',\n", 1499 | " 'universalName': 'google',\n", 1500 | " 'school': None,\n", 1501 | " 'staffCountRange': {'start': 10001,\n", 1502 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1503 | " 'entityUrn': 'urn:li:fs_normalized_company:1441'},\n", 1504 | " {'name': 'Facebook',\n", 1505 | " 'url': 'https://www.linkedin.com/company/10667',\n", 1506 | " 'universalName': 'facebook',\n", 1507 | " 'school': None,\n", 1508 | " 'staffCountRange': {'start': 10001,\n", 1509 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1510 | " 'entityUrn': 'urn:li:fs_normalized_company:10667'},\n", 1511 | " {'name': 'Microsoft',\n", 1512 | " 'url': 'https://www.linkedin.com/company/1035',\n", 1513 | " 'universalName': 'microsoft',\n", 1514 | " 'school': None,\n", 1515 | " 'staffCountRange': {'start': 10001,\n", 1516 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1517 | " 'entityUrn': 'urn:li:fs_normalized_company:1035'},\n", 1518 | " {'name': 'Samsung Electronics',\n", 1519 | " 'url': 'https://www.linkedin.com/company/1753',\n", 1520 | " 'universalName': 'samsung-electronics',\n", 1521 | " 'school': None,\n", 1522 | " 'staffCountRange': {'start': 10001,\n", 1523 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1524 | " 'entityUrn': 'urn:li:fs_normalized_company:1753'},\n", 1525 | " {'name': 'Tesla',\n", 1526 | " 'url': 'https://www.linkedin.com/company/15564',\n", 1527 | " 'universalName': 'tesla-motors',\n", 1528 | " 'school': None,\n", 1529 | " 'staffCountRange': {'start': 10001,\n", 1530 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1531 | " 'entityUrn': 'urn:li:fs_normalized_company:15564'},\n", 1532 | " {'name': 'Netflix',\n", 1533 | " 'url': 'https://www.linkedin.com/company/165158',\n", 1534 | " 'universalName': 'netflix',\n", 1535 | " 'school': None,\n", 1536 | " 'staffCountRange': {'start': 5001,\n", 1537 | " 'end': 10000,\n", 1538 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1539 | " 'entityUrn': 'urn:li:fs_normalized_company:165158'},\n", 1540 | " {'name': 'Amazon',\n", 1541 | " 'url': 'https://www.linkedin.com/company/1586',\n", 1542 | " 'universalName': 'amazon',\n", 1543 | " 'school': None,\n", 1544 | " 'staffCountRange': {'start': 10001,\n", 1545 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1546 | " 'entityUrn': 'urn:li:fs_normalized_company:1586'},\n", 1547 | " {'name': 'Nike',\n", 1548 | " 'url': 'https://www.linkedin.com/company/2029',\n", 1549 | " 'universalName': 'nike',\n", 1550 | " 'school': None,\n", 1551 | " 'staffCountRange': {'start': 10001,\n", 1552 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1553 | " 'entityUrn': 'urn:li:fs_normalized_company:2029'},\n", 1554 | " {'name': 'The Walt Disney Company',\n", 1555 | " 'url': 'https://www.linkedin.com/company/1292',\n", 1556 | " 'universalName': 'the-walt-disney-company',\n", 1557 | " 'school': None,\n", 1558 | " 'staffCountRange': {'start': 10001,\n", 1559 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1560 | " 'entityUrn': 'urn:li:fs_normalized_company:1292'},\n", 1561 | " {'name': 'The Coca-Cola Company',\n", 1562 | " 'url': 'https://www.linkedin.com/company/1694',\n", 1563 | " 'universalName': 'the-coca-cola-company',\n", 1564 | " 'school': None,\n", 1565 | " 'staffCountRange': {'start': 10001,\n", 1566 | " '$type': 'com.linkedin.voyager.organization.shared.StaffCountRange'},\n", 1567 | " 'entityUrn': 'urn:li:fs_normalized_company:1694'}],\n", 1568 | " 'WebCompanyStockQuote': {'stockQuotes': ['urn:li:fs_organizationStockQuote:(162479,AAPL)']},\n", 1569 | " 'employees': [{'MiniProfile': [{'firstName': 'Jean-Louis',\n", 1570 | " 'lastName': 'Quéguiner',\n", 1571 | " 'occupation': 'Product Unit Lead : Data & AI | Director Database, Big Data & AI chez OVHcloud',\n", 1572 | " 'objectUrn': 'urn:li:member:106509133',\n", 1573 | " 'publicIdentifier': 'jlqueguiner'},\n", 1574 | " {'firstName': 'Laurent',\n", 1575 | " 'lastName': 'ALLOUCHE',\n", 1576 | " 'occupation': 'Covid19 mean changing ! Yesterday is history, Tomorrow is a mystery, Today is a gift🎁- think out of the box 📣📣',\n", 1577 | " 'objectUrn': 'urn:li:member:6090703',\n", 1578 | " 'publicIdentifier': 'laurent-allouche-8670582'},\n", 1579 | " {'firstName': 'Maxime',\n", 1580 | " 'lastName': 'L.',\n", 1581 | " 'occupation': 'Software Engineer at Apple',\n", 1582 | " 'objectUrn': 'urn:li:member:239268014',\n", 1583 | " 'publicIdentifier': 'maximelc'},\n", 1584 | " {'firstName': 'Sebastien',\n", 1585 | " 'lastName': 'Metrot',\n", 1586 | " 'occupation': 'Software Engineer at Apple',\n", 1587 | " 'objectUrn': 'urn:li:member:2638498',\n", 1588 | " 'publicIdentifier': 'sebastienmetrot'},\n", 1589 | " {'firstName': 'Thomas',\n", 1590 | " 'lastName': 'Bate',\n", 1591 | " 'occupation': 'Omniscope: Scalable Streamed Data Blending, Transformation, custom R/Python Analytics & (open-source) Visual Dashboards',\n", 1592 | " 'objectUrn': 'urn:li:member:2745127',\n", 1593 | " 'publicIdentifier': 'omniscope'},\n", 1594 | " {'firstName': 'Michael',\n", 1595 | " 'lastName': 'Dupont',\n", 1596 | " 'occupation': 'Director Of Digital Services at THALES LAS FRANCE SAS',\n", 1597 | " 'objectUrn': 'urn:li:member:277602',\n", 1598 | " 'publicIdentifier': 'michaeldupont'},\n", 1599 | " {'firstName': 'Jonathan',\n", 1600 | " 'lastName': 'Ah Sue',\n", 1601 | " 'occupation': 'Machine Learning Research Engineer chez Apple',\n", 1602 | " 'objectUrn': 'urn:li:member:401250238',\n", 1603 | " 'publicIdentifier': 'jonathan-ah-sue-bba464b2'},\n", 1604 | " {'firstName': 'Ernesto',\n", 1605 | " 'lastName': 'Gil',\n", 1606 | " 'occupation': 'Business Intelligence - Residential Sales & Marketing at Bell',\n", 1607 | " 'objectUrn': 'urn:li:member:2048010',\n", 1608 | " 'publicIdentifier': 'ernestogil'},\n", 1609 | " {'firstName': 'Philippe',\n", 1610 | " 'lastName': 'Pédamon',\n", 1611 | " 'occupation': 'Business Development manager Apple Centers France at Apple Computer France',\n", 1612 | " 'objectUrn': 'urn:li:member:2402888',\n", 1613 | " 'publicIdentifier': 'philippe-pédamon-68897a'},\n", 1614 | " {'firstName': 'Chris',\n", 1615 | " 'lastName': 'Rosebert',\n", 1616 | " 'occupation': 'Head of Data Science and A.I.',\n", 1617 | " 'objectUrn': 'urn:li:member:3237065',\n", 1618 | " 'publicIdentifier': 'chris-rosebert-3751011'},\n", 1619 | " {'firstName': 'Kévin',\n", 1620 | " 'lastName': 'Legendre',\n", 1621 | " 'occupation': 'Co-Founder & CTO @ Smart Jobsite',\n", 1622 | " 'objectUrn': 'urn:li:member:180974890',\n", 1623 | " 'publicIdentifier': 'kévin-legendre-a0a73650'},\n", 1624 | " {'firstName': 'Martin',\n", 1625 | " 'lastName': 'Ryssen',\n", 1626 | " 'occupation': 'Founder & CEO at Waves',\n", 1627 | " 'objectUrn': 'urn:li:member:5081549',\n", 1628 | " 'publicIdentifier': 'martinryssen'},\n", 1629 | " {'firstName': 'Helene',\n", 1630 | " 'lastName': 'Lefevre',\n", 1631 | " 'occupation': 'Consultante RH',\n", 1632 | " 'objectUrn': 'urn:li:member:5128581',\n", 1633 | " 'publicIdentifier': 'helene-lefevre-b198731'},\n", 1634 | " {'firstName': 'Quentin',\n", 1635 | " 'lastName': 'Adam',\n", 1636 | " 'occupation': 'CEO @ Clever Cloud',\n", 1637 | " 'objectUrn': 'urn:li:member:48760575',\n", 1638 | " 'publicIdentifier': 'waxzce'},\n", 1639 | " {'firstName': 'Alexandre',\n", 1640 | " 'lastName': 'Pierrin-Neron',\n", 1641 | " 'occupation': 'Regional Vice President - France & Eastern Countries at Cybereason',\n", 1642 | " 'objectUrn': 'urn:li:member:3949897',\n", 1643 | " 'publicIdentifier': 'alexandrepierrinneron'},\n", 1644 | " {'firstName': 'Clément',\n", 1645 | " 'lastName': 'Delangue',\n", 1646 | " 'occupation': \"Co-founder & CEO at Hugging Face - we're hiring in NYC & Paris!\",\n", 1647 | " 'objectUrn': 'urn:li:member:34810046',\n", 1648 | " 'publicIdentifier': 'clementdelangue'},\n", 1649 | " {'firstName': 'Philippe',\n", 1650 | " 'lastName': 'Ensarguet',\n", 1651 | " 'occupation': 'CTO / Strategic Leader',\n", 1652 | " 'objectUrn': 'urn:li:member:5501111',\n", 1653 | " 'publicIdentifier': 'philippeensarguet'},\n", 1654 | " {'firstName': 'Charles',\n", 1655 | " 'lastName': 'Sutton',\n", 1656 | " 'occupation': 'CTO & Founder @Datascientest | We are Hiring !',\n", 1657 | " 'objectUrn': 'urn:li:member:291843950',\n", 1658 | " 'publicIdentifier': 'charlessuttonprofile'},\n", 1659 | " {'firstName': 'Geoff',\n", 1660 | " 'lastName': 'Clark',\n", 1661 | " 'occupation': 'EMEA Country Manager at Aerospike 🚀',\n", 1662 | " 'objectUrn': 'urn:li:member:7269846',\n", 1663 | " 'publicIdentifier': 'geoffclark'},\n", 1664 | " {'firstName': 'Kreshnik',\n", 1665 | " 'lastName': 'Zeneli',\n", 1666 | " 'occupation': 'Senior Oracle DBA',\n", 1667 | " 'objectUrn': 'urn:li:member:204087177',\n", 1668 | " 'publicIdentifier': 'kreshnikzeneli'},\n", 1669 | " {'firstName': 'Horacio',\n", 1670 | " 'lastName': 'Gonzalez',\n", 1671 | " 'occupation': 'DevRel at OVH — Google Developer Expert — Spaniard lost in Brittany.',\n", 1672 | " 'objectUrn': 'urn:li:member:4977800',\n", 1673 | " 'publicIdentifier': 'horaciogonzalez'},\n", 1674 | " {'firstName': 'Emmanuel',\n", 1675 | " 'lastName': 'Ulrich',\n", 1676 | " 'occupation': 'Practice Manager Big Data & Cloud Architecture chez Keyrus',\n", 1677 | " 'objectUrn': 'urn:li:member:3761782',\n", 1678 | " 'publicIdentifier': 'emmanuel-ulrich-b5a3141'},\n", 1679 | " {'firstName': 'Julien',\n", 1680 | " 'lastName': 'BLIN',\n", 1681 | " 'occupation': 'Talent Acquisition Manager (France, Belgium & the Netherland) at Apple',\n", 1682 | " 'objectUrn': 'urn:li:member:139997380',\n", 1683 | " 'publicIdentifier': 'julien-blin'},\n", 1684 | " {'firstName': 'Marie',\n", 1685 | " 'lastName': 'Valleron',\n", 1686 | " 'occupation': 'Data Scientist - Apple Inc',\n", 1687 | " 'objectUrn': 'urn:li:member:172589099',\n", 1688 | " 'publicIdentifier': 'marievalleron'},\n", 1689 | " {'firstName': 'Gilles',\n", 1690 | " 'lastName': 'Audoin',\n", 1691 | " 'occupation': 'Manager chez Apple retail',\n", 1692 | " 'objectUrn': 'urn:li:member:380331248',\n", 1693 | " 'publicIdentifier': 'gilles-audoin-128457a7'},\n", 1694 | " {'firstName': 'Hugo',\n", 1695 | " 'lastName': 'Kisebwe',\n", 1696 | " 'occupation': 'Innovation | Data Scientist & Engineer chez Deloitte',\n", 1697 | " 'objectUrn': 'urn:li:member:479358027',\n", 1698 | " 'publicIdentifier': 'hugo-kisebwe-323652114'},\n", 1699 | " {'firstName': 'Stéphane',\n", 1700 | " 'lastName': 'D.',\n", 1701 | " 'occupation': 'Président @CompareDabord',\n", 1702 | " 'objectUrn': 'urn:li:member:169776862',\n", 1703 | " 'publicIdentifier': 'ceo-comparedabord'},\n", 1704 | " {'firstName': 'Shankar',\n", 1705 | " 'lastName': 'ARUL',\n", 1706 | " 'occupation': 'Head of Data Science & CEO @ jetpackdata.com - Fastest way to Explore your Data!',\n", 1707 | " 'objectUrn': 'urn:li:member:23462288',\n", 1708 | " 'publicIdentifier': 'shankararul'},\n", 1709 | " {'firstName': 'Olivier',\n", 1710 | " 'lastName': 'Cahagne',\n", 1711 | " 'occupation': 'Solutions Architect - Telco',\n", 1712 | " 'objectUrn': 'urn:li:member:4528599',\n", 1713 | " 'publicIdentifier': 'ocahagne'},\n", 1714 | " {'firstName': 'Ian',\n", 1715 | " 'lastName': 'Swanson',\n", 1716 | " 'occupation': 'Director, Amazon Web Services (AWS)',\n", 1717 | " 'objectUrn': 'urn:li:member:11642924',\n", 1718 | " 'publicIdentifier': 'ianswanson'},\n", 1719 | " {'firstName': 'Paul',\n", 1720 | " 'lastName': 'Semel',\n", 1721 | " 'occupation': 'Software Engineer @ Apple',\n", 1722 | " 'objectUrn': 'urn:li:member:499113608',\n", 1723 | " 'publicIdentifier': 'paul-semel'},\n", 1724 | " {'firstName': 'Eric',\n", 1725 | " 'lastName': 'Chabrier',\n", 1726 | " 'occupation': 'Senior Major Account Executive at Apple',\n", 1727 | " 'objectUrn': 'urn:li:member:39869060',\n", 1728 | " 'publicIdentifier': 'ericchabrier'},\n", 1729 | " {'firstName': 'Guillaume',\n", 1730 | " 'lastName': 'Perrin-Houdon',\n", 1731 | " 'occupation': 'Data @ TheFork, a TripAdvisor company - hiring!',\n", 1732 | " 'objectUrn': 'urn:li:member:3013732',\n", 1733 | " 'publicIdentifier': 'guillaumeph'},\n", 1734 | " {'firstName': 'Roland',\n", 1735 | " 'lastName': 'Simporé',\n", 1736 | " 'occupation': 'Data Scientist & BI Analyst - Apple WW Coverage & BI',\n", 1737 | " 'objectUrn': 'urn:li:member:39604004',\n", 1738 | " 'publicIdentifier': 'rolandsimpore'}]}],\n", 1739 | " 'jobs': [{'WebSearchJobJserpJobPostingLite': [{'title': 'Business Expert',\n", 1740 | " 'formattedLocation': 'Wuxi, CN',\n", 1741 | " 'listedAt': 1586857956000},\n", 1742 | " {'title': 'Sr Cloud Database Architect',\n", 1743 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1744 | " 'listedAt': 1584526349000},\n", 1745 | " {'title': 'Data Scientist, People Analytics',\n", 1746 | " 'formattedLocation': 'Austin, TX, US',\n", 1747 | " 'listedAt': 1586172540000},\n", 1748 | " {'title': 'Strategy Lead - New Product Roadmap',\n", 1749 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1750 | " 'listedAt': 1584994955000},\n", 1751 | " {'title': 'KR-스토어 리더',\n", 1752 | " 'formattedLocation': 'Seoul, KR',\n", 1753 | " 'listedAt': 1585341912000},\n", 1754 | " {'title': 'Big Data Analytics Engineer',\n", 1755 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1756 | " 'listedAt': 1585566388000},\n", 1757 | " {'title': 'Data Scientist',\n", 1758 | " 'formattedLocation': 'Austin, TX, US',\n", 1759 | " 'listedAt': 1584355209000}]},\n", 1760 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Business Expert',\n", 1761 | " 'formattedLocation': 'Wuxi, CN',\n", 1762 | " 'listedAt': 1586857956000},\n", 1763 | " {'title': 'Data Scientist, People Analytics',\n", 1764 | " 'formattedLocation': 'Austin, TX, US',\n", 1765 | " 'listedAt': 1586172540000},\n", 1766 | " {'title': 'Strategy Lead - New Product Roadmap',\n", 1767 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1768 | " 'listedAt': 1584994955000},\n", 1769 | " {'title': 'KR-스토어 리더',\n", 1770 | " 'formattedLocation': 'Seoul, KR',\n", 1771 | " 'listedAt': 1585341912000},\n", 1772 | " {'title': 'Big Data Analytics Engineer',\n", 1773 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1774 | " 'listedAt': 1585566388000},\n", 1775 | " {'title': 'Data Scientist',\n", 1776 | " 'formattedLocation': 'Austin, TX, US',\n", 1777 | " 'listedAt': 1584355209000},\n", 1778 | " {'title': 'Big Data Engineer, Apple Media Products Analytics',\n", 1779 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1780 | " 'listedAt': 1585474636000}]},\n", 1781 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Business Expert',\n", 1782 | " 'formattedLocation': 'Wuxi, CN',\n", 1783 | " 'listedAt': 1586857956000},\n", 1784 | " {'title': 'Data Scientist, People Analytics',\n", 1785 | " 'formattedLocation': 'Austin, TX, US',\n", 1786 | " 'listedAt': 1586172540000},\n", 1787 | " {'title': 'Strategy Lead - New Product Roadmap',\n", 1788 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1789 | " 'listedAt': 1584994955000},\n", 1790 | " {'title': 'Big Data Analytics Engineer',\n", 1791 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1792 | " 'listedAt': 1585566388000},\n", 1793 | " {'title': 'Data Scientist',\n", 1794 | " 'formattedLocation': 'Austin, TX, US',\n", 1795 | " 'listedAt': 1584355209000},\n", 1796 | " {'title': 'Big Data Engineer, Apple Media Products Analytics',\n", 1797 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1798 | " 'listedAt': 1585474636000},\n", 1799 | " {'title': 'Experience Strategist',\n", 1800 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1801 | " 'listedAt': 1586771208000}]},\n", 1802 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Business Expert',\n", 1803 | " 'formattedLocation': 'Wuxi, CN',\n", 1804 | " 'listedAt': 1586857956000},\n", 1805 | " {'title': 'Data Scientist, People Analytics',\n", 1806 | " 'formattedLocation': 'Austin, TX, US',\n", 1807 | " 'listedAt': 1586172540000},\n", 1808 | " {'title': 'Data Scientist, Apple Pay Analytics',\n", 1809 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1810 | " 'listedAt': 1585563069000},\n", 1811 | " {'title': 'Big Data Analytics Engineer',\n", 1812 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1813 | " 'listedAt': 1585566388000},\n", 1814 | " {'title': 'Data Scientist',\n", 1815 | " 'formattedLocation': 'Austin, TX, US',\n", 1816 | " 'listedAt': 1584355209000},\n", 1817 | " {'title': 'Big Data Engineer, Apple Media Products Analytics',\n", 1818 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1819 | " 'listedAt': 1585474636000},\n", 1820 | " {'title': 'Experience Strategist',\n", 1821 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1822 | " 'listedAt': 1586771208000}]},\n", 1823 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Business Expert',\n", 1824 | " 'formattedLocation': 'Wuxi, CN',\n", 1825 | " 'listedAt': 1586857956000},\n", 1826 | " {'title': 'Data Scientist, People Analytics',\n", 1827 | " 'formattedLocation': 'Austin, TX, US',\n", 1828 | " 'listedAt': 1586172540000},\n", 1829 | " {'title': 'Data Scientist, Apple Pay Analytics',\n", 1830 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1831 | " 'listedAt': 1585563069000},\n", 1832 | " {'title': 'Big Data Analytics Engineer',\n", 1833 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1834 | " 'listedAt': 1585566388000},\n", 1835 | " {'title': 'Big Data Engineer, Apple Media Products Analytics',\n", 1836 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1837 | " 'listedAt': 1585474636000},\n", 1838 | " {'title': 'Conversational AI',\n", 1839 | " 'formattedLocation': 'Austin, TX, US',\n", 1840 | " 'listedAt': 1584784037000},\n", 1841 | " {'title': 'Experience Strategist',\n", 1842 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1843 | " 'listedAt': 1586771208000}]},\n", 1844 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Data Scientist, People Analytics',\n", 1845 | " 'formattedLocation': 'Austin, TX, US',\n", 1846 | " 'listedAt': 1586172540000},\n", 1847 | " {'title': 'Data Scientist, Apple Pay Analytics',\n", 1848 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1849 | " 'listedAt': 1585563069000},\n", 1850 | " {'title': 'Big Data Analytics Engineer',\n", 1851 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1852 | " 'listedAt': 1585566388000},\n", 1853 | " {'title': 'Big Data Engineer, Apple Media Products Analytics',\n", 1854 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1855 | " 'listedAt': 1585474636000},\n", 1856 | " {'title': 'ISE, SIML - Data Annotation Lead',\n", 1857 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1858 | " 'listedAt': 1585210712000},\n", 1859 | " {'title': 'Conversational AI',\n", 1860 | " 'formattedLocation': 'Austin, TX, US',\n", 1861 | " 'listedAt': 1584784037000},\n", 1862 | " {'title': 'Experience Strategist',\n", 1863 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1864 | " 'listedAt': 1586771208000}]},\n", 1865 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Data Scientist, People Analytics',\n", 1866 | " 'formattedLocation': 'Austin, TX, US',\n", 1867 | " 'listedAt': 1586172540000},\n", 1868 | " {'title': 'Data Scientist, Apple Pay Analytics',\n", 1869 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1870 | " 'listedAt': 1585563069000},\n", 1871 | " {'title': 'Lab Operations Lead',\n", 1872 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1873 | " 'listedAt': 1584439031000},\n", 1874 | " {'title': 'Big Data Engineer, Apple Media Products Analytics',\n", 1875 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1876 | " 'listedAt': 1585474636000},\n", 1877 | " {'title': 'ISE, SIML - Data Annotation Lead',\n", 1878 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1879 | " 'listedAt': 1585210712000},\n", 1880 | " {'title': 'Conversational AI',\n", 1881 | " 'formattedLocation': 'Austin, TX, US',\n", 1882 | " 'listedAt': 1584784037000},\n", 1883 | " {'title': 'Experience Strategist',\n", 1884 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1885 | " 'listedAt': 1586771208000}]},\n", 1886 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Big Data Engineer - Wallet & Apple Pay',\n", 1887 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1888 | " 'listedAt': 1586166441000},\n", 1889 | " {'title': 'Data Scientist, Apple Pay Analytics',\n", 1890 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1891 | " 'listedAt': 1585563069000},\n", 1892 | " {'title': 'Lab Operations Lead',\n", 1893 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1894 | " 'listedAt': 1584439031000},\n", 1895 | " {'title': 'Big Data Engineer, Apple Media Products Analytics',\n", 1896 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1897 | " 'listedAt': 1585474636000},\n", 1898 | " {'title': 'ISE, SIML - Data Annotation Lead',\n", 1899 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1900 | " 'listedAt': 1585210712000},\n", 1901 | " {'title': 'Conversational AI',\n", 1902 | " 'formattedLocation': 'Austin, TX, US',\n", 1903 | " 'listedAt': 1584784037000},\n", 1904 | " {'title': 'Experience Strategist',\n", 1905 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1906 | " 'listedAt': 1586771208000}]},\n", 1907 | " {'WebSearchJobJserpJobPostingLite': [{'title': 'Big Data Engineer - Wallet & Apple Pay',\n", 1908 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1909 | " 'listedAt': 1586166441000},\n", 1910 | " {'title': 'Data Scientist, Apple Pay Analytics',\n", 1911 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1912 | " 'listedAt': 1585563069000},\n", 1913 | " {'title': 'Product Manager, Apple Pay and Wallet',\n", 1914 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1915 | " 'listedAt': 1586214924000},\n", 1916 | " {'title': 'Lab Operations Lead',\n", 1917 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1918 | " 'listedAt': 1584439031000},\n", 1919 | " {'title': 'ISE, SIML - Data Annotation Lead',\n", 1920 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1921 | " 'listedAt': 1585210712000},\n", 1922 | " {'title': 'Conversational AI',\n", 1923 | " 'formattedLocation': 'Austin, TX, US',\n", 1924 | " 'listedAt': 1584784037000},\n", 1925 | " {'title': 'Experience Strategist',\n", 1926 | " 'formattedLocation': 'Cupertino, CA, US',\n", 1927 | " 'listedAt': 1586771208000}]}]}]" 1928 | ] 1929 | }, 1930 | "execution_count": 6, 1931 | "metadata": {}, 1932 | "output_type": "execute_result" 1933 | } 1934 | ], 1935 | "source": [ 1936 | "companies_infos" 1937 | ] 1938 | }, 1939 | { 1940 | "cell_type": "code", 1941 | "execution_count": null, 1942 | "metadata": {}, 1943 | "outputs": [], 1944 | "source": [] 1945 | } 1946 | ], 1947 | "metadata": { 1948 | "kernelspec": { 1949 | "display_name": "Python 3", 1950 | "language": "python", 1951 | "name": "python3" 1952 | }, 1953 | "language_info": { 1954 | "codemirror_mode": { 1955 | "name": "ipython", 1956 | "version": 3 1957 | }, 1958 | "file_extension": ".py", 1959 | "mimetype": "text/x-python", 1960 | "name": "python", 1961 | "nbconvert_exporter": "python", 1962 | "pygments_lexer": "ipython3", 1963 | "version": "3.8.2" 1964 | } 1965 | }, 1966 | "nbformat": 4, 1967 | "nbformat_minor": 4 1968 | } 1969 | -------------------------------------------------------------------------------- /lk_scraper/__init__.py: -------------------------------------------------------------------------------- 1 | # Use of this source code is governed by a BSD-style 2 | # license that can be found in the LICENSE file. 3 | # Copyright 2020 The lk_scraper Authors. All rights reserved. 4 | 5 | from .config.config import ScraperConfig 6 | from .scraper.scraper import Scraper 7 | -------------------------------------------------------------------------------- /lk_scraper/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jqueguiner/lk_scraper/2c9b31baca212dfcd4d3e13a2a0ee0b7f5de658a/lk_scraper/config/__init__.py -------------------------------------------------------------------------------- /lk_scraper/config/config.py: -------------------------------------------------------------------------------- 1 | # Use of this source code is governed by a BSD-style 2 | # license that can be found in the LICENSE file. 3 | # Copyright 2020 The lk_scraper Authors. All rights reserved. 4 | 5 | import json 6 | import os 7 | import yaml 8 | 9 | DEFAULT_SCRAPER_CONFIG_PATH = f'{os.environ["HOME"]}/.lk_scraper' 10 | DEFAULT_SCRAPER_CONFIG_FILE = 'config.yml' 11 | DEFAULT_SCRAPER_RULES_FILE = 'scraper_rules.json' 12 | 13 | 14 | class ScraperConfig(object): 15 | """ 16 | User specific scraper configuration object, read config file in the wanted directory 17 | """ 18 | 19 | def __init__(self, 20 | config_path: str = DEFAULT_SCRAPER_CONFIG_PATH, 21 | config_file: str = DEFAULT_SCRAPER_CONFIG_FILE, 22 | rules_file: str = DEFAULT_SCRAPER_RULES_FILE, 23 | ): 24 | """ 25 | Construct a ScraperConfig 26 | :param config_path: The path of the prescience configuration directory to use 27 | :param config_file: The name of the configuration file to use 28 | :param rules_file: The name of the rules file to use 29 | """ 30 | self.config_path: str = config_path 31 | self.config_file: str = config_file 32 | self.rules_file: str = rules_file 33 | self.full_config_path: str = os.path.join(config_path, config_file) 34 | self.full_rules_path: str = os.path.join(config_path, rules_file) 35 | 36 | self.config = dict() 37 | self.selenium = dict() 38 | self.linkedin = dict() 39 | 40 | self.rules = dict() 41 | 42 | self.rules, self.config = self.load() 43 | 44 | def load(self) -> 'ScraperConfig': 45 | """ 46 | Load the configuration depending on what's inside configuration file 47 | :return: self 48 | """ 49 | ScraperConfig.create_config_path_if_not_exist(config_path=self.config_path) 50 | 51 | if os.path.isfile(self.full_config_path): 52 | print('Loading configuration file %s' % self.full_config_path) 53 | with open(self.full_config_path, 'r') as f: 54 | self.config = yaml.load(f, Loader=yaml.FullLoader) 55 | 56 | self.selenium = self.config['selenium'] 57 | self.linkedin = self.config['linkedin'] 58 | 59 | print('Loading rules file %s' % self.full_rules_path) 60 | with open(self.full_rules_path, 'r') as f: 61 | self.rules = json.load(f) 62 | 63 | return self.rules, self.config 64 | 65 | def get_rules(self) -> dict: 66 | return self.rules 67 | 68 | def get_selenium_config(self) -> dict: 69 | return self.selenium 70 | 71 | def get_linkedin_config(self) -> dict: 72 | return self.linkedin 73 | 74 | def get_config(self) -> dict(): 75 | return self.config 76 | 77 | @staticmethod 78 | def create_config_path_if_not_exist(config_path: str = DEFAULT_SCRAPER_CONFIG_PATH) -> str: 79 | """ 80 | Static method responsible for creating the configuration directory if it doesn't exist yet 81 | :param config_path: The configuration directory path to create if needed 82 | :return: The configuration directory path 83 | """ 84 | if not os.path.exists(config_path): 85 | print(f'Directory \'{config_path}\' doesn\'t exists. Creating it...') 86 | os.makedirs(config_path) 87 | return config_path 88 | -------------------------------------------------------------------------------- /lk_scraper/config/init.py: -------------------------------------------------------------------------------- 1 | # Use of this source code is governed by a BSD-style 2 | # license that can be found in the LICENSE file. 3 | # Copyright 2020 The lk_scraper Authors. All rights reserved. 4 | -------------------------------------------------------------------------------- /lk_scraper/scraper/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jqueguiner/lk_scraper/2c9b31baca212dfcd4d3e13a2a0ee0b7f5de658a/lk_scraper/scraper/__init__.py -------------------------------------------------------------------------------- /lk_scraper/scraper/driver.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | 3 | from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 4 | from selenium.webdriver.common.by import By 5 | from selenium.webdriver.support.ui import WebDriverWait 6 | from selenium.webdriver.support import expected_conditions as EC 7 | from selenium.webdriver.common.keys import Keys 8 | 9 | from bs4 import BeautifulSoup 10 | 11 | import random 12 | import time 13 | import re 14 | import sys 15 | import itertools 16 | 17 | from lk_scraper.config.config import ScraperConfig 18 | 19 | 20 | class Driver: 21 | def __init__(self, li_at_cookie=""): 22 | scraper_config = ScraperConfig() 23 | self.config = scraper_config.get_config() 24 | self.driver = self.build_driver() 25 | if self.driver: 26 | print("Driver loaded") 27 | if self.add_coookies(li_at_cookie=""): 28 | print("Cookies loaded") 29 | 30 | def build_driver(self): 31 | config = self.config['selenium'] 32 | 33 | try: 34 | driver = webdriver.Remote( 35 | command_executor='%s://%s:%d/wd/hub' % (config['protocol'], config['host'], config['port']), 36 | desired_capabilities={'browserName': config['browserName'], 37 | 'javascriptEnabled': config['javascriptEnabled']}) 38 | self.driver = driver 39 | return driver 40 | 41 | except: 42 | print("Fail loading selenium driver") 43 | print("Make sure your selenium worker is deployed") 44 | print("For example you could launch a Selenium container") 45 | print("By typing: docker run -d -p4444:4444 --shm-size=2g selenium/standalone-firefox:3.141.59-20200326") 46 | print("Unexpected error:", sys.exc_info()[0]) 47 | return False 48 | 49 | def add_coookies(self, li_at_cookie="") -> bool: 50 | config = self.config['linkedin'] 51 | 52 | try: 53 | for cookie in config['cookies']: 54 | regex = r"([a-z].*\.[a-z].*)" 55 | self.driver.get("https://%s" % re.findall(regex, cookie['domain'])[0]) 56 | self.driver.add_cookie({ 57 | 'name': cookie['name'], 58 | 'value': cookie['value'], 59 | 'domain': cookie['domain'] 60 | }) 61 | 62 | if not li_at_cookie == "": 63 | self.driver.add_cookie({ 64 | 'name': 'li_at', 65 | 'value': li_at_cookie, 66 | 'domain': '.www.linkedin.com' 67 | }) 68 | 69 | return True 70 | 71 | except: 72 | print("Fail loading cookies") 73 | return False 74 | 75 | def get(self, url): 76 | print(url) 77 | return self.driver.get(url) 78 | 79 | def browse(self, url) -> webdriver: 80 | self.driver.get(url) 81 | WebDriverWait(self.driver, 1).until(EC.presence_of_element_located((By.ID, "profile-nav-item"))) 82 | 83 | for _ in itertools.repeat(None, 3): 84 | self.scroll_down() 85 | time.sleep(random.randrange(30, 100, 1) / 100) 86 | 87 | def get_page_source(self) -> str: 88 | source = self.driver.page_source 89 | return source 90 | 91 | def get_soup(self): 92 | source = self.get_page_source() 93 | soup = BeautifulSoup(source, 'html.parser') 94 | return soup 95 | 96 | def scroll_down(self): 97 | self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 98 | 99 | def scroll_to_bottom(self, scroll_increment=300, timeout=10): 100 | """Scroll to the bottom of the page 101 | Params: 102 | - scroll_pause_time {float}: time to wait (s) between page scroll increments 103 | - scroll_increment {int}: increment size of page scrolls (pixels) 104 | """ 105 | 106 | expandable_button_selectors = [ 107 | 'button[aria-expanded="false"].pv-skills-section__additional-skills', 108 | 'button[aria-expanded="false"].pv-profile-section__see-more-inline', 109 | 'button[aria-expanded="false"].pv-top-card-section__summary-toggle-button', 110 | 'button[data-control-name="contact_see_more"]' 111 | ] 112 | 113 | current_height = 0 114 | 115 | while True: 116 | for name in expandable_button_selectors: 117 | try: 118 | self.driver.find_element_by_css_selector(name).click() 119 | except: 120 | pass 121 | 122 | # Use JQuery to click on invisible expandable 'see more...' elements 123 | self.driver.execute_script( 124 | 'document.querySelectorAll(".lt-line-clamp__ellipsis:not(.lt-line-clamp__ellipsis--dummy) .lt-line-clamp__more").forEach(el => el.click())') 125 | 126 | # Scroll down to bottom 127 | new_height = self.driver.execute_script( 128 | "return Math.min({}, document.body.scrollHeight)".format(current_height + scroll_increment)) 129 | if (new_height == current_height): 130 | break 131 | self.driver.execute_script( 132 | "window.scrollTo(0, Math.min({}, document.body.scrollHeight));".format(new_height)) 133 | current_height = new_height 134 | # Wait to load page 135 | scroll_pause = random.randrange(0, 30, 1) / 1000 136 | time.sleep(scroll_pause) 137 | 138 | def click(self, xpath='//*[@id="ember419"]'): 139 | python_button = self.driver.find_elements_by_xpath(xpath)[0] 140 | python_button.click() 141 | -------------------------------------------------------------------------------- /lk_scraper/scraper/scraper.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | 3 | from selenium import webdriver 4 | 5 | from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 6 | from selenium.webdriver.common.by import By 7 | from selenium.webdriver.support.ui import WebDriverWait 8 | from selenium.webdriver.support import expected_conditions as EC 9 | from selenium.webdriver.common.keys import Keys 10 | 11 | import re 12 | import json 13 | 14 | from lk_scraper.scraper.driver import Driver 15 | from lk_scraper.config.config import ScraperConfig 16 | 17 | 18 | class Scraper: 19 | def __init__(self, li_at=""): 20 | scraper_config = ScraperConfig() 21 | 22 | self.rules = scraper_config.get_rules() 23 | self.config = scraper_config.get_config() 24 | self.driver = Driver(li_at) 25 | 26 | def extract_field(self, data, field='name') -> dict(): 27 | out = "" 28 | 29 | dateFields = ['dateRange', 'birthDateOn'] 30 | 31 | if any(dateField in field for dateField in dateFields): 32 | out = {} 33 | try: 34 | out[field] = data[field] 35 | except: 36 | pass 37 | 38 | try: 39 | del out[field]['end']['$type'] 40 | except: 41 | pass 42 | 43 | try: 44 | del out[field]['start']['$type'] 45 | except: 46 | pass 47 | 48 | elif 'Urn' in field: 49 | try: 50 | out[field] = hashlib.sha1(data[field].encode()) 51 | except: 52 | pass 53 | else: 54 | try: 55 | out = data[field] 56 | except: 57 | pass 58 | 59 | try: 60 | del out[field]['$type'] 61 | except: 62 | pass 63 | 64 | if isinstance(out, dict): 65 | for k in list(out): 66 | if isinstance(out[k], dict): 67 | for l in list(out[k]): 68 | if k == '$type': 69 | del out[k][l] 70 | 71 | else: 72 | if k == '$type': 73 | del out[k] 74 | return out 75 | 76 | def extract_from_json(self, soup, fields_to_extract): 77 | out = dict() 78 | 79 | code_snippets = soup.findAll("code") 80 | 81 | for output_dict_key, extract in fields_to_extract.items(): 82 | output_dict_key = output_dict_key.rsplit('.', 1)[1] 83 | out[output_dict_key] = list() 84 | 85 | for code in code_snippets: 86 | if 'com.linkedin.voyager' in code.text.strip(): 87 | data = json.loads(code.text.strip()) 88 | 89 | if 'included' in data: 90 | data = data['included'] 91 | 92 | for rule_key, rule in fields_to_extract.items(): 93 | for sub_dataset in data: 94 | if '$type' in sub_dataset: 95 | 96 | if sub_dataset['$type'] == rule_key: 97 | temp = dict() 98 | 99 | for field in rule['fields']: 100 | if field in sub_dataset: 101 | temp[field] = sub_dataset[field] 102 | 103 | if 'custom_fields' in rule: 104 | for k, field in rule['custom_fields'].items(): 105 | try: 106 | temp[k] = re.search(field['regex'], temp[field['field']], 107 | re.IGNORECASE).group(1) 108 | except: 109 | pass 110 | 111 | if rule['list']: 112 | out[rule_key.rsplit('.', 1)[1]].append(temp) 113 | else: 114 | out[rule_key.rsplit('.', 1)[1]] = temp 115 | 116 | if '$recipeTypes' in sub_dataset: 117 | 118 | for rtype in sub_dataset['$recipeTypes']: 119 | 120 | if rtype == rule_key: 121 | temp = dict() 122 | for field in rule['fields']: 123 | if field in sub_dataset: 124 | temp[field] = sub_dataset[field] 125 | 126 | if 'custom_fields' in rule: 127 | for k, field in rule['custom_fields'].items(): 128 | try: 129 | temp[k] = re.search(field['regex'], temp[field['field']], 130 | re.IGNORECASE).group(1) 131 | except: 132 | pass 133 | 134 | if rule['list']: 135 | out[rule_key.rsplit('.', 1)[1]].append(temp) 136 | else: 137 | out[rule_key.rsplit('.', 1)[1]] = temp 138 | 139 | return out 140 | 141 | def get_driver(self) -> webdriver: 142 | return self.driver 143 | 144 | def get_config(self) -> dict: 145 | return self.config 146 | 147 | def get_rules(self) -> dict: 148 | return self.rules 149 | 150 | def extract_object(self, url, rules): 151 | try: 152 | print("scraping : %s" % url) 153 | self.driver.browse(url=url) 154 | except: 155 | self.driver = Driver() 156 | self.driver.browse(url=url) 157 | 158 | soup = self.driver.get_soup() 159 | return self.extract_from_json(soup, rules) 160 | 161 | def get_object(self, object_name='company', object_id='apple', full_url=""): 162 | 163 | object_rules = self.rules[object_name] 164 | 165 | if not full_url == "": 166 | url = full_url 167 | else: 168 | url_placeholder = object_rules['url_placeholder'] 169 | url = url_placeholder % str(object_id) 170 | 171 | lk_object = self.extract_object(url, object_rules['extract_rules']) 172 | 173 | if 'subsections' in object_rules: 174 | for key, subsection in object_rules['subsections'].items(): 175 | regex = r"{(.*)}" 176 | url = subsection['url_placeholder'] 177 | 178 | for match in re.findall(regex, url): 179 | replacement = lk_object 180 | keys = match.split(".") 181 | 182 | for index in keys: 183 | try: 184 | index = int(index) 185 | except: 186 | pass 187 | 188 | replacement = replacement[index] 189 | 190 | url = url.replace('{%s}' % match, replacement) 191 | 192 | subsection_dict = list() 193 | 194 | if "crawler" in subsection: 195 | for page_index in range(1, subsection['crawler']['limit']): 196 | url = url + subsection['crawler']['prefix'] + str(page_index) 197 | subsection_object = self.extract_object(url, subsection['extract_rules']) 198 | subsection_dict.append(subsection_object) 199 | else: 200 | subsection_dict = self.extract_object(url, subsection['extract_rules']) 201 | 202 | lk_object[key] = subsection_dict 203 | 204 | return lk_object 205 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [metadata] 2 | name = lk_scraper 3 | description = "lk_scraper a General Purpose Linkedin Scraper" 4 | long_description = file: README.md 5 | version = 0.0.1 6 | author = Jean-Louis Quéguiner 7 | author_email = jean-louis.queguiner@gadz.org 8 | license = BSD 3-Clause License 9 | license_file = LICENSE 10 | keywords = linkedin, scraper, selenium 11 | classifiers = 12 | License :: OSI Approved :: BSD License 13 | Intended Audience :: Developers 14 | Operating System :: OS Independent 15 | Programming Language :: Python :: 3.5 16 | Programming Language :: Python :: 3.6 17 | Topic :: Software Development :: Libraries :: Python Modules 18 | Topic :: System :: Archiving :: Packaging 19 | 20 | [options] 21 | packages = find: 22 | setup_requires = 23 | setuptools>=30.3.0 24 | include_package_data = True 25 | install_requires = 26 | progress>=1.4 27 | PyYAML>=5.1.2 28 | argcomplete 29 | 30 | #scripts = 31 | # lk_scraper 32 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import os, shutil 4 | from setuptools.command.install import install 5 | from distutils.core import setup, Extension 6 | from setuptools import setup, find_namespace_packages 7 | 8 | TARGET_PATH = f'{os.environ["HOME"]}/.lk_scraper/' 9 | SOURCE_PATH = 'config_files/' 10 | 11 | if not os.path.isdir(TARGET_PATH): 12 | os.makedirs(TARGET_PATH, exist_ok=True) 13 | 14 | src = os.path.join(os.getcwd(), SOURCE_PATH) 15 | 16 | for file_name in os.listdir(src): 17 | full_file_name = os.path.join(src, file_name) 18 | if os.path.isfile(full_file_name): 19 | target_full_file_name = os.path.join(TARGET_PATH, file_name) 20 | if not os.path.isfile(target_full_file_name): 21 | shutil.copy(full_file_name, target_full_file_name) 22 | else: 23 | print("config file %s already exists" % target_full_file_name) 24 | 25 | setup(name='lk_scraper', 26 | version='1.0', 27 | author='Jean-Louis Quéguiner', 28 | author_email='jean-louis.queguiner@gadz.org', 29 | packages=find_namespace_packages(), 30 | install_requires=[ 31 | 'selenium', 32 | 'PyYAML', 33 | 'beautifulsoup4' 34 | ], 35 | include_package_data=True 36 | ) 37 | --------------------------------------------------------------------------------