Почему некоторые изображения могут отображаться только внутри html <img src="urllink">, но не могут напрямую открываться через URL в браузере? - PullRequest
0 голосов
/ 12 марта 2020

В последнее время я пытаюсь загрузить изображение с веб-сайта. Я ищу элемент отображаемого изображения внутри html. Затем я открываю URL-адрес изображения на новой вкладке, но он возвращает страницу 403 Forbidden. Я копирую строку и вставляю ее в другие страницы html, и изображение может успешно отображаться. Я хочу спросить о причине этого, и что я могу сделать, чтобы загрузить изображение. (Я пытаюсь загрузить его через python request.get ()) Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Этот веб-сервер проверяет заголовок Referer при запросе изображения. Чтобы успешно загрузить изображение, Referer должна быть страницей, на которой находится изображение. Это не заботится о User-Agent. Я предполагаю, что изображение появилось, когда вы поместили его на другую страницу, потому что ваш браузер кэшировал изображение и фактически не запрашивал его снова с сервера.

Используя инструмент мониторинга сети вашего браузера, вы можете увидеть, как ваш браузер получил URL изображения. В этом случае URL не был частью оригинального документа html. Ваш браузер выполнил некоторые JavaScript, которые распаковали URL и вставили элемент img в элемент div с id="mangaBox". Из-за этого вы не можете использовать vanilla requests, так как он не выполняет JavaScript. Я использовал Requests- HTML.

Приведенный ниже код загружает изображение по ссылке, указанной в вашем комментарии, и сохраняет его на диск:

import os, urllib
from requests_html import HTMLSession

session = HTMLSession()
session.headers.update({"User-Agent": r"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0",
                        "Referer": r"https://tw.manhuagui.com/comic/35275/481200.html"
                        })

url = r"https://tw.manhuagui.com/comic/35275/481200.html"

response = session.get(url)
print(response, len(response.content))

response.html.render()

img = response.html.find("img#mangaFile", first=True)
print("img element:", img)

url = img.attrs["src"]
print("image url:", url)

response = session.get(url)
print(response, len(response.content))

filename = os.path.basename(urllib.parse.urlsplit(url).path)
print("filename:", filename)

with open(filename, "wb") as f:
    f.write(response.content)

Вывод:

<Response [200]> 6715
img element: <Element 'img' alt='在地下城寻找邂逅难道有错吗? 第00话' id='mangaFile' src='https://i.hamreus.com/ps3/z/zdxcxzxhndyc_sddc/第00话/P0018.jpg.webp?cid=481200&md5=aAAP75PBy9DIa0bb8Hlwfw' class=('mangaFile',) data-tag='mangaFile' style='display: block; transform: rotate(0deg); transform-origin: 50% 50% 0px;' imgw='907'>
image url: https://i.hamreus.com/ps3/z/zdxcxzxhndyc_sddc/第00话/P0018.jpg.webp?cid=481200&md5=aAAP75PBy9DIa0bb8Hlwfw
<Response [200]> 186386
filename: P0018.jpg.webp

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

<script type="text/javascript">window["\x65\x76\x61\x6c"](function(p,a,c,k,e,d)...
0 голосов
/ 12 марта 2020

Некоторые веб-сайты блокируют запросы без идентификатора пользователя, попробуйте это:

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
requests.get(url, headers=headers)

Ссылка на Python запросов. 403 Запрещено

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