Попытка l oop через URL-адреса и загрузка изображений с этих веб-страниц - PullRequest
0 голосов
/ 05 мая 2020

У меня хорошая структура URL-адресов, и я хочу перебрать URL-адреса и загрузить все изображения из URL-адресов. Я пытаюсь использовать BeautifulSoup для выполнения работы вместе с функцией запросов.

Вот URL - https://sixmorevodka.com/# & gid = 0 & pid = {i}, и я хочу ' i 'для итерации, скажем, от 1 до 100 для этого примера.

from bs4 import BeautifulSoup as soup
import requests, contextlib, re, os

@contextlib.contextmanager
def get_images(url:str):
  d = soup(requests.get(url).text, 'html.parser') 
  yield [[i.find('img')['src'], re.findall('(?<=\.)\w+$', i.find('img')['alt'])[0]] for i in d.find_all('a') if re.findall('/image/\d+', i['href'])]

n = 100 #end value
for i in range(n):
  with get_images(f'https://sixmorevodka.com/#&gid=0&pid={i}') as links:
    print(links)
    for c, [link, ext] in enumerate(links, 1):
       with open(f'ART/image{i}{c}.{ext}', 'wb') as f:
           f.write(requests.get(f'https://sixmorevodka.com{link}').content)

Мне кажется, я что-то напутал в строке Yield или в самой последней строке записи. Кто-нибудь, помогите мне, пожалуйста. Я использую Python 3,7

1 Ответ

1 голос
/ 05 мая 2020

При просмотре структуры этой веб-страницы ваш параметр gid недействителен. Чтобы убедиться в этом, откройте новую вкладку и перейдите к https://sixmorevodka.com/#&gid=0&pid=22.

. Вы заметите, что ни одно из изображений портфолио не отображается. gid может быть значением от 1 до 5, обозначающим сетку, к которой принадлежит изображение.

Тем не менее, ваша текущая методология парсинга неэффективна и приводит к чрезмерному трафику c на веб-сайте. Вместо этого вам нужно сделать этот запрос только один раз и извлечь URL-адреса, фактически содержащие изображения, с помощью селектора классов ilb portfolio__grid__item.

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

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