Python img Download - HTTP Error 404: Not Found

Status
Für weitere Antworten geschlossen.

Asthos

Benutzer
Mitglied seit
18. Aug 2017
Beiträge
18
Punkte für Reaktionen
0
Punkte
1
Hallo liebe Forenmitglieder,

folgendes Problem:
auf dem Rechner (BS: Linux mint 19.2) habe ich die Python IDE Pycharm mit python3.6 installiert.
Hier funktioniert das downloaden einer image-Datei eines beystimmten Servers ohne Probleme:

Code:
from urllib.request import Request, urlopen, urlretrieve
image_url = 'http://.....'
file_name = '1.jpg'
urlretrieve(image_url, file_name)

wenn ich nun via Diskstation die .py Datei einplane bricht diese immer ab.
Nach ein wenig suchen konnte ich zumindest den genaueren Fehler finden:
Die Exception meint:
"HTTP Error 404: Not Found"
dies ist sehr mysteriös, da die URL im Browser (Firefox) immer das Bild zeigt.

Probiert habe ich neben urlretrieve auch mal einfach das Modul urlopen von urllib.request genommen und dabei mal den header geändert:
Code:
import utllib
headers = {}
headers['User-Agent'] = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0'
url='http://.....'
req = urllib.request.Request(url, headers = headers)
try:
    resp = urllib.request.urlopen(req)
except Exception as e:
    print(str(e))

(den User-Agent hatte ich mir aus dem Firefox kopiert)
Leider kein Erfolg. Somit konnte ich auch das Modul shutil nicht nutzen.

Habt ihr noch eine Idee, welche Einstellungen ich im Coding noch vornehmen könnte, oder ggf. auf der DS?

Im Grunde funktioniert aber das Modul urlretrieve auch auf der DS, da z.B. das Bild:
https://www.synology-forum.de/images/style_syno/misc/logo.png
heruntergeladen werden konnte (hier ist die Endung, ob .jpg / .gif oder .png unerheblich):

Code:
from urllib.request import urlretrieve
image_url = 'https://www.synology-forum.de/images/style_syno/misc/logo.png'
file_name = '1.png'
urlretrieve(image_url, file_name)

Also alles sehr mysteriös.:confused:
 

Asthos

Benutzer
Mitglied seit
18. Aug 2017
Beiträge
18
Punkte für Reaktionen
0
Punkte
1
Hm keiner eine Idee?

gibt es denn eigentlich eine Möglichkeit, einem Browser auf der DS zu starten um zu überprüfen, ob von der DS aus überhaupt die Seite anzusteuern geht?
Bisher konnte ich dies nicht finden (zumal es eigentlich auch nicht nötig ist, auf einer DS einen eigenen Browser zu installieren, aber egal)
und auf eine separate VW auf der DS wollte ich noch nicht gehen.

VG Asthos
 

4bob

Benutzer
Mitglied seit
04. Mai 2016
Beiträge
604
Punkte für Reaktionen
2
Punkte
38
Hallo Asthos,

ich kann das nicht nachstellen. Hast du python3 auf der DS als Paket installiert? Synology oder Community? Achte beim Aufruf auf eindeutige Pfade. Installiert hab ich python2+3 von Syno.
z.B der letzte Code Schnipsel schaut dann so aus bei mir:

root@DiskStation:~# which python
/bin/python
root@DiskStation:~# which python3
/usr/local/bin/python3
root@DiskStation:~# which python3.5
/usr/local/bin/python3.5
root@DiskStation:~# python3 test.py
File "/usr/local/lib/python3.7/urllib/request.py", line 1387, in unknown_open
raise URLError('unknown url type: %s' % type)
urllib.error.URLError: <urlopen error unknown url type: https>

Rich (BBCode):
python3.5 test.py
root@DiskStation:~# ls -la |grep *.png
-rw-r--r-- 1 root root 5969 Sep 9 21:25 1.png


