#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")
. Проблема в том, что вы не можете имитировать aclick
с помощью 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. Это может быть другой способ сделать то, что делает мой код. Проблема по-прежнему сохраняется, вывод, который вы получаете, — это ссылка на эскиз изображения, а не на само изображение.