使用selenium+BeautifulSoup+正则表达式下载公众号我要whatyouneed文章里的音乐
2017-04-12 18:42
393 查看
其实我本来是想着只用BeautifulSoup去实现的,在获取到音乐的url我在想音乐的文件名很重要,不然下载下来觉得动听但是却要听歌识曲的话就毫无意义了。
我上网查了一下搜狗可以查某个公众号的文章,但是对爬虫有限制而且只能查看往期的十篇,在知乎上的回答发现了传送门这个网站。http://chuansong.me/如果对某个公众号的内容感兴趣又想在pc端查看的话,这是个很好的网站。
所以我下一个函数去获取网页当中音乐的名字,但是我这个时候发现一个我无法解决的问题。就是requests.get()获取网页源代码的过程中音乐播放器的内容还是在缓冲的,所以源代码部分是这样的:
图片一
这个是缓冲好的结果,所以我打算独辟蹊径,改变方法,使用之前学习过的selenium的phantomJS,这个工具可以在不启动浏览器的情况下加载等待。
图片二
这是音乐的url,我是在network里的media找到再返回源代码里查找的,而且这里不是HTML结构,所以用了正则表达。
def get_one_music_url(url):
soup = get_one_soup(url)
script = soup.find_all('script')
pattren = re.compile('url:\'(.*?)\',',re.S)
music = None
for item in script:
result = re.search(pattren,str(item))
if(result):
music = result.group(1)
print(result.group(1))
return music
最后实现单页面所有文章的抓取和翻页,贴上源码。
import re
import requests
import time
import urllib
from urllib import request
from bs4 import BeautifulSoup
import os
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.PhantomJS()
wait = WebDriverWait(browser,10)
def get_one_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
html = requests.get(url, headers=headers).text
time.sleep(0.01)
return html
def get_one_soup(url):
html = get_one_html(url)
soup = BeautifulSoup(html, "lxml")
return soup
def get_one_music_url(url):
soup = get_one_soup(url)
script = soup.find_all('script')
pattren = re.compile('url:\'(.*?)\',',re.S)
music = None
for item in script:
result = re.search(pattren,str(item))
if(result):
music = result.group(1)
print(result.group(1))
return music
def get_one_page_url(url):
soup = get_one_soup(url)
articleUrl = []
pattern =re.compile('(/n/.*)',re.S)
for item in soup.find_all('a'):
result = re.search(pattern,item.get('href'))
if (result):
print("http://chuansong.me"+str(result.group(1)))
articleUrl.append("http://chuansong.me"+str(result.group(1)))
return articleUrl
def get_one_page_music(articleUrl):
for item in articleUrl:
music = get_one_music_url(item)
if music:
title = get_one_music_title(item)
download_music(music,title)
def download_music(music,title):
if title:
try:
if not os.path.isfile(title+".mp3"):
print(title+".mp3正在下载")
urllib.request.urlretrieve(music,title+".mp3")
except OSError:
print("OSError")
def get_one_music_title(url):
browser.get(url)
title=None
try:
result = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mvplayer0 > div.aplayer-info > div.aplayer-music > span.aplayer-title')))
title = result.text
print(title)
except TimeoutException:
print("TimeoutException")
return title
def get_all_page():
url='http://chuansong.me/account/newWhatYouNeed?start='
urlList = []
for i in range(53):
urlList.append(url+str(i*12))
return urlList
def main():
urlList = get_all_page()
for url in urlList:
articleUrl = get_one_page_url(url)
get_one_page_music(articleUrl)
if __name__ == '__main__':
main()
最后看看结果:
图片三
图片四
好吧下次试一试下载自己喜欢的公众号文章。
我上网查了一下搜狗可以查某个公众号的文章,但是对爬虫有限制而且只能查看往期的十篇,在知乎上的回答发现了传送门这个网站。http://chuansong.me/如果对某个公众号的内容感兴趣又想在pc端查看的话,这是个很好的网站。
所以我下一个函数去获取网页当中音乐的名字,但是我这个时候发现一个我无法解决的问题。就是requests.get()获取网页源代码的过程中音乐播放器的内容还是在缓冲的,所以源代码部分是这样的:
<div class="aplayer" id="mvplayer0"><div style="padding: 10px; font-size: 10px; text-align: center;">声音资源加载中...</div></div>但是在原网页中却是这样的
图片一
这个是缓冲好的结果,所以我打算独辟蹊径,改变方法,使用之前学习过的selenium的phantomJS,这个工具可以在不启动浏览器的情况下加载等待。
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC browser = webdriver.PhantomJS() wait = WebDriverWait(browser,10) def get_one_music_title(url): browser.get(url) title=None try: result = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mvplayer0 > div.aplayer-info > div.aplayer-music > span.aplayer-title'))) title = result.text print(title) except TimeoutException: print("TimeoutException") return title这就是获取音乐的名字的函数,设置了一个等待,超时就TimeoutException异常。By.CSS_SELECTOR是通过SELECTOR确定元素的位置,可以通过Chrome浏览器右键检查,然后选中某一元素右键copy的copy selector复制到剪贴板。
图片二
这是音乐的url,我是在network里的media找到再返回源代码里查找的,而且这里不是HTML结构,所以用了正则表达。
def get_one_music_url(url):
soup = get_one_soup(url)
script = soup.find_all('script')
pattren = re.compile('url:\'(.*?)\',',re.S)
music = None
for item in script:
result = re.search(pattren,str(item))
if(result):
music = result.group(1)
print(result.group(1))
return music
最后实现单页面所有文章的抓取和翻页,贴上源码。
import re
import requests
import time
import urllib
from urllib import request
from bs4 import BeautifulSoup
import os
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.PhantomJS()
wait = WebDriverWait(browser,10)
def get_one_html(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
}
html = requests.get(url, headers=headers).text
time.sleep(0.01)
return html
def get_one_soup(url):
html = get_one_html(url)
soup = BeautifulSoup(html, "lxml")
return soup
def get_one_music_url(url):
soup = get_one_soup(url)
script = soup.find_all('script')
pattren = re.compile('url:\'(.*?)\',',re.S)
music = None
for item in script:
result = re.search(pattren,str(item))
if(result):
music = result.group(1)
print(result.group(1))
return music
def get_one_page_url(url):
soup = get_one_soup(url)
articleUrl = []
pattern =re.compile('(/n/.*)',re.S)
for item in soup.find_all('a'):
result = re.search(pattern,item.get('href'))
if (result):
print("http://chuansong.me"+str(result.group(1)))
articleUrl.append("http://chuansong.me"+str(result.group(1)))
return articleUrl
def get_one_page_music(articleUrl):
for item in articleUrl:
music = get_one_music_url(item)
if music:
title = get_one_music_title(item)
download_music(music,title)
def download_music(music,title):
if title:
try:
if not os.path.isfile(title+".mp3"):
print(title+".mp3正在下载")
urllib.request.urlretrieve(music,title+".mp3")
except OSError:
print("OSError")
def get_one_music_title(url):
browser.get(url)
title=None
try:
result = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mvplayer0 > div.aplayer-info > div.aplayer-music > span.aplayer-title')))
title = result.text
print(title)
except TimeoutException:
print("TimeoutException")
return title
def get_all_page():
url='http://chuansong.me/account/newWhatYouNeed?start='
urlList = []
for i in range(53):
urlList.append(url+str(i*12))
return urlList
def main():
urlList = get_all_page()
for url in urlList:
articleUrl = get_one_page_url(url)
get_one_page_music(articleUrl)
if __name__ == '__main__':
main()
最后看看结果:
图片三
图片四
好吧下次试一试下载自己喜欢的公众号文章。
相关文章推荐
- SubVersion安装和使用系列文章之一:下载安装篇
- 使用gevent多线程下载豆瓣音乐
- 使用系统类NSURLSessionDownloadTask实现断点续传(音乐视频下载等)
- 使用关键字搜索公众号文章,
- idea从安装到使用技巧(有的是我下载别人的文章借用的)
- 使用Flash DownLoad编写采集器(之突破防盗连下载音乐文件)第1/4页
- 下载公众号文章中的图片,php开发公众号应用
- 使用Service实现网络音乐下载并播放
- 如何为ios酷我音乐盒下载导出的音乐文件(使用Java程序设计)
- 微信小程序使用audio组件播放音乐功能示例【附源码下载】
- 使用gevent多线程下载豆瓣音乐
- 使用 WordPress 自定义字段功能为文章添加下载按钮
- 使用URLConnection自动下载网络上的文章内容
- 使用系统类NSURLSessionDownloadTask实现断点续传(音乐视频下载等)
- 如何使用 Linux 从 Grooveshark 下载音乐
- 分享一个分层架构音乐网站源码(使用了ASP.NET+sql server 2005 无限下载)
- 使用StructureMap扩展ASP.NET MVC三层结构框架系列文章总结篇(附源码下载)
- 使用AsyncTask弹出进度条ProgressDialog,利用网上的某音乐地址下载歌曲
- 使用系统类NSURLSessionDownloadTask实现断点续传(音乐视频下载等)
- 使用百度ueditor编辑器,开发公众号编辑器,添加文章样式