Я пишу парсер, который загружает все файлы изображений с HTML-страницы и сохраняет их в определенной папке. все изображения являются частью HTML-страницы.






Вы должны загрузить страницу и проанализировать html-документ, найти свое изображение с помощью регулярного выражения и загрузить его. Вы можете использовать urllib2 для загрузки и Beautiful Soup для анализа html-файла.
Используйте htmllib для извлечения всех тегов img (переопределите do_img), затем используйте urllib2 для загрузки всех изображений.
Это предполагает неразрывный html, с которым может справиться Beautiful Soup.
С другой стороны, здесь используются только стандартные библиотечные модули.
Вот код для загрузки всех изображений с предоставленного 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)
Редактировать: Теперь вы можете указать папку вывода.
open(..).write(urlopen(..) можно заменить на urllib.urlretrieve()Ваш код не работает, если расположение изображений указано относительно документа HTML. Не могли бы вы включить исправление предоставлено unutbu на случай, если кто-то будет использовать ваш скрипт в будущем?
@NiklasB. Я столкнулся с той же проблемой. В итоге я просто использовал регулярное выражение для поиска ссылок на все изображения, что, на мой взгляд, более надежно, чем Beautifulsoup.
А это функция для загрузки одного изображения:
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
у меня отлично работает при удалении цикла while (не его содержимого!)
Решение Райана хорошее, но не работает, если URL-адреса источника изображения являются абсолютными URL-адресами или чем-либо, что не дает хорошего результата при простом соединении с 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)
Если запрос требует авторизации, обратитесь к этому:
r_img = requests.get(img_url, auth=(username, password))
f = open('000000.jpg','wb')
f.write(r_img.content)
f.close()
"Как я могу% s"% title