2016-04-15 13 views
5

Tôi đang cố gắng tải xuống hình ảnh xác thực bằng Selenium, tuy nhiên tôi đang tải xuống hình ảnh khác với hình ảnh được hiển thị trong trình duyệt. Nếu tôi cố gắng tải xuống lại hình ảnh, mà không thay đổi trình duyệt, tôi sẽ nhận được một hình khác.Selen tải xuống hình ảnh xác thực khác với hình ảnh trong trình duyệt

Mọi suy nghĩ?

from selenium import webdriver 
import urllib 

driver = webdriver.Firefox() 
driver.get("http://sistemas.cvm.gov.br/?fundosreg") 

#Change frame 
driver.switch_to.frame("Main") 


#Download image/captcha 
img = driver.find_element_by_xpath(".//*[@id='trRandom3']/td[2]/img") 
src = img.get_attribute('src') 
urllib.request.urlretrieve(src, "captcha.jpeg") 
+0

Src cho ảnh không nhất thiết (và có lẽ không) tệp trên đĩa nhưng có khả năng là ảnh được tạo động. Mỗi khi điểm cuối được yêu cầu, một hình ảnh mới được tạo và "câu trả lời" cho CAPTCHA được lưu trong phiên của bạn. – sberry

Trả lời

9

Bởi vì liên kết của hình ảnh của src mang đến cho bạn một hình ảnh Captcha mới ngẫu nhiên một khi bạn mở liên kết đó!

Thay vì tải xuống tệp từ hình ảnh src, bạn có thể chụp ảnh màn hình để tải xuống ảnh trong trình duyệt. Tuy nhiên, bạn cần phải tải về Pillow (pip install Pillow) và sử dụng nó như một cách đề cập trong this answer:

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, 'jpeg') # saves new cropped image 


driver = webdriver.Firefox() 
driver.get("http://sistemas.cvm.gov.br/?fundosreg") 

# change frame 
driver.switch_to.frame("Main") 

# download image/captcha 
img = driver.find_element_by_xpath(".//*[@id='trRandom3']/td[2]/img") 
get_captcha(driver, img, "captcha.jpeg") 



driver = webdriver.Firefox() 
driver.get("http://sistemas.cvm.gov.br/?fundosreg") 

# change frame 
driver.switch_to.frame("Main") 

# download image/captcha 
img = driver.find_element_by_xpath(".//*[@id='trRandom3']/td[2]/img") 
get_captcha(driver, img, "captcha.jpeg") 

(Lưu ý rằng tôi đã thay đổi chút code để nó có thể hoạt động trong trường hợp của bạn.)

+1

Nó hoạt động !! Cảm ơn nhiều!! – fmarques

8

Bạn có thể lấy hình ảnh được hiển thị của captacha bằng một đoạn Javascript. Nó nhanh hơn chụp và cắt ảnh chụp màn hình:

import base64 
from selenium import webdriver 

driver = webdriver.Firefox() 
driver.set_script_timeout(10) 

driver.get("http://sistemas.cvm.gov.br/?fundosreg") 

driver.switch_to.frame("Main") 

# find the captcha element 
ele_captcha = driver.find_element_by_xpath("//img[contains(./@src, 'RandomTxt.aspx')]") 

# get the captcha as a base64 string 
img_captcha_base64 = driver.execute_async_script(""" 
    var ele = arguments[0], callback = arguments[1]; 
    ele.addEventListener('load', function fn(){ 
     ele.removeEventListener('load', fn, false); 
     var cnv = document.createElement('canvas'); 
     cnv.width = this.width; cnv.height = this.height; 
     cnv.getContext('2d').drawImage(this, 0, 0); 
     callback(cnv.toDataURL('image/jpeg').substring(22)); 
    }, false); 
    ele.dispatchEvent(new Event('load')); 
    """, ele_captcha) 

# save the captcha to a file 
with open(r"captcha.jpg", 'wb') as f: 
    f.write(base64.b64decode(img_captcha_base64)) 
+0

Mã này tải xuống hình ảnh mới để hình ảnh xác thực khác nhau. –

Các vấn đề liên quan