选择第一个下拉列表后,Python Selenium 无法选择相关的第二个下拉列表

时间:2021-05-21 22:10:37

标签: python selenium web-scraping drop-down-menu selenium-chromedriver

我正在尝试抓取 https://www.autotrader.com/model-information 并获取下拉值的所有组合模型(例如 Audi-a4、Audi-a6 等)。

我可以毫无问题地单击并从第一个下拉列表(汽车制造下拉列表)中选择值。但是当我尝试单击并选择第二个下拉列表(模型下拉列表)中的值时,会出现 TimeoutException 错误。

[像这样的错误][1] [1]:https://i.stack.imgur.com/mLM5h.png

第二个下拉菜单似乎无法点击,因此在使用 chromedriver 时无法显示选项值。当我浏览网站并自己点击第一个下拉列表时,第二个下拉列表立即变得可点击,并且所有值都显示在下拉列表中。

我不知道如何解决这个问题,因为在选择第一个下拉列表的值后,url、ID、XPATH 没有任何变化。

可能与防阻塞有关。也许该网站识别出我是机器人并阻止我抓取。

这是我的代码:

driver = webdriver.Chrome(executable_path='/opt/anaconda3/bin/chromedriver')   
 ### paste chromedriver path as executable_path here
driver.maximize_window()
url = "https://www.autotrader.com/model-information" 
driver.get(url)

makelist=[]
modellist=[]
#### First work with the drop down menus with car makes 
driver.find_element_by_xpath('//*[@id="makeCode"]').click()
make = driver.find_elements_by_xpath('//*[@id="makeCode"]/optgroup[@label="All Makes"]/option')
#### Loop through all makes in the drop down menus
for makeele in make:
    makelist.append(makeele.get_attribute('text'))
    makeele.click()
    time.sleep(3)
    
    #### Work with the drop down menus with car models of specific make
    wait = WebDriverWait(driver, 20)
    wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="ModelCode"]'))).click()
    model = driver.find_elements_by_xpath('//*[@id="ModelCode"]/optgroup[2]/option')
    #### Loop through all models in the drop down menus
    for modelele in model:
        modellist.append(modelele.get_attribute('text'))
        modelele.click()
        time.sleep(3)

我感谢任何建议。

2 个答案:

答案 0 :(得分:1)

我认为该站点阻止此下拉菜单启用详细信息。所以问题甚至不在于您的代码,而在于您以机器人的身份打开网站。

我对其进行了调试,但从未启用过此字段(可能只有一次),即使在选择了汽车制造商之后也是如此。它只是保持禁用

window.location.href

这段代码的作用:

  1. 点击第一个下拉菜单
  2. 选择第一个选项 (Acura)
  3. 等待模型下拉菜单并尝试点击它。 如果有人能找到机器人检测的解决方法,我可以进一步开发它。

另请注意,我摆脱了 any time.sleep() 并使用了显式等待。

附言我建议把大问题分解成小问题,一个一个地解决。

看到自己被屏蔽了,本来不想先回答的,最后还是决定补充一些建议。

答案 1 :(得分:0)

我想出了如何解决这个问题。

无法点击第二个下拉菜单的原因是网站检测到我是爬虫并阻止我。我的方法是使用真实的 chrome 网站,而不是使用模拟。

## Generate changing userAgent to prevent block
cmd1  = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
cmd2 = ' --remote-debugging-port=9222'
subprocess.Popen([cmd1, cmd2])
time.sleep(3)
options = Options()
ua = UserAgent()
userAgent = ua.random
print(userAgent)
options.add_argument(f'user-agent={userAgent}')
options.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
driver = webdriver.Chrome(options = options, executable_path='/opt/anaconda3/bin/chromedriver')    ### paste chromedriver path as executable_path here
driver.maximize_window()
url = "https://www.autotrader.com/model-information" 
driver.get(url)

代码的其他部分保持不变。

相关问题