Давным давно писал для своего приложения, приложение так и не закончил, а класс парсера вот решил "отдать в опенсурс". Может кому интересно будет. Код под катом, архив можно скачать клацнув сюда.
Все претензии к качеству кода предъявлять вон той стене.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib, urllib2
import re
import sys
from radiolist import TOP
class ProstoPleer(object):
def __init__(self):
pass
def _parse(self, page):
raw_playlist = ""
try:
raw_playlist = re.search('<ol id="search-results".*>(.*?)</ol>', page).group()
except:
print("Наебнулся пока пытался получить список песен")
raw_soungs = []
try:
raw_soungs = re.findall("<li(.*?)>", raw_playlist)
except:
print("Наебнулся пока парсил инфу о песнях из списка")
soungs = []
for raw_soung in raw_soungs:
if (raw_soung == ""):
continue
try:
duration = re.search('duration="(.*?)"', raw_soung).group(1)
file_id = re.search('file_id="(.*?)"', raw_soung).group(1)
singer = re.search('singer="(.*?)"', raw_soung).group(1)
song = re.search('song="(.*?)"', raw_soung).group(1)
link = re.search('link="(.*?)"', raw_soung).group(1)
rate = re.search('rate="(.*?)"', raw_soung).group(1)
size = re.search('size="(.*?)"', raw_soung).group(1)
soungs.append({ "duration": duration,
"file_id": file_id,
"singer": singer,
"song": song,
"link": link,
"rate": rate,
"size": size
})
except:
print("Наебнулся пока парсил песенку: ")
print(raw_soung)
return soungs
def search(self, query):
url = "http://prostopleer.com/search?q=%s" % urllib.quote_plus(query)
page = urllib2.urlopen(url).read()
return self._parse(page)
def top(self, city, radio):
if ((city != "msk") and (city != "spb")): return []
#if radio not in TOP[city].keys(): return []
url = "http://prostopleer.com/top/%s/%s" % (city, radio)
page = urllib2.urlopen(url).read()
return self._parse(page)
def getmp3(self, file_id):
response = urllib2.urlopen("http://prostopleer.com/download/%s" % file_id)
return response.geturl()
Вот так, например, пишется простой парсер радио Максимум.
from backend import ProstoPleer
import urllib
pp = ProstoPleer()
for song in pp.top("msk", "maximum"):
print "Start: %(singer)s - %(song)s.mp3 ..." % song
urllib.urlretrieve(pp.getmp3(song["file_id"]), u"./Maximum/%(singer)s-%(song)s.mp3" % song)
print "done.\n"
А можно взять и сделать его многопоточным (никогда так не делайте, пощадите их сервера):
from backend import ProstoPleer
import urllib, os
import thread
pp = ProstoPleer()
def download(song):
print "Start: %(singer)s - %(song)s (%(rate)s).mp3 ..." % song
urllib.urlretrieve(song["file"], u"./Record/%(singer)s-%(song)s.mp3" % song)
print "... %(singer)s - %(song)s (%(rate)s).mp3 done.\n" % song
for song in pp.top("spb", "radiorecord"):
song["file"] = pp.getmp3(song["file_id"])
thread.start_new_thread(download, (song,))