Um Links zu prüfen nutze curl, so etwa:
Rich (BBCode):
curl -O https://www.synology-forum.de/images/style_syno/misc/logo.png
Und als Browser sollte eine Coder links nutzen ;)
Findest du hier: https://synocommunity.com/package/links

Bob
 

Asthos

Benutzer
Mitglied seit
18. Aug 2017
Beiträge
18
Punkte für Reaktionen
0
Punkte
1
Hallo Bob,

ich hab sowohl Python 2 (Paket Python Module) auf Grund des Card-Dav Servers als auch Python 3 (Version 3.5.1-0108) auf der DS laufen.

Meine Pfade sind nicht anders:
which python -> /bin/python
which python3 -> /usr/local/bin/python3
which python3.5 -> /usr/local/bin/python3.5

ausgeführt wurde das Pythonscript ja via den Aufgabenplaner.
Ich habe nun aber per ssh nochmal den Run gestartet mit dem folgenden code:

Code:
from urllib.request import urlretrieve
image_url = 'http://85.xx.xxx.xx/xxxxx/xxxxxxx/xxx/01.jpg'
file_name = '1.jpg'
try:
    urlretrieve(image_url, file_name)
except Exception as e:
    print(e)

alsoin der Konsole:

xxxxx$ python3.5 testfile.py

einmal für url: https://www.synology-forum.de/images/style_syno/misc/logo.png
und einmal mit meiner zu wünschenden Url.

wie gesagt es hat auch hier (via SSH) nur das erste Bild heruntergeladen, d.h. an und für sich funktioniert der Code.

Auf curl bin ich noch nicht so gekommen und hab es auch gleich ausprobiert:
Bildschirmfoto vom 2019-09-10 22-48-06.png

Die Datei wurde also downgeloaded mit der Größe 5,4KB:

Bildschirmfoto vom 2019-09-10 22-49-48.png

Im Firefox wird aber eine Größe des Bildes mit 859,59kb angegeben:

Bildschirmfoto vom 2019-09-10 22-50-17.png

D.h. für mich, dass mit curl die Imagedatei fehlerhaft downgeloaded wurde.
(Bestätigend dazu, dass man die Datei nicht geöffnet bekommt)

Ich denke aus meiner laienhafter Sicht gibt es irgendein Schutzmechanismus auf der Serverseite um solche Anfragen zu blockieren. Diese sollte aber umgangen werden können, da man im Browser ja die Bild-Datei downloaden kann. Da ist wohl die Frage: Nur wie? :confused:
 

4bob

Benutzer
Mitglied seit
04. Mai 2016
Beiträge
604
Punkte für Reaktionen
2
Punkte
38
Hi Asthos,
Nutze curl im Verbose Mode:
Rich (BBCode):
curl -O --verbose https://www.synology-forum.de/images/style_syno/misc/logo.png

Oder noch ein Tipp; Richte dir pip ein, wenn nicht bereits geschehen :) Und anschließend httpie
Rich (BBCode):
pip install httpie

download:
Rich (BBCode):
http https://www.synology-forum.de/images/style_syno/misc/logo.png >  logo.png
ansehen & vergleiche die Dateigrößen auf der DS :
Rich (BBCode):
http https://www.synology-forum.de/images/style_syno/misc/logo.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: Keep-Alive
Content-Length: 5969
Content-Type: image/png
Date: Wed, 11 Sep 2019 18:19:47 GMT
ETag: "1751-50e97de6ba380"
Keep-Alive: timeout=5, max=100
Last-Modified: Sun, 08 Feb 2015 18:31:58 GMT
Server: Apache

+-----------------------------------------+
| NOTE: binary data not shown in terminal |
+-----------------------------------------+

(env) root@DiskStation:~# ls -la logo.png
-rw-r--r-- 1 root root 5969 Sep 11 20:18 logo.png

Mehr Hilfe ist nicht möglich, ohne eine Beispiel URL.
Bob
 

Asthos

Benutzer
Mitglied seit
18. Aug 2017
Beiträge
18
Punkte für Reaktionen
0
Punkte
1
Hallo Bob,

