Решение HTTP-ошибки 400: неверный запрос с рабочими ссылками в Google Chrome - PullRequest
0 голосов
/ 09 мая 2019

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

Я нашел следующую функцию, которая должна делать то, что я хочу:

import os.path
import urllib.request
import requests

for link in links:
    link = link.strip()
    name = link.rsplit('/', 1)[-1]
    filename = os.path.join('downloads', name)

    if not os.path.isfile(filename):
        print('Downloading: ' + filename)
        try:
            urllib.request.urlretrieve(link, filename)
        except Exception as inst:
            print(inst)
            print('  Encountered unknown error. Continuing.')

Я всегда получаю: HTTP-ошибка 400: Неверный запрос.

Я пытался настроить user-agent на фальсификацию посещения браузера (я использую Google Chrome), но это не помогло вообще. Ссылки работают, если скопированы в браузере, поэтому мне интересно, как решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Я нашел ответ на свой вопрос.

Проблема заключалась в том, что URL содержали пробелы, которые, по-видимому, не могут быть правильно прочитаны urllib.request. Решение состоит в том, чтобы сначала разобрать URL-адреса в кавычки, а затем вызвать цитируемый URL-адрес.

Это рабочий код для всех, кто сталкивается с той же проблемой:

import os.path
import urllib.request
import requests
import urllib.parse

for link in urls:
    link = link.strip()
    name = link.rsplit('/', 1)[-1]
    filename = os.path.join(name)
    quoted_url = urllib.parse.quote(link, safe=":/")

    if not os.path.isfile(filename):
        print('Downloading: ' + filename)
        try:
            urllib.request.urlretrieve(quoted_url, filename)
        except Exception as inst:
            print(inst)
            print('  Encountered unknown error. Continuing.')
0 голосов
/ 09 мая 2019

Пробелы должны быть указаны.Я использовал функцию quote для указания имени файла в вашей ссылке.Также я использовал rindex , чтобы вырезать последнюю часть в пути URL.Есть urlsplit и urlunsplit функций, которые следует использовать вместо строковых операций, но .. Я слишком ленив: D

import os.path
import urllib.request
from urllib.parse import quote

links = ['https://undpgefpims.org/attachments/6222/216410/1717887/1724973/6222_4NC_3BUR_Macedonia_Final ProDoc 30 July 2018.doc', 'https://undpgefpims.org/attachments/6214/216405/1719672/1729436/6214_4NC_Niger_ProDoc  final for DoA.doc']

for link in links:
    link = link.strip()
    name = link.rsplit('/', 1)[-1]
    filename = os.path.join('downloads', name)

    if not os.path.isfile(filename):
        print('Downloading: ' + filename)
        try:
            urllib.request.urlretrieve(link[:link.rindex('/') + 1] + quote(link[link.rindex('/') + 1:]), filename)
        except Exception as inst:
            print(inst)
            print('  Encountered unknown error. Continuing.')
...