鱼C论坛

 找回密码
 立即注册
查看: 2622|回复: 8

[技术交流] 爬虫~51VOA常速英语,求加精.学英语同学的福利,2012-2016年的全集哦

[复制链接]
发表于 2016-12-25 15:08:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下午花了1个多小时,去51voa踩点。发现常速英语有合集,爬虫比较简单,先做了这一个2012-2016的合集。
后续计划做①常速英语2005-2011的所有合集,②慢速英语的合集
想学英语,可以关注我后续的更新。我就不出新帖了,在这个帖子里继续更新吧。
废话不说,放代码了。
ps:其实我也是刚学的爬虫,文件名的设定还不是很好,目前只是做到了名字+年份+月份,那个小伙伴知道怎么设定具体的年+月+日的,请指教下。
  1. #51VOA下载爬虫,目前只有106页,2012-2016的更新
  2. import urllib.request
  3. import re
  4. import os
  5. import urllib.error

  6. def open_url(url):#打开地址用的
  7.     req=urllib.request.Request(url)
  8.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
  9.     page=urllib.request.urlopen(req)
  10.     html=page.read()
  11.     return html

  12. def get_mainadd(url):#主网页返回网址列表
  13.     html =open_url(url).decode('utf-8')
  14.     p = r'<a href="/VOA_Standard_English/([^"]+\.html)"'
  15.     page_addrs = re.findall(p, html)
  16.     return page_addrs

  17. def get_mp3add(url):
  18.     html=open_url(url).decode('utf-8')
  19.     p=r'<a id="mp3" href="([^"]+\.mp3)"'
  20.     mp3_addrs=re.findall(p,html)
  21.     return mp3_addrs

  22. def save_mp3(mp3_name,mp3_adds):
  23.     with open(mp3_name,'wb') as f:
  24.         f.write(mp3_adds)

  25. x=1
  26. if __name__=='__main__':
  27.     os.mkdir('51VOA_Standard')
  28.     os.chdir('51VOA_Standard')
  29.     num=input('请输入需要下载的总页面:')
  30.     a='http://www.51voa.com/VOA_Standard_'
  31.     global x
  32.     for i in range(int(num)):
  33.         try:
  34.             url=a+str(i+1)+'.html'     #总网页,可分页
  35.             page_url=get_mainadd(url)  #返回的列表还是有问题的,网址缺少了头部.
  36.             print('正在爬取第%d页,共有%d个文章'%(i+1,len(page_url)))
  37.             for j in page_url:
  38.                 new_url='http://www.51voa.com/VOA_Standard_English/'+j #分网页
  39.                 print(new_url)
  40.                 print('正在爬取第%d个网页'%x)
  41.                 x+=1
  42.                 mp3_addrs=get_mp3add(new_url) #mp3所在的网址
  43.                 for k in mp3_addrs:
  44.                     b=k.split('/')[-2]+'-'+k.split('/')[-1]
  45.                     mp3_open=open_url(k)          #打开网址
  46.                     mp3_save=save_mp3(b,mp3_open) #保存mp3,这里的程序名不能有特殊符号的,如/?等
  47.         except urllib.error.URLError as e:
  48.             if hasattr(e, 'code'):
  49.                 print(e.code)
  50.                 continue
  51.             elif hasattr(e, 'reason'):
  52.                 print(e.reason)
  53.                 continue        
  54.     print('恭喜,下载结束.后面开始努力学习英语吧')
  55.     print(' (-*-)努力吧(-*-) ')
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
jerryxjr1220 + 2 + 2 虽然对我没用,不过还是鼓励下原创!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-25 17:23:01 | 显示全部楼层
不过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-25 19:00:53 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-25 19:31:57 | 显示全部楼层
升级版,增加了字幕和文本

  1. #51VOA下载爬虫,目前只有106页,2012-2016的更新
  2. import urllib.request
  3. import re
  4. import os
  5. import urllib.error

  6. def open_url(url):#打开地址用的
  7.     req=urllib.request.Request(url)
  8.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
  9.     page=urllib.request.urlopen(req)
  10.     html=page.read()
  11.     return html

  12. def get_mainadd(url):#主网页返回网址列表
  13.     html =open_url(url).decode('utf-8')
  14.     p = r'<a href="/VOA_Standard_English/([^"]+\.html)"'
  15.     page_addrs = re.findall(p, html)
  16.     return page_addrs

  17. def get_mp3add(url):
  18.     html=open_url(url).decode('utf-8')
  19.     p=r'<a id="mp3" href="([^"]+\.mp3)"'
  20.     mp3_addrs=re.findall(p,html)
  21.     return mp3_addrs

  22. def get_irc(html):
  23.     p=r'<a id="lrc" href="(.+).lrc"'
  24.     irc_addrs=re.findall(p,html)
  25.     return irc_addrs

  26. def save_mp3(mp3_name,mp3_adds):
  27.     with open(mp3_name,'wb') as f:
  28.         f.write(mp3_adds)

  29. def save_txt(txt_name,txt_adds):
  30.     with open(txt_name,'a') as f:
  31.         f.write(txt_adds+'\n')
  32.         f.write('-------我是可耻的换行符-------\n')

  33. def save_irc(irc_name,irc_adds):
  34.     with open(irc_name,'wb') as f:
  35.         f.write(irc_adds)

  36. x=1
  37. if __name__=='__main__':
  38.     os.mkdir('51VOA_Standard')
  39.     os.chdir('51VOA_Standard')
  40.     num=input('请输入需要下载的总页面:')
  41.     a='http://www.51voa.com/VOA_Standard_'
  42.     global x
  43.     for i in range(int(num)):
  44.         try:
  45.             url=a+str(i+1)+'.html'     #总网页,可分页
  46.             page_url=get_mainadd(url)  #返回的列表还是有问题的,网址缺少了头部.
  47.             for j in page_url:
  48.                 new_url='http://www.51voa.com/VOA_Standard_English/'+j #分网页
  49.                 print(new_url)
  50.                 print('正在爬取第%d页,第%d个网页'%(i+1,x))
  51.                 x+=1

  52.                 #mp3的处理
  53.                 mp3_addrs=get_mp3add(new_url) #mp3所在的网址
  54.                 for k in mp3_addrs:
  55.                     b=k.split('/')[-2]+'-'+k.split('/')[-1]
  56.                     mp3_open=open_url(k)          #打开网址
  57.                     mp3_save=save_mp3(b,mp3_open) #保存mp3,这里的程序名不能有特殊符号的,如/?等


  58.                 #txt的处理(不知道为什么一用函数,正则返回的就是空列表,不用就好了)
  59.                 txt_1=open_url(new_url)
  60.                 html=txt_1.decode('utf-8')
  61.                 q=r'<P>(.+)</P>'
  62.                 txt_2=re.findall(q,html)
  63.                 c=b.replace('mp3','txt')     #保存后的文件名
  64.                 print('文本爬取中......')
  65.                 for m in txt_2:
  66.                     aa=save_txt(c,m)

  67.                 #irc文件的处理
  68.                 open_irc=open_url(new_url)
  69.                 open_irc1=open_irc.decode('utf-8')
  70.                 irc_addrs=get_irc(open_irc1)
  71.                 for n in irc_addrs:
  72.                     if n!=[]:
  73.                         new_irc='http://www.51voa.com'+n+'.lrc'
  74.                         new_ircopen=open_url(new_irc)
  75.                         d=b.replace('mp3','lrc') #保存后的文件名
  76.                         irc_save=save_irc(d,new_ircopen)
  77.                         print('字幕爬取中...')
  78.                     else:
  79.                         print('bbc很懒,没有字幕')
  80.                                                         
  81.         except urllib.error.URLError as e:
  82.             if hasattr(e, 'code'):
  83.                 print(e.code)
  84.                 continue
  85.             elif hasattr(e, 'reason'):
  86.                 print(e.reason)
  87.                 continue        
  88.     print('恭喜,下载结束.后面开始努力学习英语吧')
  89.     print(' (-*-)努力吧(-*-) ')
  90.                

  91.         

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-25 22:35:05 | 显示全部楼层
群主有爱心
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-26 16:56:49 | 显示全部楼层
厉害,支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-26 20:52:13 | 显示全部楼层
我的思路又变了,再爬取文本的过程中,我发现太慢了,而且爬了20页以后的,原来的正则表达式不适合当前的文本了,我绝对把程序切成3部分,lrc,mp3,和txt.
下面是更新的mp3:
MP3下载的更新内容如下:
1)增加了从第几页爬到第几页的功能
2)mp3文件的命名问题被我搞定了,现在的名字能体现具体的年月日了,哈哈哈哈哈哈===>(16-11-8) assisting-agriculture-in-kyrgyzstan-72473.mp3
3)文件创建文件是否重名检查,以便一次下载不完,可以多次来下载的.
4)增加一个记录的txt文件,记录当前下载的情况,防止自己忘记了,哈哈=====>2016-12-26 19:30 PM  从第61页下载到62页
5)最后我再笑几下,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
  1. #51VOA下载爬虫,目前只有106页,2012-2016的更新
  2. import urllib.request
  3. import re
  4. import os
  5. import urllib.error
  6. import time

  7. def open_url(url):#打开地址用的
  8.     req=urllib.request.Request(url)
  9.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
  10.     page=urllib.request.urlopen(req)
  11.     html=page.read()
  12.     return html

  13. def get_mainadd(url):#主网页返回网址列表
  14.     html =open_url(url).decode('utf-8')
  15.     p = r'<a href="/VOA_Standard_English/([^"]+\.html)"'
  16.     page_addrs = re.findall(p, html)
  17.     return page_addrs

  18. def get_pagedate(url):
  19.     html =open_url(url).decode('utf-8')
  20.     p = r'</a> ([^"]+)</li>'
  21.     page_date = re.findall(p, html)
  22.     return page_date

  23. def get_mp3add(url):
  24.     html=open_url(url).decode('utf-8')
  25.     p=r'<a id="mp3" href="([^"]+\.mp3)"'
  26.     mp3_addrs=re.findall(p,html)
  27.     return mp3_addrs

  28. def save_mp3(mp3_name,mp3_adds):
  29.     with open(mp3_name,'wb') as f:
  30.         f.write(mp3_adds)
  31.         
  32. def save_ac(txt_name,txt_adds):
  33.     with open(txt_name,'a') as f:
  34.         f.write(txt_adds+'\n')
  35.         f.write('-------我是可耻的换行符-------\n')
  36. x=1
  37. if __name__=='__main__':
  38.     #工作目录
  39.     get_cwd=os.getcwd()
  40.     new_cwd=get_cwd+'\\51VOA_Standard'
  41.     if os.path.exists(new_cwd) == True:
  42.         os.chdir(new_cwd)
  43.     else:
  44.         os.mkdir(new_cwd)
  45.         os.chdir(new_cwd)

  46.     #页面输入
  47.     num1=input('请输入开始页面:')
  48.     num2=input('请输入结束页面:')
  49.     a='http://www.51voa.com/VOA_Standard_'
  50.     global x
  51.     for i in range(int(num1),int(num2)+1):
  52.         try:
  53.             y=0                      #爬取名字列表用的
  54.             url=a+str(i)+'.html'     #总网页,可分页
  55.             page_url=get_mainadd(url)  #返回的列表还是有问题的,网址缺少了头部.
  56.             page_date=get_pagedate(url) #返回主页面各个时间的列表
  57.             for j in page_url:
  58.                 new_url='http://www.51voa.com/VOA_Standard_English/'+j #分网页
  59.                 print(new_url)
  60.                 print('正在爬取第%d页,第%d个网页'%(i,x))
  61.                 x+=1
  62.                 mp3_addrs=get_mp3add(new_url) #mp3所在的网址
  63.                 for k in mp3_addrs:
  64.                     #b=k.split('/')[-2]+'-'+k.split('/')[-1]
  65.                     mp3_open=open_url(k)          #打开网址
  66.                     b=page_date[y]+' '+j          #命名用
  67.                     b=b.replace('html','mp3')
  68.                     y+=1
  69.                     mp3_save=save_mp3(b,mp3_open) #保存mp3,这里的程序名不能有特殊符号的,如/?等
  70.         except urllib.error.URLError as e:
  71.             if hasattr(e, 'code'):
  72.                 print(e.code)
  73.                 continue
  74.             elif hasattr(e, 'reason'):
  75.                 print(e.reason)
  76.                 continue        
  77.     print('恭喜,下载结束.本次从%d页下载到%d页'%(int(num1),int(num2)))
  78.     print(' (-*-)努力学习吧(-*-) ')
  79.     tt=time.strftime("%Y-%m-%d %H:%M %p", time.localtime())
  80.    
  81.     yy=tt+'  '+'mp3从第'+num1+'页下载到'+num2+'页'
  82.     aa=save_ac('下载记录.txt',yy)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2016-12-26 21:29:20 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-27 22:25:42 | 显示全部楼层
