Извлечение данных с помощью BeautifulSoup и Requests - PullRequest
2 голосов
/ 28 октября 2019

Я хочу просмотреть и скачать изображения собак с Unsplash. Однако, когда я использовал BeautifulSoup для доступа к div, только некоторые из циклов отображают URL в классе div. Есть ли способ получить об этом?

Мой код ниже:


import requests
from bs4 import BeautifulSoup as soup
import os

res = requests.get('https://unsplash.com/s/photos/shiba')

doggo_soup = soup(res.text,'html.parser')

containers = doggo_soup.findAll('div',{'class','IEpfq'})

if not os.path.exists('shiba'):
    os.makedirs('shiba')

os.chdir('shiba')

index = 1

for container in containers:
    img_tag = container.img
    source = requests.get(img_tag)
    with open('shiba-'+str(index)+'jpg','wb') as output:
        output.write(source.content)
<div class="_3oSvn IEpfq" style="padding-bottom:66.6667%"><img alt="short-coated white dog on field" class="_2zEKz" data-test="photo-grid-single-col-img" style="background-color:#060606"/></div>

Когда я проверял div-класс IEpfq на консоли разработчика, весь div-класс IEpfq содержит URLк картине.

Однако, когда я запускаю код, он показывает только частичную информацию (без URL) под тем же классом div для четвертого изображения вперед. (как показано в выводе выше) Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Это слегка измененный код. Для меня загружено 20 картинок.

import requests
from bs4 import BeautifulSoup as soup
import os

res = requests.get('https://unsplash.com/s/photos/shiba')

doggo_soup = soup(res.text,'html.parser')

containers = doggo_soup.find_all('div',class_='_2BSIe _3pmDG')


if not os.path.exists('shiba'):
    os.makedirs('shiba', exist_ok=True)

index = 1

for container in containers:
    imgUrl = container.find('a')['href']
    source = requests.get(imgUrl)
    imageFile = open(os.path.join('shiba', os.path.basename(str(index) + '.jpg')), 'wb')
    for chunk in source.iter_content(1000000):
        imageFile.write(chunk)
    imageFile.close()
    index +=1
0 голосов
/ 28 октября 2019

Есть несколько проблем с вашим кодом, попробуйте, это сработало для меня. Я добавил обработчик исключений, чтобы процесс продолжался в случае сбоя загрузки какого-либо изображения, также ваш код не обновляет счетчик index на каждой итерации:

import requests
from bs4 import BeautifulSoup as soup
import os

res = requests.get('https://unsplash.com/s/photos/shiba')

doggo_soup = soup(res.text,'html.parser')

containers = doggo_soup.findAll('div',{'class','IEpfq'})

if not os.path.exists('shiba'):
    os.makedirs('shiba')

os.chdir('shiba')

index = 1

for container in containers:
    try:
        img_tag = container.img
        source = requests.get(img_tag.get('src'))
        with open('shiba-'+str(index)+'.jpg','wb') as output:
            output.write(source.content)
        index += 1
    except:
      pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...