Очистка данных Python - PullRequest
       17

Очистка данных Python

8 голосов
/ 30 августа 2011

Я хочу скачать пару песен с http://www.youtube -mp3.org / .Я использую urllib2 и BeautifulSoup .

Проблема в том, что когда я urllib2 открываю сайт с подключенным моим идентификатором видео, http://www.youtube -mp3.org /? C# v = lV7r8PiuecQ , я получаю сайт, но они хитрые и загружают информацию после начальной загрузки страницы некоторыми js-файлами ajax.Поэтому, когда я пытаюсь очистить URL ссылки на скачивание, буквально ее нет на странице, потому что она не была загружена.

Кто-нибудь знает, как я могу запустить этот загрузчик js в моем скрипте python, иличто-то?

Вот соответствующий пустой HTML ДО того, как в него будет загружен нужный контент.

<div id="link_box" style="display:none">
   <div id="link_box_title" style="font-weight:bold; text-decoration:underline">
   </div>
   <div class="row">
    <div id="link_box_bb_code_title" style="font-weight:bold">
    </div>
    <input type="text" id="BBCodeLink" onclick="sAll(this)" />
   </div>
   <div class="row">
    <div id="link_box_html_code_title" style="font-weight:bold">
    </div>
    <input type="text" id="HTMLLink" onclick="sAll(this)" />
   </div>
   <div class="row">
    <div id="link_box_direct_code_title" style="font-weight:bold">
    </div>
    <input type="text" id="DirectLink" onclick="sAll(this)" />
   </div>
  </div>
  <div id="v-ads">
  </div>
  <div id="dl_link">
  </div>
  <div id="progress">
  </div>
  <div id="loader">
   <img src="ajax-loader-b.gif" alt="loading.." width="16" height="11" />
  </div>
 </div>
 <div class="clear">
 </div>
</div>

Ответы [ 3 ]

10 голосов
/ 30 августа 2011

API основан на JSON, поэтому содержимое html-файлов не даст вам никакого представления о том, где искать файлы.Хорошей идеей при изучении таких веб-сервисов является открытие вкладки «Сеть» в инструментах разработчика Chrome и просмотр страниц, которые он загружает при взаимодействии со страницей.Это упражнение показало мне, что два URL особенно интересны:

  1. http://www.youtube -mp3.org / api / pushItem /? Item = http% 3A // www.youtube.com /смотреть% 3Fv% 3DKMU0tzLwhbE & xy = trve & r = 1314700829128
  2. http://www.youtube -mp3.org / api / itemInfo /? video_id = KMU0tzLwhbE & adloc = & r = 1314700829314 1011 *1011* 1011

    Первый URL-адрес представляет собой очередь для обработки файла, второй - для получения статуса задания на обработку.

    Второй URL-адрес принимает параметр GET video_id, который является идентификатором видео на YouTube (http://www.youtube.com/watch?v=KMU0tzLwhbE)), и возвращает состояние задания декодирования. Второе и третье для этой цели не имеют значения, которое можно проверить с помощьютестовая загрузка URL с дополнительными параметрами и без них.

    Содержимое страницы:

    info = { "title" : "Developers", 
             "image" : "http://i4.ytimg.com/vi/KMU0tzLwhbE/default.jpg", 
             "length" : "3", "status" : "serving", "progress_speed" : "", 
             "progress" : "", "ads" : "", 
             "h" : "a0aa17294103c638fa7f5e0606f839d3" };
    

    . Это данные JSON. Интересным в этом является "a0aa17294103c638fa7f5e0606f839d3", которыйвыглядит как хеш, который веб-служба использует для ссылки на декодированный mp3-файл. Также проверьте, как выглядит ссылка для загрузки на главной странице:

    http://www.youtube -mp3.org / get? video_id= KMU0tzLwhbE & h = a0aa17294103c638fa7f5e0606f839d3

    Теперь мы собрали все недостающие фрагменты головоломки. Сначала мы возьмем URL-адрес видео на YouTube (http://www.youtube.com/watch?v=iKP7DZmqdbU) url цитирует его и передает его API, используя этоURL:

    http://www.youtube -mp3.org / api / pushItem /? item = http% 3A // www.youtube.com / watch% 3Fv% 3DiKP7DZmqdbU & xy = trve

    Тогда подождиза несколько секунд до завершения задания декодирования:

    http://www.youtube -mp3.org / api / itemInfo /? video_id = iKP7DZmqdbU

    Возьмите хеш, найденный вИнформационный URL для построения URL для загрузки:

    http://www.youtube -mp3.org / get? video_id = iKP7DZmqdbU & h = 2e4b61b6ddc8bf83f5a0e4e4ee0635bb

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

    Тестовый код:

    from re import findall
    from time import sleep
    from urllib import urlopen, quote
    
    yt_code = 'gijypDkEqUA'
    
    yt_url = 'http://www.youtube.com/watch?v=%s' % yt_code
    push_url_fmt = 'http://www.youtube-mp3.org/api/pushItem/?item=%s&xy=trve'
    info_url_fmt = 'http://www.youtube-mp3.org/api/itemInfo/?video_id=%s'
    download_url_fmt = 'http://www.youtube-mp3.org/get?video_id=%s&h=%s'
    push_url = push_url_fmt % quote(yt_url)
    data = urlopen(push_url).read()
    sleep(10)
    info_url = info_url_fmt % yt_code
    data = urlopen(info_url).read()
    res = findall('"h" : "([^"]*)"', data)
    download_url = download_url_fmt % (yt_code, res[0])
    print 'Download here:', download_url
    
4 голосов
/ 30 августа 2011

Вы можете использовать селен для взаимодействия с js, а затем комбинировать его с BeautifulSoup или делать все с селеном, как вам нравится.

http://seleniumhq.org/

Selenium - это инструмент для автоматизации браузера, имеющий привязки для нескольких языков, включая Python. Он берет запущенный экземпляр Firefox / IE / Chrome и позволяет вам его написать (я предлагаю использовать для этой простой задачи веб-драйвер selenium, а не весь сервер selenium).

2 голосов
/ 30 августа 2011

Вам придется пройти через http://www.youtube -mp3.org / client.js и выяснить точную информацию, которая передается, это может разрешить отправить запрос, разобрать ответ и загрузить с правильного очищенного URL.

...