요청을 사용하여 웹 페이지에서 다른 부품 번호를 구문 분석하는 스크립트를 만들려고합니다. 이 링크 를 확인하고 Product list
탭을 클릭 하면 부품 번호가 표시됩니다.
부품 번호가있는 곳을 나타냅니다.
나는 시도했다 :
import requests
link = 'https://www.festo.com/cat/en-id_id/products_ADNH'
post_url = 'https://www.festo.com/cfp/camosHTML5Client/cH5C/HRQ'
payload = {"q":4,"ReqID":21,"focus":"f24~v472_0","scroll":[],"events":["e468~12~0~472~0~4","e468_0~6~472"],"ito":22,"kms":4}
with requests.Session() as s:
s.headers['user-agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
s.headers['referer'] = 'https://www.festo.com/cfp/camosHTML5Client/cH5C/go?q=2'
s.headers['content-type'] = 'application/json; charset=UTF-8'
r = s.post(post_url,data=payload)
print(r.json())
위의 스크립트를 실행하면 다음과 같은 결과가 나타납니다.
{'isRedirect': True, 'url': '../../camosStatic/Exception.html'}
요청을 사용하여 해당 사이트에서 부품 번호를 어떻게 가져올 수 있습니까?
셀레늄의 경우 아래처럼 부품 번호를 가져 오려고했는데 하드 코딩 된 딜레이를 제거하면 스크립트가 제품 목록 탭을 클릭 할 수없는 것 같습니다. 스크립트 내에서 하드 코딩 된 지연을 원하지 않는다는 점을 감안할 때.
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
link = 'https://www.festo.com/cat/en-id_id/products_ADNH'
with webdriver.Chrome() as driver:
driver.get(link)
wait = WebDriverWait(driver,15)
wait.until(EC.frame_to_be_available_and_switch_to_it(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "object")))))
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#btn-group-cookie > input[value='Accept all cookies']"))).click()
driver.switch_to.default_content()
wait.until(EC.frame_to_be_available_and_switch_to_it(wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "iframe#CamosIFId")))))
time.sleep(10) #I would like to get rid of this hardcoded delay
item = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "[id='r17'] > [id='f24']")))
driver.execute_script("arguments[0].click();",item)
for elem in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[data-ctcwgtname='tabTable'] [id^='v471_']")))[1:]:
print(elem.text)
드라이버의 어려움은 '제품 목록'버튼을 클릭하여 해결책을 찾았습니다.
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.common.exceptions import TimeoutException, StaleElementReferenceException
from selenium import webdriver
import time
class NoPartsNumberException(Exception):
pass
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
driver.get("https://www.festo.com/cat/en-id_id/products_ADNH")
wait.until(ec.frame_to_be_available_and_switch_to_it(wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR, "object")))))
wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, "#btn-group-cookie > input[value='Accept all cookies']"))).click()
driver.switch_to.default_content()
wait.until(ec.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[@name='CamosIF']")))
endtime = time.time() + 30
while True:
try:
if time.time() > endtime:
raise NoPartsNumberException('No parts number found')
product_list = wait.until(ec.element_to_be_clickable((By.XPATH, "//div[@id='f24']")))
product_list.click()
part_numbers_elements = wait.until(ec.visibility_of_all_elements_located((By.XPATH, "//div[contains(@id, 'v471')]")))
break
except (TimeoutException, StaleElementReferenceException):
pass
part_numbers = [p.text for p in part_numbers_elements[1:]]
print(part_numbers)
driver.close()
이런 식으로 드라이버는 부품 번호가 포함 된 창이 열릴 때까지 '제품 목록'버튼을 클릭하고 하드 코딩 된 시간 휴면 상태로 코드에서와 같이 10 초 미만으로 기다려야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다