Created
August 20, 2020 07:43
-
-
Save TarasJan/bc8c7f8e26f686e263a0385b8cedc75d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# /bin/usr/python | |
import datetime | |
from selenium import webdriver | |
from selenium.webdriver.common.keys import Keys | |
from selenium.webdriver.common.by import By | |
from selenium.webdriver.support.ui import WebDriverWait | |
from selenium.webdriver.support import expected_conditions as EC | |
from selenium.webdriver.opera.options import Options | |
from selenium.common.exceptions import NoSuchElementException | |
from selenium.webdriver.common.action_chains import ActionChains | |
class Bot(): | |
def __init__(self): | |
options = Options() | |
options.add_argument("window-size=1920,1200") | |
# You can use a different web browser | |
self._driver = webdriver.Opera(executable_path=r'D:\\Program Files\\operadriver.exe', options=options) | |
self._sent_messages = [] | |
self._sent_names = [] | |
@property | |
def driver(self): | |
return self._driver | |
def start(self): | |
driver = self.driver | |
driver.get('https://www.linkedin.com/login?fromSignIn=true&trk=guest_homepage-basic_nav-header-signin') | |
creds = { | |
"email": "your_email_here", | |
"pass": "your_password_here" | |
} | |
email_input = driver.find_element_by_id('username') | |
pass_input = driver.find_element_by_id('password') | |
email_input.send_keys(creds['email']) | |
pass_input.send_keys(creds['pass']) | |
submit_element = driver.find_element_by_xpath("//button[@data-litms-control-urn='login-submit']") | |
submit_element.click() | |
driver.implicitly_wait(4) | |
network_link = driver.find_element_by_xpath("//a[@href='/mynetwork/']") | |
network_link.click() | |
for i in range(100): | |
try: | |
element = WebDriverWait(driver, 10).until( | |
EC.presence_of_element_located((By.CLASS_NAME, "discover-entity-type-card__info-container")) | |
) | |
finally: | |
driver.execute_script("window.scrollTo(0, 400)") | |
driver.execute_script("return document.getElementById('msg-overlay').remove();") | |
driver.implicitly_wait(4) | |
for _ in range(0, 5): | |
self.search_loop() | |
driver.refresh() | |
driver.save_screenshot('screen.png') | |
self.write_report() | |
driver.quit() | |
def search_loop(self): | |
elements = [elem for elem in self.driver.find_elements_by_xpath("//li[contains(@class, 'discover-entity-card--default-width')]") if elem.is_displayed()] | |
for element in elements: | |
try: | |
name = element.find_element_by_class_name('discover-person-card__name') | |
job = element.find_element_by_class_name('discover-person-card__occupation') | |
connect_button = element.find_element_by_xpath(f"//button[@aria-label='Zaproś użytkownika {name.text} do nawiązania kontaktu']") | |
print('PROFILE') | |
print(name.text) | |
print('-------') | |
print(job.text) | |
if not self.is_recruiter(job.text) or name.text in self._sent_names: | |
continue | |
ActionChains(self.driver).move_to_element(connect_button).perform() | |
self.driver.implicitly_wait(5) | |
connect_button.click() | |
self._sent_messages.append(f"{name.text} - {job.text}\n") | |
self._sent_names.append(name.text) | |
except NoSuchElementException: | |
break | |
self.scroll_to_bottom() | |
def write_report(self): | |
pass | |
# Of course your citeria may differ | |
def is_recruiter(self, job): | |
for word in ['recruiter', 'Recruiter', 'Talent', 'Headhunter', 'Rekruter', 'rekruter', 'Recruitment']: | |
if word in job: | |
return True | |
return False | |
def scroll_to_bottom(self): | |
self.driver.execute_script('window.scrollTo(0, document.body.scrollHeight)') | |
self.driver.implicitly_wait(3) | |
Bot().start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment