Saya mencoba membuat skrip untuk mengurai nomor bagian yang berbeda dari halaman web menggunakan permintaan. Jika Anda memeriksa tautan ini dan klik tab Product list, Anda akan melihat nomor bagian.

This image

Mewakili di mana nomor bagian berada.

Saya sudah mencoba dengan:

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())

Ketika saya menjalankan skrip di atas, saya mendapatkan hasil berikut:

{'isRedirect': True, 'url': '../../camosStatic/Exception.html'}

Bagaimana saya bisa mengambil nomor bagian dari situs itu menggunakan permintaan?

Dalam kasus Selenium, saya mencoba seperti di bawah ini untuk mengambil nomor bagian tetapi tampaknya skrip tidak dapat mengklik tab daftar produk jika saya mengeluarkan penundaan hardcoded darinya. Mengingat bahwa saya tidak ingin melakukan penundaan hardcode di dalam skrip.

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)
4
MITHU 22 Desember 2020, 07:20

2 jawaban

Jawaban Terbaik

Kesulitan bagi pengemudi adalah mengklik tombol 'Daftar produk' sehingga saya menemukan solusi:

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()

Dengan cara ini pengemudi mengklik tombol 'Daftar Produk' sampai membuka jendela yang berisi nomor bagian dan Anda harus menunggu kurang dari 10 detik seperti dalam kode Anda dengan waktu tidur hardcoded

1
marco 27 Desember 2020, 23:07

Untuk mengambil nomor bagian dari laman web menggunakan Selenium Anda perlu:

  • Ajak WebDriverWait untuk object frame akan tersedia dan beralih ke sana.

  • Buat WebDriverWait untuk yang diinginkan elemen agar dapat diklik dan klik Terima semua cookie.

  • Beralih kembali ke default_content()< /a>

  • Buat WebDriverWait agar frame yang diinginkan tersedia dan beralih untuk itu.

  • Ajak WebDriverWait untuk staleness_of() dari elemen basi.

  • Klik tab dengan teks sebagai Daftar produk menggunakan execute_script().

  • Anda dapat menggunakan Strategi Pencari Lokasi berikut:

    driver.get('https://www.festo.com/cat/en-id_id/products_ADNH')
    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME,"object")))
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.btn.btn-primary#accept-all-cookies"))).click()
    driver.switch_to.default_content()
    WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#CamosIFId")))
    WebDriverWait(driver, 20).until(EC.staleness_of(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[text()='Product list']")))))
    driver.execute_script("arguments[0].click();", WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='Product list']"))))
    print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='ah']/img//following::div[2]")))])
    driver.quit()
    
  • Catatan : Anda harus menambahkan impor berikut :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Keluaran Konsol:

    ['539691', '539692', '539693', '539694']
    

Referensi

Anda dapat menemukan beberapa diskusi yang relevan di:

1
DebanjanB 26 Desember 2020, 06:59