Selenium получи картинку в браузере - PullRequest
1 голос
/ 02 апреля 2020

Я новичок в 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") Что это значит ?

Спасибо!

1 Ответ

1 голос
/ 02 апреля 2020

Используйте WebDriverWait для ожидания элемента, используйте метод .frame_to_be_available_and_switch_to_it для переключения iframe

Попробуйте следующий код:

driver.get("http://sistemas.cvm.gov.br/?fundosreg")
WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.NAME, 'Main')))
img = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#Table1 img')))
src = img.get_attribute('src')
urllib.request.urlretrieve(src, "captcha.jpeg")

Вам необходим следующий импорт:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

Но ваш другой URL-адрес: http://preco.anp.gov.br/include/Resumo_Por_Estado_Index.asp, элемент капчи отсутствует в iframe. Это селектор:

By.CSS_SELECTOR : table img

Пожалуйста, используйте его с кодом выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...