You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 KiB
291 KiB
<html>
<head>
</head>
</html>
Imports¶
In [7]:
import json
import time
# import dataframes
import utils
import requests
import ipywidgets as widgets
from bs4 import BeautifulSoup
from IPython.core.display import HTML, display # display(HTML(page_source))
import selenium
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import re
# from utils.files import generate_json
from datetime import datetime, timedelta
from urllib.request import urlopen
import logging as log
from utils.files import generate_json
from IPython.display import Image
Modules¶
Webdriver¶
In [ ]:
print(selenium.__version__)
chrome_options = webdriver.ChromeOptions()
# chrome_options.set_capability("browserless.token", "YOUR-API-TOKEN")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--headless")
# chrome_options.add_argument('--window-size=1920x1080')
chrome_options.add_argument("--start-maximized")
driver = webdriver.Remote(
command_executor="http://192.168.1.101:3148/webdriver", options=chrome_options
)
Linkedin¶
Login¶
In [ ]:
def login_linkedin():
"""This function logs into your personal LinkedIn profile"""
driver.get("https://www.linkedin.com")
driver.save_screenshot("./data/home.png")
get_title = driver.title
if get_title in ("LinkedIn: Log In or Sign Up"):
print("signing in")
login_email = driver.find_element(By.NAME, "session_key")
login_email.clear()
login_email.send_keys("aldrich.don@gmail.com")
driver.implicitly_wait(5)
login_pass = driver.find_element(By.NAME, "session_password")
login_pass.clear()
login_pass.send_keys("Ibanez#69")
login_pass.send_keys(Keys.RETURN)
driver.implicitly_wait(10)
driver.save_screenshot("./data/post_login.png")
page_source = driver.page_source
file = open("./data/post_login.html", "w")
file.write(page_source)
file.close()
log.info("VPN Settings...")
else:
print("not signing in")
log.error("VPN Settings...")
session_cookies = driver.get_cookies()
save_cookies(session_cookies)
return driver
Save browser cookies¶
In [ ]:
def save_cookies(session_cookies):
data = {}
data = session_cookies
file = open("./data/session_cookies.json", "w")
file = json.dumps(data)
Retrieve query metadata¶
In [ ]:
def total_results(driver):
total_results = driver.find_element(By.CLASS_NAME,
"display-flex.t-12.t-black--light.t-normal"
)
total_results_int = int(total_results.text.split(" ", 1)[0].replace(",", ""))
total_pages_int = int(total_results_int/25)
print(total_results_int, " jobs found")
print(total_pages_int, " pages")
return (total_results_int, total_pages_int)
Retrieve and parse first page of listings¶
In [ ]:
def page_results(driver, page_number):
"""This function parses the results of a single page"""
print(driver.title)
load_page(driver)
page_number_str = str(page_number)
time.sleep(2)
summaries = driver.find_elements(By.CSS_SELECTOR, "li.jobs-search-results__list-item")
jobs = driver.find_elements(By.CLASS_NAME, "occludable-update")
results = driver.find_elements(By.CLASS_NAME, "occludable-update.artdeco-list__item--offset-4.artdeco-list__item.p0.ember-view")
cards = driver.find_elements(By.CLASS_NAME, "job-card-container")
print(len(jobs), "jobs")
print(len(results), "results")
print(len(cards), "cards")
print(len(summaries), "summaries")
data = []
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")
file = open("./data/page_" + page_number_str + ".html", "w")
file.write(page_source)
file.close()
posting_list(page_source, page_number_str)
# for x in range(len(jobs)):
for x in range(4):
jobID = ""
if jobs[x].is_displayed():
# try:
# driver.execute_script("arguments[0].click();", cards[x])
# driver.save_screenshot("./data/cards_click.png")
# hover = ActionChains(driver).move_to_element(cards[x])
# hover.click(cards[x])
# hover.perform()
# time.sleep(2)
# detail_pane = driver.find_element_by_class_name("jobs-search__job-details--container")
# detail_panel = detail_pane.get_attribute('innerHTML')
# widgets.HTML(
# value=detail_panel,
# placeholder='Some HTML',
# description='Some HTML',
# )
# except:
# print("no ActionChains")
try:
html_job = jobs[x].get_attribute('innerHTML')
display(HTML(html_job))
except:
print("no html_job")
try:
snippet = summaries[x].screenshot("./data/job_card.png")
except:
print("no png_job")
try:
link = jobs[x].find_element_by_xpath("//div[@data-job-id]")
temp = link.get_attribute("data-job-id")
jobID = temp.split(":")[-1]
slink = jobs[x].find_element_by_xpath("//a[@data-control-id]")
# job_id = jobID
stemp = slink.get_attribute("href")
print(jobID)
print(stemp)
except:
print("no parse")
# try:
# print("auto applying")
# titles_ext = jobs[x].find_element_by_class_name("job-card-search__title.artdeco-entity-lockup__title.ember-view")
# print(titles_ext)
# auto_apply(title_ext)
# except:
# print("auto apply failed")
In [ ]:
In [13]:
def submit_apply(job_add):
"""This function submits the application for the job add found"""
print("You are applying to the position of: ", job_add.text)
# current_page = driver.current_url
# print(current_page)
try:
# actions.move_to_element(link)
# actions.click(link)
job_add.click()
# driver.save_screenshot("./data/submit_apply.png")
details = driver.find_element_by_id("job-details").text
print(details)
driver.save_screenshot("./data/submit_apply.png")
# page_source = driver.page_source
# file = open("./data/result" + job_add.text + ".html", "w")
# file.write(page_source)
# file.close()
# driver.back()
easy_apply_wizard = driver.find_elements_by_class_name("artdeco-modal")
# artdeco-modal
except:
print("no")
time.sleep(2)
# close_chat_button = driver.find_element_by_id(
# "//button[@id='ember152']"
# )
# close_chat_button.click()
In [14]:
def more_buttons(json_data, filename):
driver.get("https://www.tripadvisor.com/Airline_Review-d8729157-Reviews-Spirit-Airlines#REVIEWS")
more_buttons = driver.find_elements_by_class_name("moreLink")
for x in range(len(more_buttons)):
if more_buttons[x].is_displayed():
driver.execute_script("arguments[0].click();", more_buttons[x])
time.sleep(1)
page_source = driver.page_source
Utils¶
generate_json(json_data, filename)¶
In [15]:
def generate_json(json_data, filename):
try:
print(json_data)
with open(filename, "w") as outfile:
json.dump(json_data, outfile, indent=4)
log.info("Created " + filename)
except:
log.error("Failed to create " + filename)
load_page(driver, sleep=1)¶
In [16]:
def load_page(driver, sleep=1):
scroll_page = 0
while scroll_page < 4000:
driver.execute_script("window.scrollTo(0," + str(scroll_page) + " );")
scroll_page += 200
time.sleep(sleep)
if sleep != 1:
driver.execute_script("window.scrollTo(0,0);")
time.sleep(sleep * 3)
page = BeautifulSoup(driver.page_source, "lxml")
return page
In [17]:
def auto_apply(job_post):
"""This function submits the application for the job add found"""
print("You are applying to the position of: ", job_post.text)
try:
job_post.click()
time.sleep(2)
except:
print("You already applied to this job, go to next...")
pass
# click on the easy apply button, skip if already applied to the position
try:
in_apply = driver.find_element_by_xpath(
"//button[@data-control-name='jobdetails_topcard_inapply']",
)
in_apply.click()
except NoSuchElementException:
print("You already applied to this job, go to next...")
pass
time.sleep(1)
# try to submit if submit application is available...
try:
submit = driver.find_element_by_xpath(
"//button[@data-control-name='submit_unify']",
)
submit.send_keys(Keys.RETURN)
# ... if not available, discard application and go to next
except:
print("You already applied to this job, go to next...")
# except NoSuchElementException:
# print("Not direct application, going to next...")
# try:
# discard = driver.find_element_by_xpath(
# "//button[@data-test-modal-close-btn]",
# )
# discard.send_keys(Keys.RETURN)
# time.sleep(1)
# discard_confirm = driver.find_element_by_xpath(
# "//button[@data-test-dialog-primary-btn]",
# )
# discard_confirm.send_keys(Keys.RETURN)
# time.sleep(1)
# except NoSuchElementException:
# pass
time.sleep(1)
In [18]:
def get_job_id(post):
link = post.find_elements_by_xpath("//div[@data-job-id]")
temp = link.get_attribute("data-job-id")
jobID = temp.split(":")[-1]
# IDs.append(int(jobID))
print(jobID)
In [19]:
def job_detail_page(jobID):
job_link = "https://www.linkedin.com/jobs/view/" + str(jobID)
driver.get(job_link)
# time.sleep(2)
driver.save_screenshot("./data/job_detail_page.png")
login_button = driver.find_element(By.ID, "ember51")
# try:
# button = driver.find_elements_by_xpath(
# '//button[contains(@class, "jobs-apply")]/span[1]'
# )
# time.sleep(2)
driver.implicitly_wait(10)
login_button.click()
page_source = driver.page_source
load_page(driver)
file = open("./data/jobID_" + str(jobID) + ".html", "w")
file.write(page_source)
file.close()
In [20]:
def posting_list(page_source, page_number_str):
# with open("./data/page1.html", "r", encoding="utf-8") as f:
# text = f.read()
# soup = BeautifulSoup(text, "html.parser")
soup = BeautifulSoup(page_source, "html.parser")
test = soup.find_all("ul", class_="jobs-search-results__list")
rr = test[0].prettify()
file = open("./data/list_posts_" + page_number_str + ".html", "w")
file.write(rr)
file.close()
print("Snippet dumped")
Begin Scraping¶
In [33]:
search_url = "https://www.linkedin.com/jobs/search/?f_AL=true&f_JT=C%2CF&f_TPR=r86400&f_WT=2&geoId=103644278&keywords=devops%20engineer&location=united%20states"
try:
login_linkedin()
print("Login Succesful")
except:
print("Login Failed")
file = open("./data/post_login.png", "rb")
image = file.read()
login_screenshot = widgets.Image(
value=image,
format='png',
width=600,
height=600,
)
display(login_screenshot)
ERROR:root:VPN Settings...
not signing in Login Succesful
Image(value=b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x03 \x00\x00\x02X\x08\x06\x00\x00\x00\x9av\x82p\x00\…
In [31]:
try:
print("Beginning query and collection")
driver.maximize_window()
driver.implicitly_wait(5)
driver.get(search_url)
driver.implicitly_wait(10)
driver.save_screenshot("./data/query_results.png")
total_results(driver)
except:
print("Query failed")
total_pages_int = 1
total_results_int = 0
post_tracker = 1
page_tracker = 0
post_progress = widgets.IntProgress(
value=post_tracker,
min=0,
max=total_results_int,
description='Posts',
bar_style='', # 'success', 'info', 'warning', 'danger' or ''
style={'bar_color': 'maroon'},
orientation='horizontal'
)
page_progress = widgets.IntProgress(
value=page_tracker,
min=1,
max=total_pages_int,
description='Pages',
bar_style='', # 'success', 'info', 'warning', 'danger' or ''
style={'bar_color': 'maroon'},
orientation='horizontal'
)
file = open("./data/job_card.png", "rb")
image = file.read()
widgets.Image(
value=image,
format='png',
width=300,
height=400,
)
widgets.HBox([post_progress, page_progress])
try:
print("Analyzing first page of results")
page_tracker = 1
page_results(driver, page_number=page_tracker)
except:
print("Analysis failed")
try:
if total_pages_int > 1:
print(total_pages_int)
for page_number in total_pages_int:
page_progress = page_number
print("Page ", page_number)
pagination = int(page_number*25)
print(pagination)
driver.get(search_url + "&start=" + str(pagination))
page_results(driver, page_number=page_number)
except:
print("no")
Beginning query and collection 97 jobs found 3 pages Analyzing first page of results (42) devops engineer Jobs in united states | LinkedIn 25 jobs 0 results 25 cards 25 summaries Snippet dumped
2784419809 https://www.linkedin.com/jobs/view/2784419809/?eBP=CwEAAAF8_3WWb4D9WaF1_oJ3wJRnlMKnFbaf8J4Tl7_d8nu-L69HdGA5cTwgooVJHmfwZfLNs8bCC56sjoOaO8dO5Mf7FSirPKI8GuO7Wof1Ecv109uhayWW25MNJ9ktxm-leYACWdhtbTBRxoHPY3Gr08WBcXpD4RbpTSpeSh6yFGVUfwC345IUmPUC_1mSyiLc8OYE41IJ62cD3wgfHKZk1u84etaI78sqY_St7rY4xkGmkUR_gJLzotWbXgK1CP1NCEWsChBqGm5chSHJwObdHhlHhoSTViRql2_nkCMS6cY_U3DjbLLEKpFEgLsuf4TedVip0yTxpedb0Uw-mTS1cLJp5gCK9bG0UItTo6UzKwOAdbLrLPK1H86E&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=nLkHMCK5CXimlxiZwEE6iA%3D%3D&trackingId=OfeeIfAijcK8ZUyOlN0%2B9A%3D%3D&trk=flagship3_search_srp_jobs
/opt/conda/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py:392: UserWarning: find_element_by_* commands are deprecated. Please use find_element() instead
warnings.warn("find_element_by_* commands are deprecated. Please use find_element() instead")
2784419809 https://www.linkedin.com/jobs/view/2784419809/?eBP=CwEAAAF8_3WWb4D9WaF1_oJ3wJRnlMKnFbaf8J4Tl7_d8nu-L69HdGA5cTwgooVJHmfwZfLNs8bCC56sjoOaO8dO5Mf7FSirPKI8GuO7Wof1Ecv109uhayWW25MNJ9ktxm-leYACWdhtbTBRxoHPY3Gr08WBcXpD4RbpTSpeSh6yFGVUfwC345IUmPUC_1mSyiLc8OYE41IJ62cD3wgfHKZk1u84etaI78sqY_St7rY4xkGmkUR_gJLzotWbXgK1CP1NCEWsChBqGm5chSHJwObdHhlHhoSTViRql2_nkCMS6cY_U3DjbLLEKpFEgLsuf4TedVip0yTxpedb0Uw-mTS1cLJp5gCK9bG0UItTo6UzKwOAdbLrLPK1H86E&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=nLkHMCK5CXimlxiZwEE6iA%3D%3D&trackingId=OfeeIfAijcK8ZUyOlN0%2B9A%3D%3D&trk=flagship3_search_srp_jobs
2784419809 https://www.linkedin.com/jobs/view/2784419809/?eBP=CwEAAAF8_3WWb4D9WaF1_oJ3wJRnlMKnFbaf8J4Tl7_d8nu-L69HdGA5cTwgooVJHmfwZfLNs8bCC56sjoOaO8dO5Mf7FSirPKI8GuO7Wof1Ecv109uhayWW25MNJ9ktxm-leYACWdhtbTBRxoHPY3Gr08WBcXpD4RbpTSpeSh6yFGVUfwC345IUmPUC_1mSyiLc8OYE41IJ62cD3wgfHKZk1u84etaI78sqY_St7rY4xkGmkUR_gJLzotWbXgK1CP1NCEWsChBqGm5chSHJwObdHhlHhoSTViRql2_nkCMS6cY_U3DjbLLEKpFEgLsuf4TedVip0yTxpedb0Uw-mTS1cLJp5gCK9bG0UItTo6UzKwOAdbLrLPK1H86E&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=nLkHMCK5CXimlxiZwEE6iA%3D%3D&trackingId=OfeeIfAijcK8ZUyOlN0%2B9A%3D%3D&trk=flagship3_search_srp_jobs
2784419809 https://www.linkedin.com/jobs/view/2784419809/?eBP=CwEAAAF8_3WWb4D9WaF1_oJ3wJRnlMKnFbaf8J4Tl7_d8nu-L69HdGA5cTwgooVJHmfwZfLNs8bCC56sjoOaO8dO5Mf7FSirPKI8GuO7Wof1Ecv109uhayWW25MNJ9ktxm-leYACWdhtbTBRxoHPY3Gr08WBcXpD4RbpTSpeSh6yFGVUfwC345IUmPUC_1mSyiLc8OYE41IJ62cD3wgfHKZk1u84etaI78sqY_St7rY4xkGmkUR_gJLzotWbXgK1CP1NCEWsChBqGm5chSHJwObdHhlHhoSTViRql2_nkCMS6cY_U3DjbLLEKpFEgLsuf4TedVip0yTxpedb0Uw-mTS1cLJp5gCK9bG0UItTo6UzKwOAdbLrLPK1H86E&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=nLkHMCK5CXimlxiZwEE6iA%3D%3D&trackingId=OfeeIfAijcK8ZUyOlN0%2B9A%3D%3D&trk=flagship3_search_srp_jobs
Generate a list of post from that page¶
In [22]:
from IPython.display import display, HTML
import ipywidgets as widgets
with open("./data/page1.html", "r", encoding="utf-8") as f:
text = f.read()
soup = BeautifulSoup(text, "html.parser")
for link in soup.find_all("li", class_="jobs-search-results__list-item"):
title = link.find("a", class_="job-card-list__title").text.replace("\n", "").strip()
job_url = link.find("a", class_="job-card-list__title").get("href")
company = link.find("a", class_="job-card-container__company-name").text.replace("\n", "").strip()
company_url = link.find("a", class_="job-card-container__company-name").get("href")
apply_method = link.find("li", class_="job-card-container__apply-method").text.replace("\n", "").strip()
# job_id = link.get("data-job-id")
job_id = link.find("div", class_="job-card-container").get("data-job-id")
print(job_id)
print(apply_method)
print(title)
print(company)
print(job_url)
print(company_url)
html_content = link.prettify()
file = open("./data/test.html", "w")
snip = html_content
file.write(snip)
file.close()
# out = widgets.Output()
# display(out)
# out.append_display_data(HTML(html_content))
# time.sleep(5)
# out.clear_output()
# out.close()
# display(out)
2780717766 Apply easily REMOTE - Principal DevOps Engineer CyberCoders /jobs/view/2780717766/?eBP=CwEAAAF88-E5h3LV6w_qODzVoDXVTN-j2xaSNNLRxzpU1pJyfMRihOSygR0nkIUl-aKa6PuOdZ7RCoqu2cvbd807zsDp7nRjziRBS-k37dVkjgz56HR-I--nLkDe_4FPWqmLk14E-uXt9JDgisGxHx8TU_wDOx-RakHiSYOcYIlbX8sNVQK0L-8MytQAxVGGkeS2UHOXf7aLl6HPLK2iMJTKB9MfcLiuSLgirXEEWrE0EV_kdOsO6b_2nhBNUfRyvxeHA4gVucz9ykhIIgr_daGAFvPwEQNshm1hMnnyrph-5junWTm3cLrCLABjQkA4kq8I3n0Al_HNhjWuiBgBgSkb49rwoR282I9SLQlgb1QH06j7Yl1Pd9YKFf6D&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=hupAho4oD6T%2FjIvYuHKxtg%3D%3D&trk=flagship3_search_srp_jobs /company/21836/ 2735147039 Apply easily DevOps Engineer - REMOTE Kamis /jobs/view/2735147039/?eBP=CwEAAAF88-E5iBY3iAsubWzDHUKYbjRQvtRPJ2x8Z3Un190YBf_1NWJkwGJ8w8b9R_2YQtJON5ivyCgHdpwZE1fhO2IWfqFJgiQRXXWlna4X-0HiLIgL9sfZeYW5n_Rahy_omDKUKotmz7ZenEOLolFUtFIK6xo2MyV7DXYJ9w3Z2vI5pWeFDgfK3qjhb8JRQcI6gniF8fcVbxlWhdaOSl9J1UMvLgRKRl5pNsa1Tv9IcfLbTU_h3bxxVVppifnUFUcFLp6IX9ecSPBoU1RuMzmTkF6jYtfAaCH0veMFciXtRGHI0oG9zTysP2nCpJmQawNjlHglvs33X95o_kSl3p00Z5vPICTJ9FFoJCwjepqkZCLwW_fY_YAEmJAd&recommendedFlavor=TOP_APPLICANT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=Um26Zse8fPF63t%2BWHY9g2g%3D%3D&trk=flagship3_search_srp_jobs /company/2056370/ 2782110039 Apply easily Senior DevOps Engineer Jobot /jobs/view/2782110039/?eBP=CwEAAAF88-E5iOS8f_ZeKgAVYcm32bV5-TbwXRC95B8rapnFQAz2HALkHjR6UjA7uHrlohx5Z2I16hCnox-vX2N50jmZsalcnJNespQe60i0sKINlEodCrx14ArJXXUglDqHpsUoXzz8gOHsPwIWk-fhA28j363t1qd5sJ3x-_LTBNUoda22N1FwNzMB-cBuivneVvs-AvZRXvLHDWPWUXeE-ZzRpMQPtKbfhryb_t2fd_MbeQTXyC6gtTdj6nyitJSzDIZ7I5wE4T4CFEtbTpx47F_wN8HiBKdVWtVRC0qQRBtUPpjYHgyGt_5VAsWtsikHRr1-ejJUdNjF7IyWsGlspM745LMTC5nysH3Aht3vYo7OjjSegnPaMYLy&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=6%2Fe1NmoXuL23NAF2UhZZZw%3D%3D&trk=flagship3_search_srp_jobs /company/18860134/ 2693752134 Apply easily AWS DevOps Engineer Virtuosity Consulting /jobs/view/2693752134/?eBP=CwEAAAF88-E5iIpH3xmh16dgnK6ylrEtGjj4mSkC7OJn3XQeljUFBXUcmhuKX5v_5PpQmDx0QdplFJI3Lq30MwXCWpDyviwvVYHYM7_eANDHfhS31LGFIknUfek6GtN7QXNyCUsmEtAjnWzestrHhTekCCEGR2WbSwAr5raFmG0aBb7Ozr5KXwRa_7S95esWccAzxM3xmgq3aQZfs_ziEwzK7NAntplLeuo9pa_EmZ7R3yGBb7tcJMT5LRmZULL2fSGQ_gpAJumLZTS8W0Oy9SQ-s_3DG-fNp0bXuqmMTcl1pqbYHPu4OwIIv22aifQuzZERz4JSDFCSPJn98D9S7BXhcXNGcOKn7zsjMlHYbDWSitN7ywvzkTaOuVnRIDY&recommendedFlavor=TOP_APPLICANT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=SvVG2WDaJYS1TlMSMpdaPg%3D%3D&trk=flagship3_search_srp_jobs /company/1846727/ 2783837026 Apply easily DevOps/Platform Engineer Amdocs /jobs/view/2783837026/?eBP=JOB_SEARCH_ORGANIC&recommendedFlavor=SCHOOL_RECRUIT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=Ct4B1Hy2Dp66bI38nkniOA%3D%3D&trk=flagship3_search_srp_jobs /company/1539/ 2783546198 Apply easily Site Reliability Engineer - Engineering Operations (Remote) Alteryx /jobs/view/2783546198/?eBP=JOB_SEARCH_ORGANIC&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=j%2FwB%2BqhoZ%2B1WkP5Oisza0w%3D%3D&trk=flagship3_search_srp_jobs /company/903031/ 2760302709 Apply easily DevOps Engineer Connections of New York /jobs/view/2760302709/?eBP=CwEAAAF88-E5iL5UAL50mpRDfwE6PYReqAtcGmzRMRUS7UbBAUC2htMREDfKILt6j6CCmGlrnd99hC_H6fBmM8uRjhONjb5nTc7jXpZ3eJpN2BVxMlPcPF5PmQtYliff9F8SF6GquIh9i0V4AHaISnRNo8jsVz2LnCyD0A2NQM4ObiSHK3ZiUWn7smArbswn14UTX_ZI2zV9ulrm2JBMt4M4D4NdubK29VjquhPVuQYlaaA8CKx0UwFFmb1EMNo5cjSUQiQT2hJ5fbFguz4M4K-K4oH7sNufZVcrE6opPm0SBF0c2sRrZZ-r40whHmh7Gyc5Iuke2F12C6zY2u2RdPwQ6ceGZHFAH0ZQ_zar4g5vxjbx_8DFTMpAsIHeAUs&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=8c%2BhRCAo8hlBUI8Vnx745Q%3D%3D&trk=flagship3_search_srp_jobs /company/80305/ 2718556220 Apply easily DevOps Engineer Net2Source Inc. /jobs/view/2718556220/?eBP=CwEAAAF88-E5iJFcIdaV94_foPUVNqtpJSUOLTk66ED6xOYNshsYsTslXuUxvvx3h4QgtN8ZW6MCmhT9bXXWiZGZVWNPsf_YH8QRljWA57gltbPchlclZpbCaqAXe1ud7CKiVlrBKLq02L-rIHVF03CcrYQ3qFVwZKwEiRXMZaIEWsWwR-4U2ddOzLqW2YWePWImR6MBQMyIZ_gc5mxNEhV08PEsGUQBNQbEBcbhSe3LDic6rnFs8aUrxIWvW3a2weMz0FsFrRGZkyKbh28l1FW77PFXmz9JZu0d_kC1SXF7GhQb_l-g-J6MZhU0CxastWsI7Nx5aOnGbCem05dkuC4vSseieZAUxkty4uQZINmVyGKDlWc2Tdb8lDgnhN8&recommendedFlavor=TOP_APPLICANT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=E05ekIkd3DXiME%2BlRUFSBA%3D%3D&trk=flagship3_search_srp_jobs /company/226965/ 2706504732 Apply easily DevOps Engineer Sayari /jobs/view/2706504732/?eBP=CwEAAAF88-E5iM3FodKXYyBNCIepoCfUGwcI9AVAYqBRgjq1XMIB3d-yzGzfyO767ZrDB6zdhrCcRTh_g-q_Yc722tskuBn_j-bhavbaGHHGjK3Ne2CVtVZQ9PXYx6jS0tOSThQwlpTuT-iAnSg-Q9KySsphJ8XbWrDa6Wgiqmn_900ayE7tlXWkdxioG4VU1l9c8DkO_k6ep3EYNQBXN1LQ-D-20fhxTM6ghiKIP1zcmc6jbOBS7HwLTIvclYFHg-BaZFHQJvvZS904gJcp77evfZlCb8QjFa6BoZlNkkN-Gll3DuPXyv8fXS9Mb2qBjvgxDxvc9f0Nu_ylK8uHMmrpSVzpF8nNxg2iijvoU5pwqu_4eI7ihciCpA0woNU&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=al5w4FqKpRNzRnYjzI3MGg%3D%3D&trk=flagship3_search_srp_jobs /company/9414559/ 2780798768 Apply easily DevOps Engineer (US) Cloudbeds /jobs/view/2780798768/?eBP=CwEAAAF88-E5iPabJeFAseumSow48abBYVnk-6tjRKujbYN8AvG_Zov5stBzW_N22wRo99UdK1qvsO66IyZbj-Ic2cwiMBnzCp0exSA6I5sGtGeliTo5QY-lIOd3b_QMVEM3n0YBHL0YsSKHlmbNhXmWcyEhsSFUftlWvkXOi9FYupvhIhSAbnHmEbGRb9twf2_mjly-tf6B-fM7wlhiajyiLqqG_Oi0A5Yz2fNZxDccrwmpMxKIpDVqjigpFoiCcYNXbI4aeeR-FdsFOnNSzhJoKCHd2F4Yes38EgLYHWNFAAH3TyUrp96OpX5DhJgjrNz8NNEVICGt5-7c0icNj0qYm0Jd_CUYcm5TU5q_qVk1I4_Cs5SgQXLpSBofDAw&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=kw5HtBGeet4WftyP2TW7ww%3D%3D&trk=flagship3_search_srp_jobs /company/3091870/ 2780729459 Apply easily REMOTE Sr DevOps Engineer - Terraform, Ansible, AWS, Docker Optello /jobs/view/2780729459/?eBP=CwEAAAF88-E5iLlTJ8OZMm6RFGAYnhR4zivY6GfWoXKUwG1nvBzIYg-YYcPxOT3qEeBws8WE0dMjvrvNxngPlC2wo8wOAQcUbUoJZaxKwf3HgJKWdFfrIyBBzaX6cwjARp-RFMyBhUNLO1JtPexpICjRo2bH4pRpARCetMQQ1sNob9oxLU1HoqLbkiAWcCUYVmXpLLHLK9tJNPua_Z0WbRlT_baspe_PBhW8OFR86n9J2EPoROlAzfCtNCBZ0Lya75-BX4fRV4bo_d6yxIaNMiKdJwOC8_cz_1wEEIh4fMDKiIBXVTE6-SLJorVRWskbcWKdfAW2FlpxvFVyIaf0uyAmAxQ5oClYiPl0pwY2s9tGhCW_6k69ooHm3ZZVfD4&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=duhFYj7TSKMb2SDgRG4SHg%3D%3D&trk=flagship3_search_srp_jobs /company/52157487/ 2755121500 Apply easily DevOps Engineer Tykhe Inc /jobs/view/2755121500/?eBP=JOB_SEARCH_ORGANIC&recommendedFlavor=TOP_APPLICANT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=vebQURQb6xd8FEb0qXx66g%3D%3D&trk=flagship3_search_srp_jobs /company/76236090/ 2783851775 Apply easily DevOps Engineer Penn State University /jobs/view/2783851775/?eBP=JOB_SEARCH_ORGANIC&recommendedFlavor=SCHOOL_RECRUIT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=FGX17CBzhQ%2Fr2mlfKyEHPQ%3D%3D&trk=flagship3_search_srp_jobs /company/3657/ 2732627205 Apply easily Senior DevOps Engineer Integra Connect /jobs/view/2732627205/?eBP=CwEAAAF88-E5iN5aqWd8kAA_83gB5xxEVW8QRr_KvwdLIk86npkRf_wnHCwtXAObyLvez5PPCwkEGsni1jKvAt3vD-NWV7ACYyBiCUGvwhSYXZdU8h_y-yxO1WHjk2UnXUxC1UC5DIu3-dlnO9RYjUJFlAHwHdh-6jGJm4kkRqBYztP-i8_Fu7sGS2NXyhMzXHPhRzyZm0NkIOuplpNFsqwTVagpfKLL1X0MGN7h3Pjw2w9EIiRxvqNiCMT7LlRmaGQCycfRU7YwwFitkixPVkd1qUZZ3UsCHIbLZrcnbFJ2GeSywOOSBdjq54HQzcLVshacOJwH8zRifP2YgIlTrXnfFGDf0_Pm7cJjLBAqcT1-y0wnt2SdWfZAZe1WlbE&recommendedFlavor=TOP_APPLICANT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=8bfyInbYcWw8tmxJnIiLCg%3D%3D&trk=flagship3_search_srp_jobs /company/10619345/ 2787186475 Apply easily Remote Senior DevOps Engineer (Azure) Confidential /jobs/view/2787186475/?eBP=CwEAAAF88-E5iI8fNmSQmqM20hlCnfkGeYxJTYx7zaC3dGPqQ4KdWokBG8ONgqXxI7W3FXjPWJ_mHhIcYUQhPcuWb2SR_Mi95WVXmX0_3vfhy3Tfe0CEGMkL0CeTXC_HRu5oupXqGY-cOLrQMlVjL9cnsph_G6ah8NrNe4fAbG1KnpvFXLju6r3kwlnegJ_sLh7upwWJS-bi2wQdMyUtSEkVnFrZ9dUoBOG0cyV9Y8AfGpoMn1fxp2tb_ti63Cr5xJh7DDEoud6NHJEN1lA_IreHip_prY1KYflSMJZvecHOJFLCr9KSlWJgwDjUCWpF_rsgTGobDwEj0aSYqcQjN04BDFGD1FtIsgBYfvPyPryXK2uuwZj_iu5Aei5bi_Q&recommendedFlavor=IN_NETWORK&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=Gc%2FFu4%2BVqT3gDi26uqT1Zg%3D%3D&trk=flagship3_search_srp_jobs /company/18348487/ 2780764586 Apply easily DevOps Engineer ACL Digital /jobs/view/2780764586/?eBP=CwEAAAF88-E5iPPdbLM_ZNgQydP7BztBmKVbwHqMCyk_jckAXTLO0GL8uWihePiJroI_W9FT3Wo2RS9b8feB_UGfrYMJUJYNgg1aIDQBeeLkffN3vwKTH5_Pv1pDhafO9HarzKqmyfBCCz8vC5Dl68fD5IGNVr77sSZe_icfdHhRdZDwrv0E54kU8WuAS5hINH11-GQxoniHGdZ5FZ9Zf531Z7rmwMCMZrfQgAgKEvV3Bwl7wISUgjsGz9CGTFyGAQQ8kG7DcT0a0OudB-NHngarRleQ83L6UucKnIaS9FL8mHJK_gnbMXQ2vX0NzjaDbSfkRYxeV0prMx7vjlZ6rpdHv0wnb80FQ_Zi-EeBVhK5DmR0XDiE_G5hZg9x&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=AdqumJgFg8q2vjCV12C2cw%3D%3D&trk=flagship3_search_srp_jobs /company/67572051/ 2787442265 Apply easily Sr DevOps Engineer OtterBase /jobs/view/2787442265/?eBP=CwEAAAF88-E5iJUFFSvXv7lZRrUhWLkYEJFV-vc-QClHhCxT03JNtUNMeYNa0r1KFF88Zjexrh9FUVEe3jKXMv1Kjpj2IgcBaqOcdvMK0_tUdH14bXgMfx0qOWuRTsVh_4upB8A7X9COiJ3SPCuf7Re0_oohasNRY28s-uSFa3jKU9vBGkB1EgRfYJnhsZu-HxLbf_tIKqRbAztsfEpWnONwwGrCn5s5waQe4I3R_Rx1xEUekXro8t5kL7QcKPAlBpVAmW9g63JwE38gdDSV0yGwzBjUhJNsdrMDf3Vt11g1iAMHNq3s8545M9zskL1Lh0yHSyig2ZwGLsFLT6LQdRm1m_bvkiYuxTGQpvpWSMdYt757DSK6dkXIGdur5cY&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=lg4haq35SMLOmX8tWlNjpw%3D%3D&trk=flagship3_search_srp_jobs /company/35259/ 2787155582 Apply easily Sr. DevOps Engineer York Solutions, LLC /jobs/view/2787155582/?eBP=CwEAAAF88-E5iItqheXz5XS9BzUB1wtMoYi3XvjRVbtkewf0Z4x784h57m-5KLtX1W_qkyReeF162orVwljaCslW2yoao38u9w1ADLHSVGKSlXdAplsNRYbzeKspZWTyGoE9WzbSTa_5d-yRQdhDaOuRKnpPGFx5W33fJobvMNYruo0DWf8oB4G2EaCjWdSZOgkHkeDJMwaolfO_xp-ksrCLLmlwg5HeLiH6LD4sONPFmd3h2LHEG6pVkrNMSubemAQHxI1M7BfU59OXLTN5ryxABKZWUj-M1PncyeUIAWUX5GfqDAC5o3sltBCwxEaM1NEdFRin4aVI7diZrz5-CGrsmriSzaXCE0RxgVo40CJRmU4WA3IXLbzlx-1i&recommendedFlavor=SCHOOL_RECRUIT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=pdjD2zpjcOeGyn7wVmiGyQ%3D%3D&trk=flagship3_search_srp_jobs /company/43577/ 2781235811 Apply easily DevOps Engineer MATRIXX Software /jobs/view/2781235811/?eBP=JOB_SEARCH_ORGANIC&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=6A2DFMmwIgf7KE%2B9h8kS9g%3D%3D&trk=flagship3_search_srp_jobs /company/586602/ 2781214716 Apply easily DevOps Engineer InfoSoft Solutions /jobs/view/2781214716/?eBP=JOB_SEARCH_ORGANIC&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=xrUGgIzM%2F959cV%2F6DJxtcw%3D%3D&trk=flagship3_search_srp_jobs /company/67091998/ 2784675420 Apply easily AWS Cloud/DevOps Engineer (Remote) Top Stack /jobs/view/2784675420/?eBP=CwEAAAF88-E5iFugiyu0YEvo1zDc2a5gKoYFk-vPB7wae0QWpjlVz7a93ezJLQQVcIKr_pxG6Re1eDDnkdy3wh7QHfH_lzoQACQ_uVHBakJH_pqrTphky55sbpn7pCwRQSwjwHcquANoRzusODVgP4T2fLWb-xDfE6PMRv_Lqt6O6hAvecSTkLhBnWRkpd61LL0rW2WC0s_TSp19wMFRdLgVJh5X4MLvRUj6T7Q-4UQ1G2vQEoQvcd2p-_W9oeOVrMiRef-7Jyl9S812JNucM2rs5FdGteAIRki1e2G4IUN0mpJ9uRxEROrXiR6zJVrajm0w9NaXAEa1G7sOB5nxdwyIG-LNBd_OF5bREg2xW8rg8SCB36U347b_fEMjWrc&recommendedFlavor=PRE_SCREENING_QUESTIONS&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=TgqKAmmypxEx%2Fl51qJbkPA%3D%3D&trk=flagship3_search_srp_jobs /company/11400117/ 2787372749 Apply easily Product Operations/DevOps Engineer (Remote) Yoh, A Day & Zimmermann Company /jobs/view/2787372749/?eBP=CwEAAAF88-E5iNGvZOoJLSA-M68D_3dSU-Sn0KxaZUv_7uLb-TlQBdWGk5K_V_G9CTlyRWX4Q1Wbggt-1Gnu-7uxF_pzk9fE2anKqlZbgNX6Yqw5zacDTJH9qUkDjLACrhQq6NUXYMx4rI5d0DEESZne4exdRULf-vvOxzSyhGsOX2Vv3Srgjr77fqdrwEjLISkEwj410BmMFYVtqzuP_ZOTG4UOUW_tBtlJ-d1oT617v2vcpkO4QWDITGgR8nJBax9UgMkbU8QvlxpaL581KS8Xus1-nfbcLmic1ztDe32MUJJ3EfsdPnLgtpHIceFN6ZdDNmyG9l4yM1Lk-AVETsyakSeWDd1AzX5pP6iEV30PLFmXPNV3oH2QcEdwKIY&recommendedFlavor=SCHOOL_RECRUIT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=8GnAEfsiKDNx7CagfHTdAg%3D%3D&trk=flagship3_search_srp_jobs /company/6044/ 2783881473 Apply easily Sr DevOps Engineer Prudent Technologies and Consulting, Inc. /jobs/view/2783881473/?eBP=CwEAAAF88-E5iO3I3dgJhrJ-_X1mOGa8S4NN7zQTTnz7xkby5tdGCMnR7VWgQ3bKNpLszCT2tiktZqPAmJF3L4rZPimHFDqKNvgBbEa80vcsmABR6b4f3IRy-xhr1u3x61Xrom9pmQmxZazI0EBVnuV7a3PnjMTT8XXa4r-uRWHrz0ALL8bRKo_XEOOcj51D0TwHJxAwu-kmhH_RenCRRGEnWyNpIVIMX6UUGsL_Za9EBZwltDG9K5W1cBv3sKkV9xZBucOaohUsu63c_8T-qvP4IkafIe3VGL4W82qs_zbdOgFabRHL33LGmNcg9GB_IVy7mIw2wL_PbWXpPPDSKCLVV4VUmn6nIsfnLeny53m2yvB_uAlt8X_8xvi1OS0&recommendedFlavor=IN_NETWORK&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=a00KdRhjUFP2HAfiR19rNw%3D%3D&trk=flagship3_search_srp_jobs /company/347466/ 2711701471 Apply easily DevOps Engineer Patriot Talent Solutions /jobs/view/2711701471/?eBP=CwEAAAF88-E5iI4_QMaXh-TrA5LF88l660rbhejfAZujaNqwS2mEkMb93OfX-EUcTKeHKrc6DXtYLLbJRLuzB58L-RQ9zwCUCpp9UAoumtgsw8whceeMz6Q6vePZirE6mI8EZ2nYGl_7YFg-OG_igswDURu-2T-0m_rozeFWMscRqe_BgcJCHBfrawVDXAyNzR4nA9ZKanTv6IWShbcjxtDx6_lCM35hrER0wHq-BAOr3yx-bZ8x7V9D6z4q-weVdh1459BgCH7bxx0v1ZRL6VkMNKHa7aKfNkzdLCdZFeOXhNUKifYatlhkr9Bt81sLOunpGkSMBKIOBEyet3IzgMpTNSTbni4Vjz4r9J45hCH5eIwuB7jlyQMvjRns&recommendedFlavor=TOP_APPLICANT&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=EfEZJ8RE4PR8EnDLI9hQIQ%3D%3D&trk=flagship3_search_srp_jobs /company/5315104/ 2780736909 Apply easily Remote Azure DevOps Engineer Prodigy Resources /jobs/view/2780736909/?eBP=CwEAAAF88-E5iMvWKedI1HBMmPYJvJE-txCZYmolc52-ESQM_TuTUEcSpoVgJDa8yet0OoCPfASbQPkmf9W5sugfkG16aWgqFfxGDu8kqoi7waccOXBQ4nqnoWwOnI9dSIFBMomXdwimT0phPbj-amWvVyWzmsk9CxECsIswObrFqC3doZECCeUo3c2NubeIc4N6aS4-suie3_J2t-TP-2dIJmMlGhaT8QxpRkCBR0XUmI-nhrIf4SpfqQ2KYB7c_Q8iSbKVEkHAVzp37Eg-LxfhxzEdMMWvqGwaBAItpBynQBU3igjppYVBfB3p_x-Z12B9AzBuNPaYphnTJEF6Zmsz0w4cBf5kzm-SAmUHbYe0MQci-bhBG5SfC6ARjwo&recommendedFlavor=ACTIVELY_HIRING_COMPANY&refId=6F8LpXMenBJ5i7WYaBp2oA%3D%3D&trackingId=F2UUrVxSUWJ%2BMlnFpPWfew%3D%3D&trk=flagship3_search_srp_jobs /company/657475/
{warning}
In [ ]:
In [24]:
# driver.execute_script("arguments[0].click();", jobs[x])
# driver.save_screenshot("./data/post_click.png")
# for i in range(300, 3000, 100):
# driver.execute_script(
# "arguments[0].scrollTo(0, {})".format(i), details
# )
In [25]:
driver = webdriver.Remote(
command_executor="http://192.168.1.101:3148/webdriver", options=chrome_options
)
def auto_apply(driver, job_post):
"""This function submits the application for the job add found"""
temp = []
print("You are applying to the position of: ", job_post.text)
temp = job_post
try:
temp = job_post
temp.click()
time.sleep(2)
jobs_details = driver.find_elements_by_class_name("jobs-details__main-content")
snippet = jobs_details.save_screenshot("./data/jobs_details.png")
except:
print("You already applied to this job, go to next...")
pass
# click on the easy apply button, skip if already applied to the position
try:
in_apply = driver.find_element_by_xpath(
"//button[@data-control-name='jobdetails_topcard_inapply']",
)
in_apply.click()
except NoSuchElementException:
print("You already applied to this job, go to next...")
pass
time.sleep(1)
# try to submit if submit application is available...
try:
submit = driver.find_element_by_xpath(
"//button[@data-control-name='submit_unify']",
)
submit.send_keys(Keys.RETURN)
# ... if not available, discard application and go to next
except:
print("You already applied to this job, go to next...")
# except NoSuchElementException:
# print("Not direct application, going to next...")
# try:
# discard = driver.find_element_by_xpath(
# "//button[@data-test-modal-close-btn]",
# )
# discard.send_keys(Keys.RETURN)
# time.sleep(1)
# discard_confirm = driver.find_element_by_xpath(
# "//button[@data-test-dialog-primary-btn]",
# )
# discard_confirm.send_keys(Keys.RETURN)
# time.sleep(1)
# except NoSuchElementException:
# pass
time.sleep(1)
search_url = "https://www.linkedin.com/jobs/search/?f_AL=true&f_JT=C%2CF&f_TPR=r86400&f_WT=2&geoId=103644278&keywords=devops%20engineer&location=united%20states"
try:
login_linkedin()
except:
print("Login failed")
try:
driver.get(search_url)
except:
print("Search failed")
jobs_details = driver.find_elements_by_class_name("jobs-details__main-content")
# snippet = jobs_details[0].screenshot("./data/jobs_details.png")
# snippet = driver.save_screenshot("./data/jobs_details.png")
satellite_list = driver.find_elements_by_class_name(
"occludable-update",
)
for satellite in satellite_list:
driver.find_element_by_link_text(satellite).click()
# print(len(results_ext))
# # for result_ext in results_ext:
# for x in range(len(results_ext)):
# # for x in range(4):
# # if results_ext[x].is_displayed():
# # print(result_ext)
# # hover_ext = ActionChains(driver).move_to_element(results_ext[x])
# # hover_ext.perform()
# titles_ext = results_ext[x].find_elements_by_class_name(
# "artdeco-entity-lockup__title",
# )
# print(len(titles_ext))
# for y in range(len(titles_ext)):
# # for title_ext in titles_ext:
# auto_apply(driver, titles_ext[y])
signing in
/tmp/ipykernel_421/2135782259.py:72: DeprecationWarning: find_elements_by_* commands are deprecated. Please use find_elements() instead
jobs_details = driver.find_elements_by_class_name("jobs-details__main-content")
/tmp/ipykernel_421/2135782259.py:79: DeprecationWarning: find_elements_by_* commands are deprecated. Please use find_elements() instead
satellite_list = driver.find_elements_by_class_name(
/tmp/ipykernel_421/2135782259.py:84: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
driver.find_element_by_link_text(satellite).click()
--------------------------------------------------------------------------- InvalidArgumentException Traceback (most recent call last) /tmp/ipykernel_421/2135782259.py in <module> 82 83 for satellite in satellite_list: ---> 84 driver.find_element_by_link_text(satellite).click() 85 # print(len(results_ext)) 86 # # for result_ext in results_ext: /opt/conda/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py in find_element_by_link_text(self, link_text) 560 stacklevel=2, 561 ) --> 562 return self.find_element(by=By.LINK_TEXT, value=link_text) 563 564 def find_elements_by_link_text(self, text) -> WebElement: /opt/conda/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py in find_element(self, by, value) 1236 value = '[name="%s"]' % value 1237 -> 1238 return self.execute(Command.FIND_ELEMENT, { 1239 'using': by, 1240 'value': value})['value'] /opt/conda/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params) 416 response = self.command_executor.execute(driver_command, params) 417 if response: --> 418 self.error_handler.check_response(response) 419 response['value'] = self._unwrap_value( 420 response.get('value', None)) /opt/conda/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response) 241 alert_text = value['alert'].get('text') 242 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here --> 243 raise exception_class(message, screen, stacktrace) 244 245 def _value_or_default(self, obj: Mapping[_KT, _VT], key: _KT, default: _VT) -> _VT: InvalidArgumentException: Message: invalid argument: 'value' must be a string (Session info: headless chrome=93.0.4577.0) Stacktrace: #0 0x559dbc2587b9 <unknown> #1 0x559dbc1f89f3 <unknown> #2 0x559dbbf3e003 <unknown> #3 0x559dbbf71e08 <unknown> #4 0x559dbbfa43b4 <unknown> #5 0x559dbbf8f8dd <unknown> #6 0x559dbbfa242c <unknown> #7 0x559dbbf8f7a3 <unknown> #8 0x559dbbf66deb <unknown> #9 0x559dbbf67fe5 <unknown> #10 0x559dbc224ed3 <unknown> #11 0x559dbc23441e <unknown> #12 0x559dbc23412b <unknown> #13 0x559dbc2347e2 <unknown> #14 0x559dbc225edb <unknown> #15 0x559dbc234a55 <unknown> #16 0x559dbc219c7b <unknown> #17 0x559dbc24a508 <unknown> #18 0x559dbc24a692 <unknown> #19 0x559dbc264bec <unknown> #20 0x7fad9b7cb609 start_thread #21 0x7fad9b271293 clone
In [ ]:
xpath=//main[@id='main-content']/section[2]/ul/li[5]/div/a
In [26]:
import ipywidgets as widgets
# def page_widget(current_page, max_page):
pw = widgets.IntProgress(
value=3,
min=1,
max=6,
description='Pages',
bar_style='', # 'success', 'info', 'warning', 'danger' or ''
style={'bar_color': 'maroon'},
orientation='horizontal'
)
IntProgress(value=3, description='Pages', max=6, min=1, style=ProgressStyle(bar_color='maroon'))
In [27]:
display(pw)
IntProgress(value=3, description='Pages', max=6, min=1, style=ProgressStyle(bar_color='maroon'))
In [ ]: