Спампуйце выявы і іншыя файлы з Інтэрнэту на Python (па асобнасці або пакетамі)

Бізнэс

Ніжэй тлумачыцца, як задаць URL-адрас выявы, ZIP, PDF або іншага файла ў Інтэрнэце ў Python, загрузіць яго і захаваць як лакальны файл.

  • Спампуйце выявы, указаўшы URL.
    • Прыклад кода
    • urllib.request.urlopen():Адкрыць URL
    • open():Запіс у файл у двайковым рэжыме
    • Больш просты прыклад кода
  • Спампуйце файлы ZIP, PDF і г.д.
  • Выняць URL выявы на вэб-старонцы.
    • Калі нумар паслядоўны
    • Экстракт з прыгожым супам
  • Пакетная загрузка некалькіх малюнкаў са спісу URL-адрасоў

Спампуйце выявы, указаўшы URL.

Вы можаце выкарыстоўваць стандартную бібліятэку толькі для загрузкі асобных файлаў, паказваючы іх URL; дадатковая ўстаноўка не патрабуецца.

Прыклад кода

Ніжэй прыведзены прыклад функцыі, якая загружае і захоўвае файл, вызначаючы URL і шлях прызначэння, а таксама яго выкарыстанне. Гэты код трохі шматслоўны для тлумачэння. Ніжэй прыведзены просты прыклад.

import os
import pprint
import time
import urllib.error
import urllib.request

def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file:
            data = web_file.read()
            with open(dst_path, mode='wb') as local_file:
                local_file.write(data)
    except urllib.error.URLError as e:
        print(e)
url = 'https://www.python.org/static/img/python-logo.png'
dst_path = 'data/temp/py-logo.png'
download_file(url, dst_path)

Каб паказаць каталог прызначэння і захаваць файл з імем файла URL, зрабіце наступнае

def download_file_to_dir(url, dst_dir):
    download_file(url, os.path.join(dst_dir, os.path.basename(url)))

dst_dir = 'data/temp'
download_file_to_dir(url, dst_dir)

Ён здабывае імя файла з URL з дапамогай os.path.basename() і злучае яго з каталогам, вызначаным з дапамогай os.path.join(), каб стварыць шлях прызначэння.

У наступных раздзелах апісваецца частка збору даных і частка захавання даных у выглядзе файла.

urllib.request.urlopen():Адкрыць URL

Выкарыстоўвайце urllib.request.urlopen(), каб адкрыць URL і атрымаць даныя. Звярніце ўвагу, што urllib.urlopen() устарэла ў Python 2.6 і раней. urllib.request.urlretrieve() яшчэ не састарэла, але можа быць у будучыні.

Каб пазбегнуць спынення пры ўзнікненні выключэння, злавіце памылку з дапамогай спробы і выключэння.

У прыкладзе імпартуецца urllib.error, і відавочна фіксуецца толькі urllib.error.URLError. Паведамленне пра памылку будзе адлюстроўвацца, калі URL файла не існуе.

url_error = 'https://www.python.org/static/img/python-logo_xxx.png'
download_file_to_dir(url_error, dst_dir)
# HTTP Error 404: Not Found

Калі вы хочаце таксама злавіць выключэнні (FileNotFoundError і г.д.) пры лакальным захаванні, зрабіце наступнае.
(urllib.error.URLError, FileNotFoundError)

Таксама можна выкарыстоўваць запыты старонніх бібліятэк замест стандартнай бібліятэкі urllib, каб адкрыць URL і атрымаць дадзеныя.

Запісаць у файл у двайковым рэжыме ў open()

Дадзеныя, якія можна атрымаць з дапамогай urllib.request.urlopen() – гэта радок байтаў (тып байтаў).

Open() з mode=’wb’ ў якасці другога аргумента запісвае дадзеныя ў двайковым выглядзе. w азначае запіс, а b азначае двайковы.

Больш просты прыклад кода

Укладзеныя з аператарамі можна пісаць адразу, праз коскі.

Выкарыстоўваючы гэта, мы можам напісаць наступнае.

def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file, open(dst_path, 'wb') as local_file:
            local_file.write(web_file.read())
    except urllib.error.URLError as e:
        print(e)

Спампуйце файлы ZIP, PDF і г.д.

Дагэтуль прыведзены прыклады для загрузкі і захавання файлаў малюнкаў, але паколькі мы проста адкрываем файл у Інтэрнэце і захоўваем яго як лакальны файл, тыя ж функцыі можна выкарыстоўваць і для іншых тыпаў файлаў.

Вы можаце спампоўваць і захоўваць файлы, указаўшы URL.

url_zip = 'https://from-locas.com/sample_header.csv.zip'
download_file_to_dir(url_zip, dst_dir)

url_xlsx = 'https://from-locas/sample.xlsx'
download_file_to_dir(url_xlsx, dst_dir)

url_pdf = 'https://from-locas/sample1.pdf'
download_file_to_dir(url_pdf, dst_dir)

Звярніце ўвагу, што URL, указаны ў гэтай функцыі, павінен быць спасылкай на сам файл.

