2017-05-05 49 views
0

音频源链接我写一个脚本来从一个网站的音频源链接。通过抓取主页面获取可用链接的列表。但是当我抓取生成的链接时,我找不到源代码。 (应该是内部的<音频>标记的HREF)。获取来自网站与Python

这里是我的代码:

# -*- coding: utf-8 -*- 
import urllib.request 
from bs4 import BeautifulSoup 

def getHTML(st): 
    with urllib.request.urlopen(site+'/',timeout=100) as response: 
     return response.read() 

site = 'http://www.e-radio.gr' 
soup = BeautifulSoup(getHTML(site), 'html.parser') 
# Parse Main Page And get links 
lst = list() 

for a in soup.body.find_all('a', {'class' : 'erplayer'}): 
    item = a.get('href') 
    if site in item: 
     lst.append(item) 
    else: 
     lst.append(site + item) 

print("\n".join(lst)) 

看来,网站无法正确加载并使用urllib.request里它不会加载音频信号源。还有什么我可以使用,而不是urllib.request,所以它等待整个页面加载。我还以为是使用一些外部Web浏览器来生成HTML,但我不知道该怎么做

+0

你可以发布你需要的链接的HTML吗?音频链接html – Exprator

+0

网站链接在代码中。这是我的代码,你可以运行它 –

+0

权,但如果我们运行的代码,我们可以看到印刷的音频链接。问题是什么? – alecxe

回答

3

这是一个有点棘手,但我们可以接近循序渐进 - 首先通过获取玩家的HTML按照iframe链接。然后,获取Flash播放器链接并关注它。然后,提取链接到mp3并下载流。所有在同一个网络抓取会话下:

from urllib.parse import urljoin 

import requests 
from bs4 import BeautifulSoup 


def download_file(session, link, path): 
    r = session.get(link, stream=True) 
    if r.status_code == 200: 
     with open(path, 'wb') as f: 
      for chunk in r: 
       f.write(chunk) 


base_url = "http://www.e-radio.gr" 
url = "http://www.e-radio.gr/Rainbow-89-Thessaloniki-i92/live" 

with requests.Session() as session: 
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'} 
    response = session.get(url) 

    soup = BeautifulSoup(response.content, "html.parser") 
    frame = soup.find(id="playerControls1") 
    frame_url = urljoin(base_url, frame["src"]) 

    response = session.get(frame_url) 
    soup = BeautifulSoup(response.content, "html.parser") 
    link = soup.select_one(".onerror a")['href'] 
    flash_url = urljoin(response.url, link) 

    response = session.get(flash_url) 
    soup = BeautifulSoup(response.content, "html.parser") 
    mp3_link = soup.select_one("param[name=flashvars]")['value'].split("url=", 1)[-1] 
    print(mp3_link) 

    download_file(session, mp3_link, "download.mp3")