Эмулировать браузер для загрузки файла?

В Интернете есть файл FLV, который можно загрузить непосредственно в Chrome. Файл представляет собой телевизионную программу, опубликованную CCTV (Центральное телевидение Китая). CCTV - некоммерческая государственная вещательная компания, финансируемая китайским налогоплательщиком, которая позволяет нам загружать их контент, не нарушая авторских прав.

Используя wget, я могу загрузить файл с другого адреса, но не с адреса, который работает в Chrome.

Это то, что я пытался сделать:

url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302'  

wget -c  $url --user-agent="" -O  xfgs.f4v

Это также не работает:

wget -c  $url   -O  xfgs.f4v

Вывод:

Connecting to 118.26.57.12:80... connected.  
HTTP request sent, awaiting response... 403 Forbidden  
2013-02-13 09:50:42 ERROR 403: Forbidden.  

Что я делаю неправильно?

В конечном итоге я хочу загрузить его с помощью библиотеки Python mechanize. Вот код, который я использую для этого:

import mechanize  
br = mechanize.Browser()  
br = mechanize.Browser()  
br.set_handle_robots(False)  
br.set_handle_equiv(False)   
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]  
url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302' 
r = br.open(url).read()  
tofile=open("/tmp/xfgs.f4v","w")  
tofile.write(r)  
tofile.close()

Это результат:

Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open  
   return self._mech_open(url, data, timeout=timeout)  
  File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open  
raise response  
mechanize._response.httperror_seek_wrapper: HTTP Error 403: Forbidden

Может кто-нибудь объяснить, как получить код mechanize для работы?

Ответы

Ответ 1

Прежде всего, если вы пытаетесь выполнить какие-либо выскабливания (да, это считается соскабливанием, даже если вы не обязательно разбираете HTML), у вас есть определенное предварительное исследование.

Если у вас еще нет Firefox и Firebug, получите их. Тогда, если у вас еще нет Chrome, получите его.

Запустите Firefox/Firebug и Chrome, очистите все ваши файлы cookie/etc. Затем откройте Firebug, а в Chrome запустите View- > Developer- > Developer Tools.

Затем загрузите основную страницу видео, которое вы пытаетесь захватить. Обратите внимание на любые файлы cookie/заголовки/POST-переменные/строковые переменные запроса, которые устанавливаются при загрузке страницы. Возможно, вы захотите сохранить эту информацию.

Затем попробуйте загрузить видео еще раз, обратите внимание на любые файлы cookie/headers/post variables/query string, которые устанавливаются при загрузке видео. Весьма вероятно, что при первоначальной загрузке страницы была указана переменная cookie или POST, которая требуется для фактического вытягивания видеофайла.

Когда вы пишете свой питон, вам нужно будет как можно ближе подражать этому взаимодействию. Используйте python-requests. Вероятно, это самая простая библиотека URL-адресов, и если вы не столкнетесь с ней как-то с ней (что-то, чего она не может сделать), я бы никогда больше ничего не использовал. Во-вторых, я начал использовать python-requests, весь код для извлечения URL уменьшился в 5 раз.

Теперь, возможно, вы не будете работать в первый раз, когда вы их попробуете. Soooo, вам нужно будет загрузить основную страницу с помощью python. Распечатайте все ваши файлы cookie/заголовки/переменные POST/переменные строки запроса и сравните их с тем, что было у Chrome/Firebug. Затем попробуйте загрузить свое видео, еще раз, сравните все эти значения (это означает, что вы отправили сервер, и то, что SERVER также отправил вам обратно). Вам нужно будет выяснить, что между ними (не волнуйтесь, мы ВСЕ узнали об этом в детском саду... "одна из этих вещей не похожа на другую" ) и проанализируйте, как эта разница разрушает материал.

Если по окончанию всего этого вы все равно не сможете понять, тогда вам, вероятно, нужно будет взглянуть на HTML-страницу, содержащую ссылку на фильм. Посмотрите на любой javascript на странице. Затем используйте Firebug/Chrome Developer Tools, чтобы проверить javascript и посмотреть, выполняет ли он какое-то управление вашей пользовательской сессией. Если он каким-то образом генерирует токены (файлы cookie или POST/GET), связанные с доступом к видео, вам нужно будет эмулировать его метод токенизации в python.

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

Изменить: Уточнить шаги

  • Изучите, как поддерживается состояние.
  • Вытащить исходную страницу с помощью python, захватить любую информацию о состоянии, которая вам нужна от нее.
  • Выполнить любой токенинг, который может потребоваться с этой информацией о состоянии
  • Потяните видео, используя маркеры из шагов 2 и 3
  • Если материал взрывается, выведите заголовки запроса/ответа, файлы cookie, vars запросов, post vars и сравните их с Chrome/Firebug.
  • Вернитесь к шагу 1. пока не найдете решение