Напрыклад, у выпадку файла сховішча GitHub, наступны URL мае пашырэнне pdf, але на самай справе з’яўляецца старонкай HTML. Калі гэты URL пазначаны ў функцыі вышэй, будзе спампаваны зыходны код html.

  • https://github.com/from-locals/python-snippets/blob/master/notebook/data/src/pdf/sample1.pdf

Спасылка на аб’ект файла – гэта наступны URL, які вам трэба ўказаць, калі вы хочаце загрузіць і захаваць файл.

  • https://github.com/from-locals/python-snippets/raw/master/notebook/data/src/pdf/sample1.pdf

Ёсць таксама выпадкі, калі доступ абмяжоўваецца агентам карыстальніка, рэферэрам і г.д., што робіць немагчымым загрузку. Мы не гарантуем, што ўсе файлы будуць спампаваныя.

Выкарыстоўваць запыты лёгка, каб змяніць або дадаць загалоўкі запытаў, такія як агент карыстальніка.

Выняць URL выявы на вэб-старонцы.

Каб загрузіць усе выявы на старонцы адначасова, спачатку здабудзьце URL-адрасы малюнкаў і стварыце спіс.

Калі нумар паслядоўны

Калі URL-адрас выявы, якую вы хочаце загрузіць, уяўляе сабой просты парадкавы нумар, гэта лёгка. Калі URL-адрасы з’яўляюцца не толькі паслядоўнымі нумарамі, але і маюць некаторую рэгулярнасць, лягчэй скласці спіс URL-адрасоў у адпаведнасці з правіламі, чым выскрабаць з дапамогай Beautiful Soup (гл. ніжэй).

Выкарыстоўвайце запісы для разумення спісу.

url_list = ['https://example.com/basedir/base_{:03}.jpg'.format(i) for i in range(5)]
pprint.pprint(url_list)
# ['https://example.com/basedir/base_000.jpg',
#  'https://example.com/basedir/base_001.jpg',
#  'https://example.com/basedir/base_002.jpg',
#  'https://example.com/basedir/base_003.jpg',
#  'https://example.com/basedir/base_004.jpg']

У прыведзеным вышэй прыкладзе {:03} выкарыстоўваецца для 3-значнага паслядоўнага нумара, запоўненага нулямі; {} выкарыстоўваецца, калі запаўненне нуля не патрабуецца, а {:05} выкарыстоўваецца для 5-значнага ліку замест 3-значных. Для атрымання дадатковай інфармацыі аб метадзе фарматавання радка str глядзіце наступны артыкул.

Акрамя таго, тут мы выкарыстоўваем pprint, каб зрабіць выхад больш простым для чытання.

Экстракт з прыгожым супам

Каб атрымаць масавыя URL-адрасы малюнкаў з вэб-старонак, выкарыстоўвайце Beautiful Soup.

import os
import time
import urllib.error
import urllib.request

from bs4 import BeautifulSoup

url = 'https://be.from-locals.com/'
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) '\
     'AppleWebKit/537.36 (KHTML, like Gecko) '\
     'Chrome/55.0.2883.95 Safari/537.36 '

req = urllib.request.Request(url, headers={'User-Agent': ua})
html = urllib.request.urlopen(req)

soup = BeautifulSoup(html, "html.parser")

url_list = [img.get('data-src') for img in soup.find(class_='list').find_all('img')]

У прыкладзе здабываецца URL-адрас мініяцюры гэтага вэб-сайта.

Структура вар’іруецца ў залежнасці ад вэб-старонкі, але ў асноўным яна атрымліваецца наступным чынам.

  • Атрымаць спіс <img> аб’екты тэгаў, паказваючы клас, ідэнтыфікатар і г.д. блока, які змяшчае некалькі малюнкаў, якія вы хочаце загрузіць.
    • soup.find(class_='list').find_all('img')
  • Атрымаць URL выявы з элемента src або элемента data-src з <img> тэг.
    • img.get('data-src')

Прыведзены вышэй узор кода з’яўляецца толькі прыкладам і не гарантуецца, што ён працуе.

Пакетная загрузка некалькіх малюнкаў са спісу URL-адрасоў

Калі ў вас ёсць спіс URL-адрасоў, вы можаце проста ператварыць яго ў цыкл for і выклікаць функцыю, каб загрузіць і захаваць файл з першым паказаным URL. З-за часовага спісу URL-адрасоў тут каментуецца выклік функцыі download_image_dir().

download_dir = 'data/temp'
sleep_time_sec = 1

for url in url_list:
    print(url)
#     download_file_dir(url, download_dir)
    time.sleep(sleep_time_sec)
# https://example.com/basedir/base_000.jpg
# https://example.com/basedir/base_001.jpg
# https://example.com/basedir/base_002.jpg
# https://example.com/basedir/base_003.jpg
# https://example.com/basedir/base_004.jpg

Каб не перагружаць сервер, я выкарыстоўваю time.sleep(), каб стварыць час чакання для кожнай загрузкі выявы. Адзінка выяўляецца ў секундах, таму ў прыведзеным вышэй прыкладзе імпартуецца і выкарыстоўваецца модуль часу.

Прыклад для файлаў малюнкаў, але іншыя тыпы файлаў таксама можна спампоўваць разам, пакуль яны ў спісе.

Copied title and URL