我正在尝试抓取 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)
我感谢任何建议。
答案 0 :(得分:1)
我认为该站点阻止此下拉菜单启用详细信息。所以问题甚至不在于您的代码,而在于您以机器人的身份打开网站。
我对其进行了调试,但从未启用过此字段(可能只有一次),即使在选择了汽车制造商之后也是如此。它只是保持禁用
window.location.href
这段代码的作用:
另请注意,我摆脱了 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)
代码的其他部分保持不变。