Python веб-парсер не сохраняет файлы изображений - PullRequest
0 голосов
/ 14 июля 2020

Я начал работать над небольшой программой-терминалом для очистки изображений, которая должна сохранять изображения в указанный файл в иерархии программ. Это взято из основного c учебника, который я нашел в Интернете. Однако всякий раз, когда я ввожу поисковый запрос в терминал, чтобы начать очистку bing.com (да, я знаю), программа вылетает. Ошибки, которые я получаю, похоже, сосредоточены либо на том, что тип файла изображения не распознается, либо на путь к файлу, в котором будут сохранены изображения, не распознается:

from bs4 import BeautifulSoup
import requests
from PIL import Image
from io import BytesIO

search = input("Search for:")
params = {"q": search}
r = requests.get("http://www.bing.com/images/search", params=params)

soup = BeautifulSoup(r.text, "html.parser")
links = soup.findAll("a", {"class": "thumb"})

for item in links:
    img_obj = requests.get(item.attrs["href"])
    print("Getting", item.attrs["href"])
    title = item.attrs["href"].split("/")[-1]
    img = Image.open(BytesIO(img_obj.content))
    img.save("./scraped_images/" + title, img.format)

Выдана ошибка: Произошло исключение: FileNotFoundError [Errno 2] Нет такого файла или каталога: './scraped_images/3849747391_4a7dc3f19e_b.jpg'

Я попытался добавить переменную пути к файлу (используя pathlib) и объединить ее с другими необходимыми переменными:

from bs4 import BeautifulSoup
import requests
from PIL import Image
from io import BytesIO
from pathlib import Path

image_folder = Path("./scraped_images/")
search = input("Search for:")
params = {"q": search}
r = requests.get("http://www.bing.com/images/search", params=params)

soup = BeautifulSoup(r.text, "html.parser")
links = soup.findAll("a", {"class": "thumb"})

for item in links:
    img_obj = requests.get(item.attrs["href"])
    print("Getting", item.attrs["href"])
    title = item.attrs["href"].split("/")[-1]
    img = Image.open(BytesIO(img_obj.content))
    img.save(image_folder + title, img.format)

Возникла ошибка: Произошло исключение: TypeError неподдерживаемый тип (ы) операндов для +: 'WindowsPath' и 'str'

Я проверил документацию для PIL, BeautifulSoup и др. c . Чтобы узнать, могут ли какие-то обновления меня облажаться, я проверил элементы в bing, чтобы убедиться, что классы верны, и даже попытался выполнить поиск по другому классу, и ничего не сработало. Я в недоумении. Любые мысли или рекомендации приветствуются. Спасибо!

1 Ответ

0 голосов
/ 14 июля 2020

Я немного изменил ваш код:

from bs4 import BeautifulSoup
import requests
from pathlib import Path
import os
image_folder = Path("./scraped_images/")
if not os.path.isdir(image_folder):
    print('Making %s'%(image_folder))
    os.mkdir(image_folder)
search = input("Search for:")
params = {"q": search}
r = requests.get("http://www.bing.com/images/search", params=params)

soup = BeautifulSoup(r.text, "html.parser")
links = soup.findAll("a", {"class": "thumb"})

for item in links:
    img_obj = requests.get(item.attrs["href"])
    print("Getting", item.attrs["href"])
    title = item.attrs["href"].split("/")[-1]
    if img_obj.ok:
        with open('%s/%s'%(image_folder, title), 'wb') as file:
            file.write(img_obj.content)

Вы можете использовать PIL, но в этом случае он вам не нужен.

Я также улучшил код с помощью PIL, чтобы он работал лучше :

from bs4 import BeautifulSoup
import requests
from PIL import Image
from io import BytesIO
from pathlib import Path

s = requests.Session()
image_folder = Path("./scraped_images/")
search = input("Search for:")
params = {"q": search}
r = s.get("http://www.bing.com/images/search", params=params)

soup = BeautifulSoup(r.text, "html.parser")
links = soup.findAll("a", {"class": "thumb"})

for item in links:
    try:
        img_obj = s.get(item.attrs["href"], headers={'User-Agent': 'User-Agent: Mozilla/5.0'})
        if img_obj.ok:
            print("Getting", item.attrs["href"])
            title = item.attrs["href"].split("/")[-1]
            if '?' in title:
                title = title.split('?')[0]
            img = Image.open(BytesIO(img_obj.content))
            img.save(str(image_folder) + '/' + title, img.format)
        else:
            continue
    except OSError:
        print('\nError downloading %s try to visit'
              '\n%s\n'
              'manually and try to get the image manually.\n' %(title, item.attrs["href"]))

Я использую сеанс запросов и добавляю try и за исключением случаев, когда PIL не может создать изображение. Я также делаю попытку сделать изображение только в том случае, если на запрос приходит ответ 200 с сайта.

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