Python дээр вэбээс зураг болон бусад файлуудыг татаж авах (дангаар нь эсвэл багцаар)

Бизнес эрхэлдэг

Зураг, ZIP, PDF эсвэл вэб дээрх бусад файлын URL-г 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 нээх

URL-г нээж, өгөгдлийг сэргээхийн тулд urllib.request.urlopen()-г ашиглана уу. Python 2.6 болон түүнээс өмнөх хувилбаруудад urllib.urlopen() нь хуучирсан болохыг анхаарна уу. urllib.request.urlretrieve() хараахан хүчингүй болоогүй байгаа ч ирээдүйд байж магадгүй.

Үл хамаарах зүйл тохиолдоход зогсохгүйн тулд try болон except-ын тусламжтайгаар алдааг тогтооно уу.

Жишээн дээр 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()-аас олж авах боломжтой өгөгдөл нь байт мөр (байтын төрөл) юм.

Хоёрдахь аргумент нь өгөгдлийг хоёртын хувилбараар бичдэг mode=’wb’-тэй Open()-г ашиглана. 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-уудын жагсаалтыг гаргах нь илүү хялбар байдаг (доороос үзнэ үү).

Жагсаалтыг ойлгох тэмдэглэгээг ашиглана уу.

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}-г 3 оронтой биш 5 оронтой тоонд ашигладаг. str стринг форматлах аргын талаар дэлгэрэнгүй мэдээллийг дараах нийтлэлээс үзнэ үү.

Мөн энд бид гаралтыг уншихад хялбар болгох үүднээс pprint ашиглаж байна.

Сайхан шөлтэй ханд

Вэб хуудсуудаас зургийн URL-уудыг бөөнөөр нь авахын тулд Beautiful Soup ашиглана уу.

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

from bs4 import BeautifulSoup

url = 'https://mn.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> Татаж авахыг хүсч буй олон зургийг агуулсан блокийн ангилал, id гэх мэтийг зааж өгөх замаар объектуудыг шошго.
    • soup.find(class_='list').find_all('img')
  • Зургийн URL-г <img> src элемент эсвэл data-src элементээс авна уу. шошго.
    • 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