das konnte ich mir schon vorstelle.

Dann gebe ich nochmal folgendes an:

curl -O --verbose http://85.14.254.67/manga/kapitel/951/01.jpg
(hab es besser Editiert)
% Total: 0
% Received: 0
% Xferd: 0
Average Dload: 0
Speed Upload: 0
Time Total: --:--:--
Time Spent --:--:--
Time Left --:--:--
Current Speed: 0
> GET /manga/kapitel/951/01.jpg HTTP/1.1
> Host: 85.14.254.67
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Pragma: no-cache
< Connection: close
< Content-type: text/html; charset=utf-8
< Content-Length: 5543
<
{ [2896 bytes data]
100 5543 100 5543 0 0 231k 0 --:--:-- --:--:-- --:--:-- 235k
 

4bob

Benutzer
Mitglied seit
04. Mai 2016
Beiträge
604
Punkte für Reaktionen
2
Punkte
38
Hallo Asthos;

Ich hab keine Probleme auf meiner DS das JPG zu laden.
Rich (BBCode):
(env) root@DiskStation:~# http http://85.14.254.67/manga/kapitel/951/01.jpg
HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 880592
Content-Type: image/jpeg
Date: Wed, 18 Sep 2019 19:23:11 GMT
ETag: "5d43d232-d6fd0"
Last-Modified: Fri, 02 Aug 2019 06:03:30 GMT
Server: nginx

+-----------------------------------------+
| NOTE: binary data not shown in terminal |
+-----------------------------------------+

Rich (BBCode):
(env) root@DiskStation:~# ls -la |grep 01.jpg
-rw-r--r-- 1 root root 880592 Sep 18 21:22 01.jpg
Rich (BBCode):
(env) root@DiskStation:~# curl -O --verbose http://85.14.254.67/manga/kapitel/951/01.jpg
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0> GET /manga/kapitel/951/01.jpg HTTP/1.1
> Host: 85.14.254.67
> User-Agent: curl/7.51.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx
< Date: Wed, 18 Sep 2019 19:24:37 GMT
< Content-Type: image/jpeg
< Content-Length: 880592
< Last-Modified: Fri, 02 Aug 2019 06:03:30 GMT
< Connection: keep-alive
< ETag: "5d43d232-d6fd0"
< Accept-Ranges: bytes
<
{ [1203 bytes data]
100 859k 100 859k 0 0 173k 0 0:00:04 0:00:04 --:--:-- 219k

Wie bereits angenommen, brauchst also keine Code Anpassung.
Dein Linux PC und die DS sind gleich konfiguriert fürs Netzwerk? Wie?
Gibts Proxy/Filter oder Firewall/Router die deine DS hier ausbremsen?

Bob
 

Asthos

Benutzer
Mitglied seit
18. Aug 2017
Beiträge
18
Punkte für Reaktionen
0
Punkte
1
Dein Linux PC und die DS sind gleich konfiguriert fürs Netzwerk? Wie?
Gibts Proxy/Filter oder Firewall/Router die deine DS hier ausbremsen?

Manchmal sieht man den Wald vor lauter Bäumen nicht.
Erst hatte ich gedacht es lag am neu eingerichteten Pi-Hole als DNS-Filter in meinem Netz (aber dann hätte es ja auch auf dem Rechner nicht geklappt)
dann hatte ich nochmal die Filter im Router (Fritz.Box) überprüft und da war der Fehler auch schon gefunden.

Die DS hatte ich damals im Standardprofil mit einer Blacklist und dem BPjM-Modul ("jugendgefährdende Internetseiten sperren") versehen.
Bei meinen Rechner aber nicht. Anscheinend enthält der Server jugendgefährdende Inhalte...

Vielen Dank nochmal für die Ratschläge die dann zum Ziel führten.
Die genannten Anweisungen in der Shell werde ich mir auch mal näher zu Gemüte führen.

Heute hast du wiedermal einen User glücklich gemacht @4bob
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat