Python请求-在有页面的情况下获取并保存图像

问题描述 投票:1回答:3

我正在尝试从不确定的页面数中获取一堆图像,并在有新页面被点击时将所有图像保存到文件夹中。

代码:

def get_player_images_with_api():

    url = 'https://footballapi.pulselive.com/football/players?pageSize=30&compSeasons=274&altIds=true&page={page}&type=player&id=-1&compSeasonId=274'
    img_url = 'https://resources.premierleague.com/premierleague/photos/players/250x250/{player_id}.png'
    headers = {'Origin': 'https://www.premierleague.com'}
    my_path = 'images/players_250x250'

    page=0
    while True:
        try:
            data = requests.get(url.format(page=page), headers=headers).json()
            # uncoment this to print all data:
            # print(json.dumps(data, indent=4))
            for player in data['content']:
                print('{:<50} {}'.format(player['name']['display'], img_url.format(player_id=player['altIds']['opta'])))

                fullfilename = os.path.join(my_path, player['name']['display'] + ".png")
                urllib.request.urlretrieve(img_url.format(player_id=player['altIds']['opta']), fullfilename)
                sleep(2)
            page+=1
        except:
            break

但是代码在第一页之后中断,并且只有第一页中的图像被保存到路径中。

但是,如果我注释掉这些行:

#fullfilename = os.path.join(my_path, player['name']['display'] + ".png")
#urllib.request.urlretrieve(img_url.format(player_id=player['altIds']['opta']), fullfilename)

所有数十页都可以正确打印。


我想念什么?

python python-requests
3个回答
1
投票

我用urllib.request拆下了零件,并用requests模块替换,并指定了headers=参数。

运行此脚本会遍历页面并保存图像:

import os
from time import sleep
import requests

def get_player_images_with_api():

    url = 'https://footballapi.pulselive.com/football/players?pageSize=30&compSeasons=274&altIds=true&page={page}&type=player&id=-1&compSeasonId=274'
    img_url = 'https://resources.premierleague.com/premierleague/photos/players/250x250/{player_id}.png'
    headers = {'Origin': 'https://www.premierleague.com'}
    my_path = 'images/players_250x250'

    page=0
    while True:
        try:
            print('Page {}...'.format(page))
            data = requests.get(url.format(page=page), headers=headers).json()
            # uncoment this to print all data:
            # print(json.dumps(data, indent=4))
            for player in data['content']:
                pic = img_url.format(player_id=player['altIds']['opta'])
                print('{:<50} {}'.format(player['name']['display'], pic))

                fullfilename = os.path.join(my_path, player['name']['display'] + ".png")

                r = requests.get(pic, stream=True, headers=headers)
                if r.status_code == 200:
                    with open(fullfilename, 'wb') as f:
                        for chunk in r:
                            f.write(chunk)
                # sleep(2)
            page+=1
        except Exception as ex:
            print(ex)
            break

get_player_images_with_api()

打印并保存图像:

    Page 0...
    Max Aarons                                         https://resources.premierleague.com/premierleague/photos/players/250x250/p232980.png
    Abdul Rahman Baba                                  https://resources.premierleague.com/premierleague/photos/players/250x250/p118335.png
    Tammy Abraham                                      https://resources.premierleague.com/premierleague/photos/players/250x250/p173879.png
    Adam Smith                                         https://resources.premierleague.com/premierleague/photos/players/250x250/p54469.png
    Che Adams                                          https://resources.premierleague.com/premierleague/photos/players/250x250/p200439.png
    Dennis Adeniran                                    https://resources.premierleague.com/premierleague/photos/players/250x250/p183645.png
    Albert Adomah                                      https://resources.premierleague.com/premierleague/photos/players/250x250/p49773.png
    Adrián                                             https://resources.premierleague.com/premierleague/photos/players/250x250/p60706.png
    Adrien Silva                                       https://resources.premierleague.com/premierleague/photos/players/250x250/p46483.png
    Benik Afobe                                        https://resources.premierleague.com/premierleague/photos/players/250x250/p88498.png
    Sergio Agüero                                      https://resources.premierleague.com/premierleague/photos/players/250x250/p37572.png
    Daniel Agyei                                       https://resources.premierleague.com/premierleague/photos/players/250x250/p207725.png
    Soufyan Ahannach                                   https://resources.premierleague.com/premierleague/photos/players/250x250/p134293.png
    Ahmed El Mohamady                                  https://resources.premierleague.com/premierleague/photos/players/250x250/p37339.png
    Albian Ajeti                                       https://resources.premierleague.com/premierleague/photos/players/250x250/p181008.png
    Nathan Aké                                         https://resources.premierleague.com/premierleague/photos/players/250x250/p126184.png
    Alberto Moreno                                     https://resources.premierleague.com/premierleague/photos/players/250x250/p100059.png
    Marc Albrighton                                    https://resources.premierleague.com/premierleague/photos/players/250x250/p51938.png
    Toby Alderweireld                                  https://resources.premierleague.com/premierleague/photos/players/250x250/p55605.png
    Aleix García                                       https://resources.premierleague.com/premierleague/photos/players/250x250/p178871.png
    Trent Alexander-Arnold                             https://resources.premierleague.com/premierleague/photos/players/250x250/p169187.png
    Ali Koiki                                          https://resources.premierleague.com/premierleague/photos/players/250x250/p432793.png
    Alisson                                            https://resources.premierleague.com/premierleague/photos/players/250x250/p116535.png
    Allan                                              https://resources.premierleague.com/premierleague/photos/players/250x250/p214275.png
    Miguel Almirón                                     https://resources.premierleague.com/premierleague/photos/players/250x250/p179018.png
    Marcos Alonso                                      https://resources.premierleague.com/premierleague/photos/players/250x250/p82263.png
    Steven Alzate                                      https://resources.premierleague.com/premierleague/photos/players/250x250/p235382.png
    Ibrahim Amadou                                     https://resources.premierleague.com/premierleague/photos/players/250x250/p128348.png
    Daniel Amartey                                     https://resources.premierleague.com/premierleague/photos/players/250x250/p155569.png
    Luke Amos                                          https://resources.premierleague.com/premierleague/photos/players/250x250/p168764.png
    Page 1...
    Ethan Ampadu                                       https://resources.premierleague.com/premierleague/photos/players/250x250/p199598.png
    Joseph Anang                                       https://resources.premierleague.com/premierleague/photos/players/250x250/p447879.png

... and so on.

0
投票

在这两行中发生了异常。请尝试捕获该异常。

更改为

 except Exception as ex:
        print(str(ex))
        # Take some action if you want.
        break

您还可以通过添加多个except来捕获特定的异常>


0
投票

只要有例外,您的代码就会停止。但是,只要有错误,您就可以跳过下载机制。 :)

© www.soinside.com 2019 - 2024. All rights reserved.