Python တွင် ဝဘ်မှ ပုံများနှင့် အခြားဖိုင်များကို ဒေါင်းလုဒ်လုပ်ပါ (တစ်ဦးချင်း သို့မဟုတ် အစုလိုက်)

စီးပွားရေးလုပ်ငန်း

Python တွင် ပုံတစ်ပုံ၊ ZIP၊ PDF သို့မဟုတ် ဝဘ်ပေါ်ရှိ အခြားဖိုင်တစ်ခု၏ URL ကို မည်သို့သတ်မှတ်ရမည်၊ ၎င်းကို ဒေါင်းလုဒ်လုပ်ကာ ဒေသတွင်းဖိုင်အဖြစ် သိမ်းဆည်းရန် အောက်ပါတို့ကို ရှင်းပြထားသည်။

  • URL ကို သတ်မှတ်ခြင်းဖြင့် ပုံများကို ဒေါင်းလုဒ်လုပ်ပါ။
    • ကုဒ်ဥပမာ
    • urllib.request.urlopen():URL ကိုဖွင့်ပါ။
    • open():binary မုဒ်တွင် ဖိုင်တစ်ခုသို့ စာရေးပါ။
    • ပိုရိုးရှင်းသော ကုဒ်ဥပမာ
  • 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)

၎င်းသည် os.path.basename() ဖြင့် URL မှ ဖိုင်အမည်ကို ထုတ်ယူပြီး ဦးတည်ရာလမ်းကြောင်းကို ထုတ်လုပ်ရန်အတွက် os.path.join() ဖြင့် သတ်မှတ်ထားသည့် လမ်းကြောင်းနှင့် ပေါင်းထားသည်။

အောက်ပါကဏ္ဍများသည် ဒေတာရယူမှုအပိုင်းနှင့် ဖိုင်တစ်ခုအနေဖြင့် ဒေတာသိမ်းဆည်းမှုအပိုင်းကို ဖော်ပြသည်။

urllib.request.urlopen():URL ကိုဖွင့်ပါ။

URL ကိုဖွင့်ပြီးဒေတာကိုရယူရန် urllib.request.urlopen() ကိုသုံးပါ။ 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)

url ကိုဖွင့်ပြီး ဒေတာရယူရန် ပုံမှန်ဒစ်ဂျစ်တိုက် urllib အစား ပြင်ပအဖွဲ့အစည်း စာကြည့်တိုက် တောင်းဆိုမှုများကိုလည်း အသုံးပြုနိုင်သည်။

open() တွင် binary mode တွင် ဖိုင်တစ်ခုသို့ စာရေးပါ

urlib.request.urlopen() ဖြင့် ရရှိနိုင်သော ဒေတာသည် byte စာကြောင်း (bytes အမျိုးအစား) ဖြစ်သည်။

ဒုတိယအငြင်းအခုံက ဒေတာကို ဒွိနရီအဖြစ်ရေးပေးသောကြောင့် မုဒ်=’wb’ ဖြင့်ဖွင့်()။ w ဆိုသည်မှာ write နှင့် b ဆိုသည်မှာ binary ဖြစ်သည်။

ပိုရိုးရှင်းသော ကုဒ်ဥပမာ

ဖော်ပြချက်များဖြင့် အစုအဝေးကို ကော်မာများဖြင့် ပိုင်းခြားကာ တစ်ပြိုင်နက် ရေးသားနိုင်သည်။

ဒါကိုအသုံးပြုပြီး အောက်ပါအတိုင်း ရေးနိုင်ပါတယ်။

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 repository ဖိုင်တစ်ခုတွင်၊ အောက်ပါ URL တွင် pdf extension တစ်ခုရှိသော်လည်း အမှန်တကယ်မှာ 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 သည် ရိုးရှင်းသော sequential နံပါတ်ဖြစ်ပါက၊ ၎င်းသည် လွယ်ကူပါသည်။ URL များသည် ဆက်တိုက်နံပါတ်များသာမက ပုံမှန်အတိုင်းရှိနေပါက၊ Beautiful Soup ဖြင့်ခြစ်ခြင်းထက် စည်းမျဉ်းများနှင့်အညီ 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 လုံးဖြင့် သုညဖြည့်ထားသော နံပါတ်စဉ်အလိုက် အသုံးပြုပါသည်။ သုညဖြည့်ရန် မလိုအပ်သောအခါတွင် {} ကို အသုံးပြုပြီး ဂဏန်း 3 လုံးအစား ဂဏန်း 5 လုံးအတွက် {:05} ကို အသုံးပြုပါသည်။ string str ၏ ဖော်မတ်နည်းလမ်းအကြောင်း နောက်ထပ်အချက်အလက်များအတွက်၊ အောက်ပါဆောင်းပါးကို ကြည့်ပါ။

ထို့အပြင်၊ ဤတွင်ကျွန်ုပ်တို့သည် output ကိုဖတ်ရန်ပိုမိုလွယ်ကူစေရန် pprint ကိုအသုံးပြုနေသည်။

လှပသောဟင်းရည်ဖြင့်ထုတ်ယူ

အစုလိုက် ဝဘ်စာမျက်နှာများမှ ပုံ URL များကို ထုတ်ယူရန် Beautiful Soup ကို အသုံးပြုပါ။

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

from bs4 import BeautifulSoup

url = 'https://my.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> စာရင်းတစ်ခုရယူပါ။ သင်ဒေါင်းလုဒ်လုပ်လိုသော ပုံများစွာပါရှိသော ဘလောက်၏ class၊ id စသည်တို့ကို သတ်မှတ်ခြင်းဖြင့် အရာဝတ္ထုများကို tag လုပ်ပါ။
    • soup.find(class_='list').find_all('img')
  • ပုံ၏ URL ကို src ဒြပ်စင် သို့မဟုတ် <img&gt ၏ data-src ဒြပ်စင်မှ ရယူပါ။ tag
    • img.get('data-src')

အထက်ဖော်ပြပါ နမူနာကုဒ်သည် ဥပမာတစ်ခုမျှသာဖြစ်ပြီး အလုပ်လုပ်ရန် အာမမခံနိုင်ပါ။

အစုလိုက် URL များစာရင်းမှ ပုံများစွာကို ဒေါင်းလုဒ်လုပ်ပါ။

သင့်တွင် URL များစာရင်းရှိပါက၊ သင်သည် ၎င်းကို for loop တွင်ဖွင့်ပြီး ဖိုင်ကို ဒေါင်းလုဒ်လုပ်ကာ သိမ်းဆည်းရန် လုပ်ဆောင်ချက်ကို ခေါ်ပြီး ပထမဆုံး 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() ကို အသုံးပြုပါသည်။ ယူနစ်သည် စက္ကန့်ပိုင်းအတွင်းဖြစ်သည်၊ ထို့ကြောင့် အထက်နမူနာတွင်၊ time module ကို တင်သွင်းပြီး အသုံးပြုသည်။

ဥပမာသည် ပုံဖိုင်များအတွက်ဖြစ်သည်၊ သို့သော် ၎င်းတို့ကို စာရင်းသွင်းထားသရွေ့ အခြားဖိုင်အမျိုးအစားများကိုလည်း ဒေါင်းလုဒ်လုပ်နိုင်ပါသည်။