Selenium 在浏览器中获取验证码图像
Selenium get captcha image in browser
我对 Selenium 和网络抓取完全陌生,现在我在验证码方面遇到了麻烦。
我正在尝试执行此 link 中评论的程序:
但进展不顺利。
第一个问题
我的第一个问题是关于 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")
基本上我只改了link。但是不知道xpath写的对不对,怎么写。在 "" 中使用 [2]
听起来不错,在我提到的 link 中就是这样使用的,但是当我尝试在 response.xpath 中复制它时它不起作用scrapy shell 会话:response.xpath(".//img[2]")
。必须这样:response.xpath(".//img")[2]
我的 link 中的验证码很难被捕获,因为相应的 img 标签没有任何 id 或 class 或其他任何东西。另外,它是一种 .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")
这是什么意思?
谢谢!
使用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
请用上面的代码实现。
我对 Selenium 和网络抓取完全陌生,现在我在验证码方面遇到了麻烦。
我正在尝试执行此 link 中评论的程序:
但进展不顺利。
第一个问题
我的第一个问题是关于 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")
基本上我只改了link。但是不知道xpath写的对不对,怎么写。在 "" 中使用 [2]
听起来不错,在我提到的 link 中就是这样使用的,但是当我尝试在 response.xpath 中复制它时它不起作用scrapy shell 会话:response.xpath(".//img[2]")
。必须这样:response.xpath(".//img")[2]
我的 link 中的验证码很难被捕获,因为相应的 img 标签没有任何 id 或 class 或其他任何东西。另外,它是一种 .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")
这是什么意思?
谢谢!
使用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
请用上面的代码实现。