2015-01-23 2 views
2

Я пытаюсь получить следующий URL: http://www.winkworth.co.uk/sale/property/flat-for-sale-in-masefield-court-london-n5/HIH140004.Python urllib2 возвращает пустую строку

import urllib2 
response = urllib2.urlopen('http://www.winkworth.co.uk/rent/property/terraced-house-to-rent-in-mill-road--/WOT140129') 
response.read() 

Однако я получаю пустую строку. Когда я пробую его через браузер или cURL, он работает нормально. Любые идеи, что происходит?

+0

Является ли 'urlopen' асинхронным? Если да, может быть, она не закончена, когда вы пытаетесь ее прочитать? – BlackVegetable

+0

@BlackVegetable: nope, 'urlopen' является синхронным. Это сервер прерывается, не возвращая ничего, если нет заголовка 'Accept'. –

ответ

8

Я получил ответ при использовании библиотеки requests, но не при использовании urllib2, поэтому я экспериментировал с заголовками HTTP-заголовков.

Как выясняется, сервер ожидает заголовок Accept; urllib2 не отправляет один, requests и cURL отправить */*.

Отправить один с urllib2, а также:

url = 'http://www.winkworth.co.uk/sale/property/flat-for-sale-in-masefield-court-london-n5/HIH140004' 
req = urllib2.Request(url, headers={'accept': '*/*'}) 
response = urllib2.urlopen(req) 

Демо:

>>> import urllib2 
>>> url = 'http://www.winkworth.co.uk/sale/property/flat-for-sale-in-masefield-court-london-n5/HIH140004' 
>>> len(urllib2.urlopen(url).read()) 
0 
>>> request = urllib2.Request(url, headers={'accept': '*/*'}) 
>>> len(urllib2.urlopen(request).read()) 
37197 

Сервер виноват здесь; RFC 2616 состояния:

Если нет Accept заголовка поля нет, то предполагается, что клиент принимает все типы носителей.

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