Как я могу загрузить изображения из CAPTCHA с Python? - PullRequest
0 голосов
/ 08 апреля 2020

Мне нужно загрузить изображения, которые находятся внутри изготовленной на заказ CAPTCHA на этом сайте авторизации. Как я могу это сделать: (?

Это сайт авторизации, есть пять изображений

и это ссылка: https://portalempresas.sb.cl/login.php

Я пытался с этим кодом, который помог мне другой пользователь ( @ EnriqueBet ):

from io import BytesIO
from PIL import Image

# Download image function
def downloadImage(element,imgName):
    img = element.screenshot_as_png
    stream = BytesIO(img)
    image = Image.open(stream).convert("RGB")
    image.save(imgName)

# Find all the web elements of the captcha images    
image_elements = driver.find_elements_by_xpath("/html/body/div[1]/div/div/section/div[1]/div[3]/div/div/div[2]/div[*]")

# Output name for the images
image_base_name = "Imagen_[idx].png"

# Download each image
for i in range(len(image_elements)):
    downloadImage(image_elements[i],image_base_name.replace("[idx]","%s"%i)

Но когда он пытается получить все элементы изображения

image_elements = driver.find_elements_by_xpath("/html/body/div[1]/div/div/section/div[1]/div[3]/div/div/div[2]/div[*]")

Не удается и не получает ни одного из них. Пожалуйста, помогите!: (

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Это ответ на мой предыдущий пост

У меня не получилось запустить селен из-за проблем с версиями в селене и в моем браузере.

Я подумал о другом способе загрузки и извлечения всех изображений, которые появляются на картинке. Как вы можете сказать, что изображения меняются при каждом посещении, поэтому для сбора всех изображений лучше всего их автоматизировать, а не вручную сохранять изображение с сайта

Чтобы автоматизировать его, выполните следующие действия.

Сначала перейдите на сайт с помощью селена и сделайте скриншот сайта. Например,

from selenium import webdriver

DRIVER = 'chromedriver'
driver = webdriver.Chrome(DRIVER)
driver.get('https://www.spotify.com')
screenshot = driver.save_screenshot('my_screenshot.png')
driver.quit()

Это сохраняет его локально. Затем вы можете открыть изображение, используя библиотеку, например pil, и обрезать изображения капчи.

Это будет сделано так:

im = Image.open('0.png').convert('L')
im = im.crop((1, 1, 98, 33))
im.save('my_screenshot.png)

Надеюсь, вы поняли идею здесь. Вам нужно будет сделать это одно за другим для всех изображений, в идеале для l oop с соответствующим изменением размеров кадрирования.

0 голосов
/ 08 апреля 2020

Вместо того, чтобы определять явный путь к изображениям, почему бы просто не загрузить все изображения, которые присутствуют на странице. Это будет работать, поскольку на самой странице всего 5 изображений, и вы хотите загрузить все из них. См. Метод ниже.

Следующее должно извлечь все изображения с данной страницы и записать его в каталог, где выполняется скрипт.

import re
import requests
from bs4 import BeautifulSoup

site = ''#set image url here
response = requests.get(site)
soup = BeautifulSoup(response.text, 'html.parser')
img_tags = soup.find_all('img')

urls = [img['src'] for img in img_tags]

for url in urls:
    filename = re.search(r'/([\w_-]+[.](jpg|gif|png))$', url)
    with open(filename.group(1), 'wb') as f:
        if 'http' not in url:
            # sometimes an image source can be relative 
            # if it is provide the base url which also happens 
            # to be the site variable atm. 
            url = '{}{}'.format(site, url)
        response = requests.get(url)
        f.write(response.content)

Код взят из здесь и кредит переходит к соответствующему владельцу.

...