Python - Скачать GIF по ссылке - PullRequest
0 голосов
/ 12 июля 2020

Мне нужна помощь в решении проблемы. Мне нужно ежедневно загружать некоторые GIF-файлы с веб-сайта и разрабатывать код в python для этого.

Я могу загрузить с помощью request.get, но когда я пытаюсь открыть файл, он оказывается поврежденным. У кого-нибудь была эта проблема? У меня python 3.6 и селен на chrome вот мой код, так как я нашел изображение:

        img = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/img')
        src = img.get_attribute('src')
        print(src)
        r = requests.get(src)
        time.sleep(5)
        with open ('teste2.gif', 'wb') as outfile:
            outfile.write(r.content)

EDIT !!!

Извините, найдите мой код ниже. Проблема в том, что этот сайт требует входа в систему. Я просто добавил логин в запрос. Но все та же проблема. Я тоже пытался загрузить с помощью dload, но та же проблема @irahorecka @UWTD TV

from selenium import webdriver
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import urllib.request
from pathlib import Path
import requests
from io import open as iopen
import dload
import pyautogui
link = 'https://sintegre.ons.org.br/sites/9/38/paginas/produtos-dinamicos/meteorologia.aspx'
chromedriver = r'C:\chromedriver'
pasta_download = Path(r'C:\download')
dados_login = {
    'login_usuario': 'XXXXXX',
    'login_senha': 'XXXXXXX'
}

options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
prefs = {"profile.default_content_settings.popups": 0,
         "download.default_directory": pasta_download ,  
         "directory_upgrade": True,
         'excludeSwitches': ['enable-logging']}

options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)
driver.get(link)
driver.find_element_by_id('username').send_keys(dados_login['login_usuario'])
driver.find_element_by_name('submit.IdentificarUsuario').click()
time.sleep(5)
driver.find_element_by_id('password').send_keys(dados_login['login_senha'])
driver.find_element_by_name('submit.Signin').click()
time.sleep(5)
met_UL = driver.find_element_by_id('listaMeteorologia_703765c5')
met_list = met_UL.find_elements_by_tag_name("li")
for items2 in met_list:
    if items2.text == 'Previsão de Precipitação':
        items2.click()
time.sleep(5)
ETA = driver.find_elements_by_tag_name('h3')
for items3 in ETA:
    print(items3.text)
    if items3.text == 'ETA':
        brasil = driver.find_element_by_link_text('Brasil').click()
        img = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/img')
        src = img.get_attribute('src')
        print(src)
        headers = {'User-Agent': 'Mozilla/5.0'}

        r = requests.get(src, headers=headers, data = dados_login)

        time.sleep(5)
        print('status code: ', r.status_code)

        with open('teste2.gif', 'wb') as outfile:
            outfile.write(r.content)


driver.quit()

1 Ответ

0 голосов
/ 12 июля 2020

Вы проверили, что ваш код ответа - 200?

img = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/img')
src = img.get_attribute('src')
print(src)
r = requests.get(src)
if r.ok:
    time.sleep(5)
    with open ('teste2.gif', 'wb') as outfile:
        outfile.write(r.content)
else:
    print(r)

Это может быть проблема заголовка в вашем запросе на получение.

headers = {'User-Agent': 'Mozilla/5.0'}

Ваш новый код:

img = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/img')
src = img.get_attribute('src')
print(src)
headers = {'User-Agent': 'Mozilla/5.0'}
r = requests.get(src, headers=headers)
if r.ok:
    time.sleep(5)
    with open ('teste2.gif', 'wb') as outfile:
        outfile.write(r.content)
else:
    print(r)

Я немного изменил ваш код:

from selenium import webdriver
import time

from pathlib import Path
import requests

link = 'https://sintegre.ons.org.br/sites/9/38/paginas/produtos-dinamicos/meteorologia.aspx'
chromedriver = r'C:\chromedriver'
pasta_download = Path(r'C:\download')
dados_login = {
    'login_usuario': 'XXXXXX',
    'login_senha': 'XXXXXXX'
}

options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
prefs = {"profile.default_content_settings.popups": 0,
         "download.default_directory": pasta_download,
         "directory_upgrade": True,
         'excludeSwitches': ['enable-logging']}

options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(executable_path=chromedriver, chrome_options=options)
driver.get(link)
driver.find_element_by_id('username').send_keys(dados_login['login_usuario'])
driver.find_element_by_name('submit.IdentificarUsuario').click()
time.sleep(5)
driver.find_element_by_id('password').send_keys(dados_login['login_senha'])
driver.find_element_by_name('submit.Signin').click()
time.sleep(5)
met_UL = driver.find_element_by_id('listaMeteorologia_703765c5')
met_list = met_UL.find_elements_by_tag_name("li")
for items2 in met_list:
    if items2.text == 'Previsão de Precipitação':
        items2.click()
time.sleep(5)
ETA = driver.find_elements_by_tag_name('h3')
for items3 in ETA:
    print(items3.text)
    if items3.text == 'ETA':
        brasil = driver.find_element_by_link_text('Brasil').click()
        img = driver.find_element_by_xpath('/html/body/div/div[2]/div[2]/img')
        src = img.get_attribute('src')
        print(src)
        cookies = driver.get_cookies()
        s = requests.Session()
        for c in cookies:
            s.cookies.set(c['name'], c['value'])
        headers = {'User-Agent': 'Mozilla/5.0'}

        r = s.get(src, headers=headers)

        time.sleep(5)
        print('status code: ', r.status_code)

        with open('teste2.gif', 'wb') as outfile:
            outfile.write(r.content)


driver.quit()

Новые строки в коде:

cookies = driver.get_cookies()
s = requests.Session()
for c in cookies:
    s.cookies.set(c['name'], c['value'])

и заменены

r = requests.get(src, headers=headers)

на сеанс запросов, который я начал раньше

r = s.get(src, headers=headers)

Прочтите мой комментарий к

...