Я новичок в Selenium и веб-скрейпинге, и теперь у меня проблемы с капчами.
Я пытаюсь выполнить процедуры, прокомментированные в этой ссылке:
Selenium загружает изображение капчи, отличное от изображения в браузере а>
Но это не идет хорошо.
Первая проблема
Моя первая проблема связана с селектором xpath. Во-первых, я попробовал этот код:
from selenium import webdriver
import urllib.request
driver = webdriver.Chrome()
driver.get("http://sistemas.cvm.gov.br/?fundosreg")
# Change frame.
driver.switch_to.frame("Main")
# Download image/captcha.
img = driver.find_element_by_xpath(".//*img[2]")
src = img.get_attribute('src')
urllib.request.urlretrieve(src, "captcha.jpeg")
В общем, я только ссылку поменял. Но я не знаю, правильно ли написан xpath, и как мне его написать. Использование [2]
внутри звучит хорошо, и это использовалось таким образом в упомянутой мной ссылке, но это не работает, когда я пытаюсь воспроизвести его в response.xpath в сеансе scrapy-шелла: response.xpath(".//img[2]")
. Должно быть так: response.xpath(".//img")[2]
Капчу в моей ссылке трудно уловить, потому что соответствующий тег img не имеет ни идентификатора, ни класса, ни чего-либо еще. Кроме того, это формат .asp, и я не знаю, что с этим делать.
Вторая проблема Затем я попробовал этот код, который также появлялся в других подобных поисковых запросах.
from PIL import Image
from selenium import webdriver
def get_captcha(driver, element, path):
# now that we have the preliminary stuff out of the way time to get that image :D
location = element.location
size = element.size
# saves screenshot of entire page
driver.save_screenshot(path)
# uses PIL library to open image in memory
image = Image.open(path)
left = location['x']
top = location['y'] + 140
right = location['x'] + size['width']
bottom = location['y'] + size['height'] + 140
image = image.crop((left, top, right, bottom)) # defines crop points
image.save(path, 'png') # saves new cropped image
driver = webdriver.Chrome()
driver.get("http://preco.anp.gov.br/include/Resumo_Por_Estado_Index.asp")
# change frame
driver.switch_to.frame("Main")
# download image/captcha
#img = driver.find_element_by_xpath(".//*[@id='trRandom3']/td[2]/img")
img = driver.find_element_by_xpath(".//*img[2]")
get_captcha(driver, img, "captcha.png")
Опять же, у меня проблемы с xpath, но есть другая проблема:
Traceback (most recent call last):
File "seletest2.py", line 27, in <module>
driver.switch_to.frame("Main")
File "/home/seiji/crawlers_env/lib/python3.6/site-packages/selenium/webdriver/remote/switch_to.py", line 87, in frame
raise NoSuchFrameException(frame_reference)
selenium.common.exceptions.NoSuchFrameException: Message: Main
Проблема именно в этой строчке: driver.switch_to.frame("Main")
Что это значит?
Благодарю вас!