Как скачать изображения с веб-страницы? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть скрипт Python, который ищет изображения на веб-странице, и он должен загружать их в папку с именем «загружен».Последние 2-3 строки проблематичны, я не знаю, как написать правильный код с открытым кодом.

Большая часть скрипта в порядке, строки 42-43 дают ошибку

import os
import requests
from bs4 import BeautifulSoup

downloadDirectory = "downloaded"
baseUrl = "http://pythonscraping.com"

def getAbsoluteURL(baseUrl, source):
    if source.startswith("http://www."):
        url = "http://"+source[11:]
    elif source.startswith("http://"):
        url = source
    elif source.startswith("www."):
        url = source[4:]
        url = "http://"+source
    else:
        url = baseUrl+"/"+source
    if baseUrl not in url:
        return None
    return url 

def getDownloadPath(baseUrl, absoluteUrl, downloadDirectory):
    path = absoluteUrl.replace("www.", "")
    path = path.replace(baseUrl, "")
    path = downloadDirectory+path
    directory = os.path.dirname(path)
    if not os.path.exists(directory):
        os.makedirs(directory)
    return path


html = requests.get("http://www.pythonscraping.com")
bsObj = BeautifulSoup(html.content, 'html.parser')
downloadList = bsObj.find_all(src=True)

for download in downloadList:
    fileUrl = getAbsoluteURL(baseUrl,download["src"])
    if fileUrl is not None:
        print(fileUrl)
    with open(fileUrl, getDownloadPath(baseUrl, fileUrl, downloadDirectory), 'wb') as out_file:
        out_file.write(fileUrl.content)

Открывает загруженную папку на моем компьютере и папку misc внутри нее.И это дает ошибку трассировки.Traceback:

http://pythonscraping.com/misc/jquery.js?v=1.4.4
Traceback (most recent call last):
  File "C:\Python36\kodovi\downloaded.py", line 43, in <module>
    with open(fileUrl, getDownloadPath(baseUrl, fileUrl, downloadDirectory), 'wb
') as out_file:
TypeError: an integer is required (got type str)

1 Ответ

0 голосов
/ 20 декабря 2018

Кажется, ваш список загрузок содержит некоторые URL, которые не являются изображениями.Вместо этого вы можете искать любые теги <img> в HTML:

downloadList = bsObj.find_all('img')

. Затем использовать это для загрузки этих изображений:

for download in downloadList:
    fileUrl = getAbsoluteURL(baseUrl,download["src"])
    r = requests.get(fileUrl, allow_redirects=True)
    filename = os.path.join(downloadDirectory, fileUrl.split('/')[-1])
    open(filename, 'wb').write(r.content)

РЕДАКТИРОВАТЬ: Я обновил filename = ...строка, чтобы записать файл с таким же именем в каталог в строке downloadDirectory.Кстати, обычное соглашение для переменных Python - не использовать верблюжий случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...