Edit: Вы также можете перенаправляться по одному из этих запросов (страница html или загрузка файла). Скорее всего, вы пропустите запрос/ответ в Firebug/Chrome, если это произойдет. Решением было бы использовать сниффер, например LiveHTTPHeaders, или, как было предложено другими респондентами, WireShark или Fiddler. Обратите внимание, что Fiddler не принесет вам пользы, если вы находитесь в Linux или OSX. Это только Windows и определенно ориентирована на .NET-разработку... (ugh). Wireshark очень полезен, но перегружен для большинства проблем, и в зависимости от того, на какой машине вы работаете, у вас могут возникнуть проблемы с его работой. Поэтому я бы предложил сначала LiveHTTPHeaders.

Мне нравится эта проблема

Ответ 2

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

Ответ 4

Предполагая, что вы не вводили URL-адрес вручную, используйте mechanize, чтобы сначала перейти на страницу, откуда вы получили это. Затем эмулируйте действие, которое вы берете, чтобы загрузить фактический файл (возможно, щелкнув ссылку или кнопку).

Это может не сработать, так как Mechanize сохраняет состояние файлов cookie и перенаправляет, но не обрабатывает изменения JavaScript в реальном времени на html-страницах. Чтобы проверить, является ли JavaScript критически важным для операции, переключите JavaScript в Chrome (или любой другой браузер) и убедитесь, что вы можете загрузить файл. Если необходим JavaScript, я бы попытался и программно управлять браузером, чтобы получить файл.

Мой обычный подход к пробуждению такого рода выскабливания -

  • попробуйте wget или pythons urllib2
  • попробуйте механизировать
  • управлять браузером

Если нет какой-либо captcha, последний обычно работает, но другие легче (и быстрее).

Ответ 5

Чтобы прояснить "почему" часть вашего вопроса, вы можете перенаправить свой браузер и ваши запросы кода через прокси-сервер отладки. Если вы используете окна, я предлагаю fiddler2. Существуют и другие прокси-серверы отладки для других платформ. Но fiddler2 определенно мой любимый.

http://www.fiddler2.com/fiddler2/

https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project

http://www.charlesproxy.com/

Или более низкий уровень http://netcat.sourceforge.net/

http://www.wireshark.org/

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

Ответ 6

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

Вам нужно будет снова открыть страницу, содержащую ссылку, используя некоторую библиотеку, которая вмещает этот сеанс (как упоминалось в других ответах). Затем попробуйте найти ссылку и использовать ее только в этом сеансе.

Ответ 7

Там есть библиотека с открытым исходным кодом, библиотека под названием ghost, которая обертывает браузер без браузера WebKit, поэтому вы можете контролировать все через простой API:

from ghost import Ghost
ghost = Ghost()

page, resources = ghost.open('http://my.web.page')

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

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

Ответ 8

В то время как текущий принятый ответ (Г. Ширер) является наилучшим советом для выскабливания в целом, я нашел способ пропустить несколько шагов - с расширение firefox, называемое cliget, которое принимает контекст запроса со всеми заголовками HTTP и куки и генерирует команду curl (или wget), которая копируется в буфер обмена.

EDIT: эта функция также доступна на сетевых панелях firebug и хром-отладчике - запрос правой кнопки мыши, "копировать как завиток"

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

(Кроме того, вы можете удалить параметр -O из командной строки curl, чтобы увидеть результат в stdout, а не загружать его в файл, и добавить -v, чтобы увидеть полный список заголовков)

Даже если вы не хотите использовать curl/wget, преобразование одной командной строки curl/wget в код python - это просто вопрос, как добавить заголовки в запрос urllib (или любую библиотеку запросов HTTP, если на то пошло)

Ответ 9

from urllib import urlopen
print urlopen(url) #python built-in high level interface to get ANY online resources, auto responds to HTTP error codes.

Ответ 10

Вы пробовали модуль запросов? это гораздо проще в использовании, чем urllib2 и pycurl и т.д. но он мощный. он имеет следующие функции: Ссылка здесь

Международные домены и URL-адреса Keep-Alive и Connection Pooling Сессии с сохранением Cookie Проверка SSL в браузере. Базовая/дайджест-аутентификация Элегантные файлы cookie/Value Автоматическая декомпрессия Единицы ответа Unicode Загрузка многостраничных файлов Тайм-ауты подключения .netrc поддержка Python 2.6-3.3 потокобезопасна.

Ответ 11

Вы можете использовать Internet Download Manager, он может захватывать и загружать любые потоковые медиа с любого веб-сайта.