تنزيل الصور والملفات الأخرى من الويب في Python (بشكل فردي أو على دفعات)

اعمال

يوضح ما يلي كيفية تحديد عنوان URL لصورة أو ملف ZIP أو PDF أو أي ملف آخر على الويب في Python وتنزيله وحفظه كملف محلي.

  • تنزيل الصور بتحديد URL.
    • مثال رمز
    • urllib.request.urlopen():رابط مفتوح
    • open():اكتب إلى ملف في الوضع الثنائي
    • مثال أبسط رمز
  • قم بتنزيل ملفات ZIP وملفات PDF وما إلى ذلك.
  • استخراج عنوان 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():رابط مفتوح

استخدم 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 () عبارة عن سلسلة بايت (نوع بايت).

افتح () مع الوضع = ‘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 وفقًا للقواعد بدلاً من استخدام حساء جميل (انظر أدناه).

استخدام تدوين قائمة الفهم.

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 للصور من صفحات الويب بكميات كبيرة ، استخدم حساء جميل.

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

from bs4 import BeautifulSoup

url = 'https://ar.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 للصورة المصغرة لموقع الويب هذا.

يختلف الهيكل باختلاف صفحة الويب ، ولكن يتم الحصول عليه بشكل أساسي على النحو التالي.

  • احصل على قائمة & lt؛ img & gt؛ قم بتمييز الكائنات عن طريق تحديد الفئة ، والمعرف ، وما إلى ذلك للكتلة التي تحتوي على الصور المتعددة التي تريد تنزيلها.
    • soup.find(class_='list').find_all('img')
  • احصل على عنوان URL للصورة من عنصر src أو عنصر data-src الخاص بـ & lt؛ img & gt؛ بطاقة شعار.
    • img.get('data-src')

نموذج التعليمات البرمجية أعلاه هو مجرد مثال وليس مضمون للعمل.

تحميل دفعة متعددة من الصور من قائمة عناوين المواقع

إذا كانت لديك قائمة بعناوين 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