修复了:如果网页打不开,爬虫直接从第一主网页调到第二主网页的问题(中间可能漏了50个小网页
  1. #51VOA下载爬虫,目前只有106页,2012-2016的更新
  2. import urllib.request
  3. import re
  4. import os
  5. import urllib.error
  6. import time

  7. def open_url(url):#打开地址用的
  8.     req=urllib.request.Request(url)
  9.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
  10.     page=urllib.request.urlopen(req)
  11.     html=page.read()
  12.     return html

  13. def get_mainadd(url):#主网页返回网址列表
  14.     html =open_url(url).decode('utf-8')
  15.     p = r'<a href="/VOA_Standard_English/([^"]+\.html)"'
  16.     page_addrs = re.findall(p, html)
  17.     return page_addrs

  18. def get_pagedate(url):
  19.     html =open_url(url).decode('utf-8')
  20.     p = r'</a> ([^"]+)</li>'
  21.     page_date = re.findall(p, html)
  22.     return page_date

  23. def get_mp3add(url):
  24.     html=open_url(url).decode('utf-8')
  25.     p=r'<a id="mp3" href="([^"]+\.mp3)"'
  26.     mp3_addrs=re.findall(p,html)
  27.     return mp3_addrs

  28. def save_mp3(mp3_name,mp3_adds):
  29.     with open(mp3_name,'wb') as f:
  30.         f.write(mp3_adds)
  31.         
  32. def save_ac(txt_name,txt_adds):
  33.     with open(txt_name,'a') as f:
  34.         f.write(txt_adds+'\n')
  35.         f.write('-------我是可耻的换行符-------\n')
  36. x=1
  37. if __name__=='__main__':
  38.     #工作目录
  39.     get_cwd=os.getcwd()
  40.     new_cwd=get_cwd+'\\51VOA_Standard'
  41.     if os.path.exists(new_cwd) == True:
  42.         os.chdir(new_cwd)
  43.     else:
  44.         os.mkdir(new_cwd)
  45.         os.chdir(new_cwd)

  46.     #页面输入
  47.     num1=input('请输入开始页面:')
  48.     num2=input('请输入结束页面:')
  49.     a='http://www.51voa.com/VOA_Standard_'
  50.     global x
  51.     for i in range(int(num1),int(num2)+1):
  52.         try:
  53.             y=0                      #爬取日期时间列表用的
  54.             url=a+str(i)+'.html'     #总网页,可分页
  55.             page_url=get_mainadd(url)  #返回的列表还是有问题的,网址缺少了头部.
  56.             page_date=get_pagedate(url) #返回主页面各个时间的列表
  57.             for j in page_url:
  58.                 try:
  59.                     new_url='http://www.51voa.com/VOA_Standard_English/'+j #分网页
  60.                     print(new_url)
  61.                     print('正在爬取第%d页,第%d个网页'%(i,x))
  62.                     x+=1
  63.                     mp3_addrs=get_mp3add(new_url) #mp3所在的网址
  64.                     for k in mp3_addrs:
  65.                         #b=k.split('/')[-2]+'-'+k.split('/')[-1]
  66.                         mp3_open=open_url(k)          #打开网址
  67.                         b=page_date[y]+' '+j          #命名用
  68.                         b=b.replace('html','mp3')
  69.                         y+=1
  70.                         mp3_save=save_mp3(b,mp3_open) #保存mp3,这里的程序名不能有特殊符号的,如/?等
  71.                 except urllib.error.URLError as e:
  72.                     if hasattr(e, 'code'):
  73.                         print(e.code)
  74.                         continue
  75.                     elif hasattr(e, 'reason'):
  76.                         print(e.reason)
  77.                         continue  
  78.         except urllib.error.URLError as e:
  79.             if hasattr(e, 'code'):
  80.                 print(e.code)
  81.                 continue
  82.             elif hasattr(e, 'reason'):
  83.                 print(e.reason)
  84.                 continue        
  85.     print('恭喜,下载结束.本次从%d页下载到%d页'%(int(num1),int(num2)))
  86.     print(' (-*-)努力学习吧(-*-) ')
  87.     tt=time.strftime("%Y-%m-%d %H:%M %p", time.localtime())
  88.    
  89.     yy=tt+'  '+'mp3从第'+num1+'页下载到'+num2+'页'
  90.     aa=save_ac('下载记录.txt',yy)
复制代码
)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 23:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表