近日,日语教员在微信中问大家谁能帮她把沪江日语的美文及录音下载下来。
登上教员给的网址http://jp.hjenglish.com/new/p423987/
发现,没有可以供点击下载的接口,O(∩_∩)O哈哈~。
在众人起哄声中,为了荣誉为了尊严为了世界和平~呼啦啦~
于是使用python爬虫一试。
用火狐浏览器将页面打开,右键查看元素。
我们在元素里面找到了有用的信息
HJPlayer.init("hjptype=song&player=2&playerID=1&bg=0xE9F7FE&leftbg=0x73BE44&lefticon=0xFFFFFF&rightbg=0xFFAA00&rightbghover=0x999999&righticon=0xFFFFFF&righticonhover=0xffffff&text=0x666666&slider=0x666666&track=0xFFFFFF&border=0x666666&loader=0x9FFFB8&soundFile=http://f1.w.hjfile.cn/doc/201210/Mp3ABCut_Output_20121023_15.46.54031082586.mp3&autostart=false&width=290&height=24");
其中里面有这么一句是我们想要的
soundFile=http://f1.w.hjfile.cn/doc/201210/Mp3ABCut_Output_20121023_15.46.54031082586.mp3
新建一个窗口打开这个soundFile=后面的链接,正是日语美文录音
接下来我们又在元素中找到了日语美文的中日文标题和中日文文章
我们发现日文标题和日文的div class="langs_en"
而中文标题和中文译文则是div class="langs_cn"
看到这心情是很高兴的,好了,准备工作到这里就完成了。O(∩_∩)O哈哈~
ps:我们这里采用的python环境是eclipse+python2.7.9
我们伪装成浏览器构造了一个请求用来向指定的地址获取网页数据,ps:沪江网站站点不加headers会出现报警信息。
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'
}
req = urllib2.Request(
url = 'http://jp.hjenglish.com/new/p423987/',
headers = headers
)
res = urllib2.urlopen(req)
content= res.read()
在获取到页面数据后,我们用到re模块中的findall函数,用来查找所有在soundFile=之后和&autostart之前的字符串,也就是我们要的http://f1.w.hjfile.cn/doc/201210/Mp3ABCut_Output_20121023_15.46.54031082586.mp3,不得不说,网站源码写得真是很清晰很规律,好了,返回格式是一个字符串列表。
然后在mp3这个字符串列表中使用urllib模块中的urlretrieve函数进行页面mp3格式文件的下载,其中,name为下载文件后的保存名。
mp3 = re.findall(".*soundFile=(.*)&autostart.*",content)
i=1
for x in mp3:
name = str(i)+".mp3"
i=i+1
urllib.urlretrieve(x,name)
运行代码,该页面的所有日语录音都涌入了我们的怀抱
O(∩_∩)O哈哈~
然后我们将页面中的中日文标题及课文爬下来。
这里我们用到了第三方BeautifulSoup库,它通过定位HTML标签来格式化和组织复杂的网络信息,用简单易用的Python对象为我们展现XML结构信息,由于BeautiSoup库不是Python标准库,因此需要单独安装。
用以下代码来对页面中所有中日文标题和文章进行爬取。
html = urllib2.urlopen(req)
bsObj = BeautifulSoup(html)
title_jp = bsObj.findAll("div",{"class":"langs_en"})
title_cn = bsObj.findAll("div",{"class":"langs_cn"})
并且构造输出语句,查看是否爬取成功。
for title_jp1 in title_jp:
print title_jp1.get_text()
for title_cn1 in title_cn:
print title_cn1.get_text()
get it!
这里我想将中日文直接保存为txt文件,却尴尬的遇上了编码问题,搞蒙圈了。
据说Python3可以完美解决。
写到这里,真是困了困了…