urllib2.urlopen выдает 404 исключение для URL, которые открывает браузер - PullRequest
0 голосов
/ 28 августа 2010

Следующий URL (и другие подобные ему) можно открыть в браузере, но при этом urllib2.urlopen выдает исключение 404: http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=1

geturl () возвращает тот же URL (без перенаправления). Заголовки скопированы и вставлены из firebug. Я попытался передать заголовки в качестве словаря для запроса, но получил тот же результат. wget открывает URL в консоли, но не из скрипта.

код:

source_url = 'http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=2'
попробуй:

    socket.setdefaulttimeout(10)
    hdrs = [('Host','store.ovi.com'),('User-Agent','Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US;rv:1.9.0.13) Gecko/2009073021 Firefox/3.0.13 AppEngine-Google;(+http://code.google.com/appengine)'),('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),('Accept-Language','en-us,en;q=0.5'),('Accept-Encoding','gzip,deflate'),('Accept-Charset','ISO-8859-1,utf-8;q=0.7,*;q=0.7'),('Keep-Alive','115'),('Connection','keep-alive'),('Cookie','JNPRSESSID=4u4devdrt7eb6e0qem3gin47i2; s_cc=true; undefined_s=First%20Visit; s_nr=1282817443274; s_sq=%5B%5BB%5D%5D; view=Grid; menu=menuOpen; OVI_DEVICE=b5130'),('Cache-Control','max-age=0')]
ree = urllib2.Request(source_url)
    ree.addheaders = hdrs
    opener = urllib2.build_opener()
    htmlSource = opener.open(ree).read()

кроме urllib2.HTTPError, e:

    print e.code  
    print e.msg
    print e.headers

Вывод ошибки:
404
Не найдено
Дата: сб, 28 августа 2010 00:36:57 GMT
Сервер: Apache / 2.2.3 (Red Hat)
X-Powered-By: PHP / 5.2.2
Истекает: четверг, 19 ноября 1981 г., 08:52:00 по Гринвичу
Cache-Control: нет хранилища, нет кэша, необходимо повторно проверить, после проверки = 0, предварительная проверка = 0
Прагма: без кеша
Keep-Alive: тайм-аут = 7, макс = 333
Подключение: Keep-Alive
Передача-кодировка: чанки
Content-Type: text / html; кодировка = UTF-8

Что, если что, я делаю неправильно? Это ошибка? И если так, есть ли обходной путь? Спасибо!

1 Ответ

3 голосов
/ 28 августа 2010

С учетом URL-адреса, например:

http://store.ovi.com/#/applications?categoryId=20&fragment=1&page=2

Бит, который выбирают браузеры, просто:

http://store.ovi.com/

Все, что справа от этого, является «идентификатором фрагмента», который не являетсяпередается на сервер вообще (очевидно, если вы попытаетесь, это запутается).Вместо этого HTML-код, возвращаемый для URL-адреса /, будет включать загрузку JavaScript, который считывает данные #... на стороне клиента и заполняет содержимое страницы с помощью набора XMLHttpRequest s.

Webapps.реализовано так, что это большая старая проблема, потому что вы не можете просто взять HTML-контент главной страницы.Вместо этого вам нужно либо проанализировать сценарий, чтобы выяснить, откуда он получает реальные данные, либо подключить реальный браузер, чтобы выполнить все сценарии и посмотреть, с какими объектами документа вы остались.Они также, как правило, плохи для доступности и SEO.

К счастью для вас, этот сайт, кажется, помещает что-то во фрагмент, что также является допустимым путем.Похоже, что вы можете получить динамические данные страницы с URL:

http://store.ovi.com/applications?categoryId=20&fragment=1&page=1
...