Странный 410 http пропал с использованием python urllib, не воспроизводимого в wget - PullRequest
0 голосов
/ 11 октября 2019

Я использую urllib в python3 для получения некоторых изображений с моего сервера:

import urllib.request
import urllib.error
        try:
            resp = urllib.request.urlopen(url)
        except urllib.error.HTTPError as err:
            print("code "  + str(err.status) + " reason " + err.reason)

При запуске файла выводится ошибка 410 HTTP Gone,

 $ python3.6 file.py 

download: http://some_url.com/image.jpg
code 410 reason Gone

Traceback (most recent call last):
  File "file.py", line 32, in <module>
    image = image_from_url(url)

НоЯ точно знаю, что изображение там, так как wget возвращает изображение в порядке:

$ wget http://some_url.com/image.jpg

--2019-10-11 16:24:05--  http://some_url.com/image.jpg
Resolving some_url.com...
Connecting to some_url.com|...|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 127891 (125K) [image/jpeg]
Saving to: 'image.jpg'

Есть идеи о том, что вызывает это? Что-то на стороне сервера? Есть ли какой-то конкретный заголовок, который должен идти в запросе urllib?

Спасибо

1 Ответ

1 голос
/ 11 октября 2019

urllib запрос:

GET /wikipedia/commons/c/c9/Moon.jpg HTTP/1.1
Accept-Encoding: identity
Host: upload.wikimedia.org
User-Agent: Python-urllib/3.6
Connection: close

wget запрос:

GET /wikipedia/commons/c/c9/Moon.jpg HTTP/1.1
User-Agent: Wget/1.19.4 (linux-gnu)
Accept: */*
Accept-Encoding: identity
Host: upload.wikimedia.org
Connection: Keep-Alive

Попробуйте добавить заголовок Accept: */*? Небольшое исследование показывает, что это довольно распространенная практика, чтобы отфильтровать запросы, которые пропускают этот заголовок, потому что они, как правило, боты.

...