Как получить полные данные изображения из эскиза с помощью Beatifulsoup?

#python #html #parsing #beautifulsoup

#питон #HTML #синтаксический анализ #beautifulsoup

Вопрос:

Я пытаюсь написать программу на Python, которая загружает случайное изображение на основе поискового запроса. Вот мой пока что:

 import requests
from bs4 import BeautifulSoup
import random

query = 'pets' #This can be anything, this is just for demonstration 
adlt = 'on'
count = '10'

#I tried using Google but Bing is more cooperative
URL='https://bing.com/images/search?q='   query   'amp;safeSearch='   adlt   'amp;count='   count

html_page = requests.get(URL)

soup = BeautifulSoup(html_page.content, 'html.parser')

images = soup.find_all('img')

example = random.choice(images)

imageLink = example.attrs['src']

print(imageLink)
 

Итак, что делает этот код, так это переходит в движок изображений Bing и получает все теги там. Затем он выбирает случайный и печатает его URL-адрес на терминале. Но, как вы, возможно, знаете, в движке изображений Bing и Google отображается не само изображение, а его уменьшенная версия, вам нужно щелкнуть по нему, чтобы получить доступ к фактическому изображению. Итак, исходя из данных, которые я получаю от этого эскиза, как я могу получить доступ к реальному изображению?

Вот html-код для эскиза на случай, если он вам понадобится:

 <img class="mimg" style="color: rgb(157, 102, 46);" height="180" width="323" src="https://th.bing.com/th/id/OIP.1lJSjlsM4xmvJQTDwkOcbgHaEH?w=323amp;h=180amp;c=7amp;o=5amp;dpr=1.25amp;pid=1.7" alt="Image result for pets" data-thhnrepbd="1" data-bm="180">
 

И вот код для полного изображения этого эскиза:

 <img src="http://www.insuranceportals.us/wp-content/uploads/2018/07/Pets-Health-Insurance-Wise-Investment-Or-Waste-of-Money.jpeg" alt="See the source image" class=" nofocus" tabindex="0" aria-label="See the source image">
 

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

1. Вы сами ответили на это.. вам нужно «щелкнуть по нему», чтобы самостоятельно перейти к изображению. Т.е. Найти URL-адрес, который выдается пользователю при нажатии, и следовать ему. миниатюры — это локально кэшированные копии файлов, хранящихся на серверах Bing, нет способа перейти к исходному URL-адресу только из миниатюры.

2. @JeffUK Итак, есть ли какой-нибудь способ «щелкнуть изображение» с помощью Beatifulsoup или любого другого API?

3. Вы могли бы использовать Selenium для python

4. @Gealber Насколько я понимаю, Selenium — это, по сути, эмулятор браузера. Каждый раз, когда вы запускаете Selenium, открывается выбранный вами браузер, и это было бы не очень удобно. Я бы предпочел, чтобы что-то делало это с чем-то, что работает в фоновом режиме.

5. Да, это правда, но вы также можете настроить Selenium для запуска в фоновом режиме в качестве безголового браузера. Что-то вроде этого driver_options.add_argument("--headless") . Проблема в том, что вы не можете имитировать a click с помощью bs4, потому что это просто синтаксический анализатор html, хороший, но не более того. Он не может обрабатывать JavaScript для вас

Ответ №1:

Страница загружается динамически, поэтому requests не поддерживает ее. Мы можем использовать Selenium в качестве альтернативы для очистки страницы.

Установите его с помощью: pip install selenium .

Загрузите правильный ChromeDriver отсюда.

 import random
from time import sleep
from selenium import webdriver
from bs4 import BeautifulSoup


driver = webdriver.Chrome(r"c:pathtochromedriver.exe")
query = "pets"
adult = "on"
count = "10"

URL = (
    "https://bing.com/images/search?q="
      query
      "amp;safeSearch="
      adult
      "amp;count="
      count
)
driver.get(URL)
# Wait for page to fully render
sleep(5)

soup = BeautifulSoup(driver.page_source, "html.parser")
all_images = soup.find_all("img")
image = random.choice(all_images)
print(image)

driver.quit()
 

Вывод:

 <img alt="Turtle" data-bm="78" data-priority="2" data-thhnrepbd="1" height="42" src2="https://th.bing.com/th?q=Pet Turtleamp;amp;w=42amp;amp;h=42amp;amp;c=1amp;amp;p=0amp;amp;pid=InlineBlockamp;amp;mkt=en-USamp;amp;adlt=moderateamp;amp;t=1" width="42"/>
 

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

1. Это может быть другой способ сделать то, что делает мой код. Проблема по-прежнему сохраняется, вывод, который вы получаете, — это ссылка на эскиз изображения, а не на само изображение.