هل تريد تنزيل ملف الصورة من مصدر صفحة HTML باستخدام python؟
-
05-07-2019 - |
سؤال
أنا أكتب مكشطة تقوم بتنزيل جميع ملفات الصور من صفحة HTML وحفظها في مجلد معين.جميع الصور هي جزء من صفحة HTML.
المحلول
إليك بعض التعليمات البرمجية لتنزيل جميع الصور من عنوان URL المرفق وحفظها في مجلد الإخراج المحدد.يمكنك تعديله وفقا لاحتياجاتك الخاصة.
"""
dumpimages.py
Downloads all the images on the supplied URL, and saves them to the
specified output file ("/test/" by default)
Usage:
python dumpimages.py http://example.com/ [output]
"""
from bs4 import BeautifulSoup as bs
from urllib.request import (
urlopen, urlparse, urlunparse, urlretrieve)
import os
import sys
def main(url, out_folder="/test/"):
"""Downloads all the images at 'url' to /test/"""
soup = bs(urlopen(url))
parsed = list(urlparse(url))
for image in soup.findAll("img"):
print("Image: %(src)s" % image)
filename = image["src"].split("/")[-1]
parsed[2] = image["src"]
outpath = os.path.join(out_folder, filename)
if image["src"].lower().startswith("http"):
urlretrieve(image["src"], outpath)
else:
urlretrieve(urlunparse(parsed), outpath)
def _usage():
print("usage: python dumpimages.py http://example.com [outpath]")
if __name__ == "__main__":
url = sys.argv[-1]
out_folder = "/test/"
if not url.lower().startswith("http"):
out_folder = sys.argv[-1]
url = sys.argv[-2]
if not url.lower().startswith("http"):
_usage()
sys.exit(-1)
main(url, out_folder)
يحرر: يمكنك تحديد مجلد الإخراج الآن.
نصائح أخرى
وحل ريان جيد، ولكن فشل إذا كانت عناوين مصدر الصورة هي عناوين المواقع المطلقة أو أي شيء لا يعطي نتيجة جيدة عند متصلا ببساطة إلى URL الصفحة الرئيسية. urljoin تعترف مطلقا مقابل عناوين URL النسبية، بحيث تحل محل حلقة في منتصف مع:
for image in soup.findAll("img"):
print "Image: %(src)s" % image
image_url = urlparse.urljoin(url, image['src'])
filename = image["src"].split("/")[-1]
outpath = os.path.join(out_folder, filename)
urlretrieve(image_url, outpath)
لديك لتحميل الصفحة وتحليل وثيقة أتش تي أم أل، والعثور على الصور الخاصة بك مع التعابير المنطقية وتحميل البرنامج .. يمكنك استخدام urllib2 لتحميل وحساء جميل لتحليل ملف HTML.
وهذه هي وظيفة للتحميل صورة واحدة:
def download_photo(self, img_url, filename):
file_path = "%s%s" % (DOWNLOADED_IMAGE_PATH, filename)
downloaded_image = file(file_path, "wb")
image_on_web = urllib.urlopen(img_url)
while True:
buf = image_on_web.read(65536)
if len(buf) == 0:
break
downloaded_image.write(buf)
downloaded_image.close()
image_on_web.close()
return file_path
استخدم htmllib لاستخراج كافة العلامات IMG (تجاوز do_img)، ثم استخدم urllib2 لتحميل جميع الصور.
إذا طلب بحاجة إلى إذن الرجوع إلى هذا واحد:
r_img = requests.get(img_url, auth=(username, password))
f = open('000000.jpg','wb')
f.write(r_img.content)
f.close()