Скрипт Python для загрузки всех изображений с веб-сайта в указанную папку с BeautifulSoup - PullRequest
0 голосов
/ 27 июня 2018

Я нашел этот пост и хотел немного изменить скрипт для загрузки изображений в определенную папку. Мой отредактированный файл выглядит так:

import re
import requests
from bs4 import BeautifulSoup
import os

site = 'http://pixabay.com'
directory = "pixabay/" #Relative to script location

response = requests.get(site)

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

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

for url in urls:
    #print(url)
    filename = re.search(r'/([\w_-]+[.](jpg|gif|png))$', url)

    with open(os.path.join(directory, filename.group(1)), 'wb') as f:
        if 'http' not in url:
            url = '{}{}'.format(site, url)
        response = requests.get(url)
        f.write(response.content)

Похоже, что это нормально работает для pixabay , но если я попробую другой сайт, например imgur или heroimages , похоже, он не будет работать. Если я заменю декларацию сайта на

site = 'http://heroimages.com/portfolio'

ничего не загружается. Оператор print (когда он не прокомментирован) ничего не печатает, так что я предполагаю, что он не находит никаких тегов изображения? Я не уверен.

С другой стороны, если я заменю сайт на

site = 'http://imgur.com'

Иногда я получаю

AttributeError: 'NoneType' object has no attribute 'group'

или, если изображения действительно загружаются, я даже не могу открыть их, потому что я получаю следующую ошибку: not supported file format

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

1 Ответ

0 голосов
/ 27 июня 2018

вам нужно подождать, пока javascript не загрузит страницу, я думаю, в этом проблема, если вы хотите, вы можете использовать selenium

# your imports
...
from selenium import webdriver

site = 'http://heroimages.com/portfolio'
directory = "pixabay/" #Relative to script location

driver = webdriver.Chrome('/usr/local/bin/chromedriver')

driver.get(site)

soup = BeautifulSoup(driver.page_source, 'html.parser')
img_tags = soup.find_all('img')

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

for url in urls:
    print(url)
    # your code
    ...

выход

# from `http://heroimages.com/portfolio`
https://ssl.c.photoshelter.com/img-get2/I00004gQScPHUm5I/sec=wdtsdfoeflwefms1440ed201806304risXP3bS2xDXil/fill=350x233/361-03112.jpg
https://ssl.c.photoshelter.com/img-get2/I0000h9YWTlnCxXY/sec=wdtsdfoeflwefms1440ed20180630Nq90zU4qg6ukT5K/fill=350x233/378-01449.jpg
https://ssl.c.photoshelter.com/img-get2/I0000HNg_JtT_QrQ/sec=wdtsdfoeflwefms1440ed201806304CZwwO1L641maB9/fill=350x233/238-1027-hro-3552.jpg
https://ssl.c.photoshelter.com/img-get2/I00000LWwYspqXuk/sec=wdtsdfoeflwefms1440ed201806302BP_NaDsGb7udq0/fill=350x233/258-02351.jpg
# and many others images

Также создайте скрипт, который проверяет, существует ли каталог, если он не существует.

...
directory = os.path.dirname(os.path.realpath(__file__)) + '/pixabay/'    
if not os.path.exists(directory):
    os.makedirs(directory)
...                  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...