2014-10-27 3 views
1

Если я использую urllib для загрузки этого URL-адреса (https://www.fundingcircle.com/my-account/sell-my-loans/), я получаю ошибку состояния 400.Почему я не могу загрузить эту страницу с помощью Python?

например. Следующие возвращает 400 ошибки

>>> import urllib 
>>> f = urllib.urlopen("https://www.fundingcircle.com/my-account/sell-my-loans/") 
>>> print f.read() 

Однако, если скопировать и вставить URL в браузере, я вижу веб-страницу с информацией, которую я хочу видеть.

Я попытался использовать попытку, кроме, а затем прочитал ошибку. Но возвращаемые данные просто говорят мне, что страница не существует. например

import urllib 
try: 
    f = urllib.urlopen("https://www.fundingcircle.com/my-account/sell-my-loans/") 
except Exception as e: 
    eString = e.read() 
    print eString 

Почему Python не может загружать страницу?

+0

У вас есть разрешение от financecircle.com на очистку их сайта? –

+0

Вопрос агента пользователя? – Phix

+0

Puciek, согласно их T & C's, они знают, что люди это делают, но пока у них нет политики. – Ginger

ответ

5

Если Python получает статус 404, это может быть связано с тем, что сервер отказывается предоставить вам страницу.

Почему, что трудно понять, потому что серверы являются черными ящиками. Но ваш браузер дает серверу больше, чем просто URL, он также дает ему набор заголовков HTTP. Скорее всего, сервер изменяет поведение, основанное на содержимом одного или нескольких из этих заголовков.

Необходимо найти в своем браузере инструменты для разработки и просмотреть, что браузер отправил, а затем попытаться выполнить репликацию этих заголовков из Python. Очевидными кандидатами являются заголовок User-Agent, а затем Accept и Cookie заголовки.

Однако в этом конкретном случае сервер отвечает 401 Несанкционированным; вам предоставляется страница входа в систему. Он делает это как для браузера и Python:

>>> import urllib 
>>> urllib.urlopen('https://www.fundingcircle.com/my-account/sell-my-loans/') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 87, in urlopen 
    return opener.open(url) 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 208, in open 
    return getattr(self, name)(url) 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 451, in open_https 
    return self.http_error(url, fp, errcode, errmsg, headers) 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 372, in http_error 
    result = method(url, fp, errcode, errmsg, headers) 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 683, in http_error_401 
    errcode, errmsg, headers) 
    File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/urllib.py", line 381, in http_error_default 
    raise IOError, ('http error', errcode, errmsg, headers) 
IOError: ('http error', 401, 'Unauthorized', <httplib.HTTPMessage instance at 0x1066f9a28>) 

но Питона urllib не имеет обработчика для кода 401 статуса и превращает это в исключительных случаях.

Тело ответа содержит форму входа; вам придется писать код для входа в систему и, предположительно, отслеживать файлы cookie.

Эта задача будет намного проще с использованием более специализированных инструментов. Вы можете использовать robobrowser, чтобы загрузить страницу, проанализировать форму и предоставить вам инструменты для ее заполнения, а затем отправить форму для вас и отслеживать файлы cookie, необходимые для того, чтобы вы вошли в систему. Он построен поверх отличных requests и BeautifulSoup библиотеки.

Смежные вопросы