Найдите и загрузите изображение на нескольких страницах

#python #beautifulsoup

Вопрос:

Если я напишу http://www.chictopia.com/photo/show/3

Я могу получить соответствующий файл с изображением.

Однако, если я установлю диапазон для обхода изображения на нескольких веб-страницах с использованием цикла for, я не смогу получить файл изображения, похоже, файл размером 0 байт загружен

f’http://www.chictopia.com/photo/show/ {x}

почему я могу получить файл изображения объемом 0 байт и может ли кто-нибудь объяснить, как анализировать изображение нескольких страниц.

Спасибо

 import re
import requests
from bs4 import BeautifulSoup

for x in range (3,6):

    response = requests.get(f'http://www.chictopia.com/photo/show/ {x}')

    print (response)


    soup = BeautifulSoup(response.text, 'html.parser')

    img_tags = soup.find_all('img')

    urls = [img['src'] for img in img_tags]


    for url in urls:
        filename = re.search(r'/([w_-] [400] [.](jpg))


Ответ №1:

попробуйте изменить шаблон регулярного выражения и использовать измененный вызов на правильный URL-адрес изображения. теперь этот код сохранит все изображения, содержащие _400.jpg в их ссылке указано следующее имя.

 import re
import requests
from bs4 import BeautifulSoup
import shutil

for x in range (3,6):

    response = requests.get(f'http://www.chictopia.com/photo/show/ {x}')
    # print (response.status_code)
    soup = BeautifulSoup(response.text, 'html.parser') 

    img_tags = soup.find_all('img')

    urls = [img['src'] for img in img_tags]

    
    for url in urls:
        filename = re.findall(r'(. _400.jpg)', url)
        if len(filename) != 0:
          image =  filename[0]
          image_name = f"image_{image.split('/')[-1]}"
          response = requests.get(image, stream=True)
          with open(image_name, 'wb') as out_file:
            shutil.copyfileobj(response.raw, out_file)
            print(f'Saved : {image_name}')
 

например.
http://images2.chictopia.com/photos/mikajones/2162299642/2162299642_400.jpg -> как image_2162299642_400.jpg

теперь, что не так с вашим кодом:

вы использовали неправильное регулярное выражение и взяли соответствующее значение, которое не является полным URL-адресом изображения, поэтому вы получаете нулевое значение для размера изображения (вы даже не вызываете URL-адрес изображения).

все исправлено.

Комментарии:

1. Большое спасибо!!

, url)
if not filename:
print("fail".format(url))
continue
with open(filename.group(1), 'wb') as f:
if 'http' not in url:
url = '{}{}'.format(response, url)
response = requests.get(url)
f.write(response.content)

Ответ №1:

попробуйте изменить шаблон регулярного выражения и использовать измененный вызов на правильный URL-адрес изображения. теперь этот код сохранит все изображения, содержащие _400.jpg в их ссылке указано следующее имя.


например.
http://images2.chictopia.com/photos/mikajones/2162299642/2162299642_400.jpg -> как image_2162299642_400.jpg

теперь, что не так с вашим кодом:

вы использовали неправильное регулярное выражение и взяли соответствующее значение, которое не является полным URL-адресом изображения, поэтому вы получаете нулевое значение для размера изображения (вы даже не вызываете URL-адрес изображения).

все исправлено.

Комментарии:

1. Большое спасибо!!