ទាញយករូបភាព និងឯកសារផ្សេងទៀតពីបណ្តាញនៅក្នុង Python (ជាលក្ខណៈបុគ្គល ឬជាបាច់)

អាជីវកម្ម

ខាងក្រោមនេះពន្យល់ពីរបៀបបញ្ជាក់ URL នៃរូបភាព ហ្ស៊ីប PDF ឬឯកសារផ្សេងទៀតនៅលើគេហទំព័រនៅក្នុង Python ទាញយកវា ហើយរក្សាទុកវាជាឯកសារមូលដ្ឋាន។

  • ទាញយករូបភាពដោយបញ្ជាក់ URL ។
    • ឧទាហរណ៍កូដ
    • urllib.request.urlopen():បើក URL
    • open():សរសេរទៅឯកសារក្នុងរបៀបគោលពីរ
    • ឧទាហរណ៍នៃកូដសាមញ្ញជាង
  • ទាញយកឯកសារ ZIP ឯកសារ PDF ។ល។
  • ស្រង់ URL នៃរូបភាពនៅលើគេហទំព័រ។
    • ប្រសិនបើលេខមានលំដាប់
    • ស្រង់ជាមួយស៊ុបដ៏ស្រស់ស្អាត
  • បណ្តុំទាញយករូបភាពជាច្រើនពីបញ្ជី URLs

ទាញយករូបភាពដោយបញ្ជាក់ 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

ប្រើ urlib.request.urlopen() ដើម្បីបើក URL និងទាញយកទិន្នន័យ។ ចំណាំថា urlib.urlopen() ត្រូវបានបដិសេធនៅក្នុង Python 2.6 និងមុននេះ។ urllib.request.urlretrieve() មិន​ទាន់​ត្រូវ​បាន​បដិសេធ​នៅ​ឡើយ​ទេ ប៉ុន្តែ​អាច​នឹង​មាន​នៅ​ពេល​អនាគត។

ដើម្បីជៀសវាងការបញ្ឈប់នៅពេលដែលមានករណីលើកលែង ចាប់កំហុសដោយព្យាយាម និងលើកលែង។

ក្នុងឧទាហរណ៍ urllib.error ត្រូវបាននាំចូល ហើយមានតែ urlib.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)

វាក៏អាចប្រើបណ្ណាល័យភាគីទីបី សំណើជំនួសឱ្យបណ្ណាល័យស្តង់ដារ urlib ដើម្បីបើក url និងទទួលបានទិន្នន័យ។

សរសេរទៅឯកសារក្នុងរបៀបប្រព័ន្ធគោលពីរក្នុង open()

ទិន្នន័យដែលអាចទទួលបានជាមួយ urlib.request.urlopen() គឺជាខ្សែអក្សរបៃ (ប្រភេទបៃ)។

Open() with 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 នៃរូបភាពដែលអ្នកចង់ទាញយកគឺជាលេខបន្តបន្ទាប់សាមញ្ញ វាងាយស្រួល។ ប្រសិនបើ URLs មិនត្រឹមតែជាលេខបន្តបន្ទាប់គ្នាប៉ុណ្ណោះទេ ប៉ុន្តែវាក៏មានភាពទៀងទាត់ខ្លះដែរ នោះវាកាន់តែងាយស្រួលក្នុងការធ្វើបញ្ជី URLs យោងទៅតាមច្បាប់ជាជាងការលុបចោលជាមួយនឹង 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 ដើម្បីធ្វើឱ្យលទ្ធផលងាយស្រួលអាន។

ស្រង់ជាមួយស៊ុបដ៏ស្រស់ស្អាត

ដើម្បីទាញយករូបភាព URLs ពីគេហទំព័រជាដុំ សូមប្រើស៊ុបដ៏ស្រស់ស្អាត។

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

from bs4 import BeautifulSoup

url = 'https://km.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> tag objects ដោយបញ្ជាក់ class, id, etc. នៃ block ដែលមានរូបភាពច្រើនដែលអ្នកចង់ទាញយក។
    • soup.find(class_='list').find_all('img')
  • ទទួលបាន URL នៃរូបភាពពីធាតុ src ឬធាតុ data-src នៃ <img> ស្លាក។
    • img.get('data-src')

កូដគំរូខាងលើគ្រាន់តែជាឧទាហរណ៍មួយប៉ុណ្ណោះ ហើយមិនធានាថាដំណើរការនោះទេ។

បណ្តុំទាញយករូបភាពជាច្រើនពីបញ្ជី URLs

ប្រសិនបើអ្នកមានបញ្ជី URLs អ្នកគ្រាន់តែអាចបង្វែរវាទៅជារង្វិលជុំ ហើយហៅទៅមុខងារដើម្បីទាញយក និងរក្សាទុកឯកសារជាមួយនឹង 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