142 lines
6.0 KiB
Plaintext
142 lines
6.0 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"from selenium import webdriver\n",
|
|
"from selenium.webdriver.common.keys import Keys\n",
|
|
"from selenium.webdriver.support.select import Select\n",
|
|
"from selenium.webdriver.common.by import By\n",
|
|
"from selenium.webdriver.support.ui import WebDriverWait\n",
|
|
"from selenium.webdriver.support import expected_conditions as EC\n",
|
|
"from selenium.webdriver.common.action_chains import ActionChains\n",
|
|
"import random\n",
|
|
"from selenium.common.exceptions import NoSuchElementException\n",
|
|
"from selenium.webdriver.common.keys import Keys\n",
|
|
"from bs4 import BeautifulSoup as b\n",
|
|
"import time\n",
|
|
"from selenium.common.exceptions import ElementClickInterceptedException\n",
|
|
"import winsound"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"browser = webdriver.Firefox(executable_path=\"C:/Users/unknown/Desktop/projects/poshmark/geckodriver\")\n",
|
|
"wait = WebDriverWait(browser, 30)\n",
|
|
"browser.get('https://poshmark.com/login')\n",
|
|
"usename = browser.find_element_by_id('login_form_username_email')\n",
|
|
"usename.send_keys('SpeanutButter')\n",
|
|
"psw = browser.find_element_by_id('login_form_password')\n",
|
|
"psw.send_keys('***REMOVED***')\n",
|
|
"iframe = 'default value'\n",
|
|
"page_number = list(range(1,18))\n",
|
|
"base_url = 'https://poshmark.com/closet/speanutbutter?availability=available&sort_by=price_desc&all_size=true&max_id='\n",
|
|
"\n",
|
|
"def reCaptcha_finder(): # Still not working. Works on the first recaptcha popup but not second one for some reason\n",
|
|
" global iframe\n",
|
|
" time.sleep(4)\n",
|
|
" iframes = browser.find_elements_by_tag_name('iframe')\n",
|
|
" for frame in iframes:\n",
|
|
" if not iframe in iframes:\n",
|
|
" browser.switch_to.frame(frame)\n",
|
|
" try:\n",
|
|
" browser.find_element_by_xpath('//label[text()=\"I\\'m not a robot\"]')\n",
|
|
" winsound.Beep(540, 1000)\n",
|
|
" iframe = frame\n",
|
|
" input('Complete reCaptcha then press \"enter\" to continue')\n",
|
|
" browser.switch_to.default_content()\n",
|
|
" break\n",
|
|
" except NoSuchElementException:\n",
|
|
" browser.switch_to.default_content()\n",
|
|
"\n",
|
|
"psw.submit()\n",
|
|
"\n",
|
|
"reCaptcha_finder()\n",
|
|
"\n",
|
|
"wait.until(EC.presence_of_element_located((By.XPATH, \"//title[text()='Feed - Poshmark']\")))\n",
|
|
"\n",
|
|
"\n",
|
|
"for page in page_number:\n",
|
|
" \n",
|
|
" browser.get(base_url+str(page))\n",
|
|
" input('press \"enter\" to continue')\n",
|
|
"\n",
|
|
" html = browser.page_source\n",
|
|
" soup = b(html, \"lxml\")\n",
|
|
"\n",
|
|
" list_titles = soup.find_all('a', {'class': 'title'})\n",
|
|
" active_listings = soup.find_all('i', {'class': \"icon share-gray\"})\n",
|
|
" print(len(active_listings))\n",
|
|
" container = browser.find_elements_by_xpath(\"//div[@id='tiles-con']/div\")\n",
|
|
" i = -1\n",
|
|
" share_to = input('share to followers (F) or share to party (P)?: ')\n",
|
|
"\n",
|
|
" for divs in container:\n",
|
|
" i += 1\n",
|
|
" wait.until(EC.presence_of_element_located((By.XPATH, \".//i[@class = 'icon share-gray']\")))\n",
|
|
" try:\n",
|
|
" if divs.find_element_by_xpath(\".//i[@class = 'icon inventory-tag not-for-sale-tag']\"):\n",
|
|
" pass\n",
|
|
" except NoSuchElementException:\n",
|
|
" try:\n",
|
|
" if divs.find_element_by_xpath(\".//i[@class = 'icon inventory-tag sold-tag']\"):\n",
|
|
" pass\n",
|
|
" except NoSuchElementException:\n",
|
|
" share = divs.find_element_by_xpath(\".//i[@class = 'icon share-gray']\")\n",
|
|
" time.sleep(random.uniform(.6, 1.2))\n",
|
|
" try:\n",
|
|
" share.click()\n",
|
|
" # reCaptcha_finder() # Might only need reCaptcha_finder() here and not afterwards or the other way around. Pay attention to where the recaptcha occurs\n",
|
|
" if share_to == 'F':\n",
|
|
" wait.until(EC.presence_of_element_located((By.XPATH, \"//span[text()='To My Followers']\")))\n",
|
|
" share = browser.find_element_by_xpath(\"//span[text()='To My Followers']\")\n",
|
|
" time.sleep(random.uniform(.6, 1.2))\n",
|
|
" share.click()\n",
|
|
" reCaptcha_finder()\n",
|
|
" print(i)\n",
|
|
" title = list_titles[i].get_text()\n",
|
|
" print(title)\n",
|
|
" if share_to == 'P':\n",
|
|
" wait.until(EC.presence_of_element_located((By.XPATH, \"//*[contains(text(), 'Happening Now')]\")))\n",
|
|
" share = browser.find_element_by_xpath(\"//*[contains(text(), 'Happening Now')]\")\n",
|
|
" time.sleep(random.uniform(.6, 1.2))\n",
|
|
" share.click()\n",
|
|
" reCaptcha_finder()\n",
|
|
" print(i)\n",
|
|
" title = list_titles[i].get_text()\n",
|
|
" print(title)\n",
|
|
" except ElementClickInterceptedException:\n",
|
|
" pass\n"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "scrapers",
|
|
"language": "python",
|
|
"name": "scrapers"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.8.3"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|