Python爬虫爬取美剧网站的实现代码


Posted in Python onSeptember 03, 2016

一直有爱看美剧的习惯,一方面锻炼一下英语听力,一方面打发一下时间。之前是能在视频网站上面在线看的,可是自从广电总局的限制令之后,进口的美剧英剧等貌似就不在像以前一样同步更新了。但是,作为一个宅diao的我又怎甘心没剧追呢,所以网上随便查了一下就找到一个能用迅雷下载的美剧下载网站【天天美剧】,各种资源随便下载,最近迷上的BBC的高清纪录片,大自然美得不要不要的。

Python爬虫爬取美剧网站的实现代码

虽说找到了资源网站可以下载了,但是每次都要打开浏览器,输入网址,找到该美剧,然后点击链接才能下载。时间长了就觉得过程好繁琐,而且有时候网站链接还会打不开,会有点麻烦。正好一直在学习Python爬虫,所以今天就心血来潮来写了个爬虫,抓取该网站上所有美剧链接,并保存在文本文档中,想要哪部剧就直接打开复制链接到迅雷就可以下载啦。

Python爬虫爬取美剧网站的实现代码

其实一开始打算写那种发现一个url,使用requests打开抓取下载链接,从主页开始爬完全站。但是,好多重复链接,还有其网站的url不是我想的那么规则,写了半天也没有写出我想要的那种发散式的爬虫,也许是自己火候还不到吧,继续努力。。。

后来发现,其电视剧链接都是在文章里面,然后文章url后面有个数字编号,就像这样的http://cn163.net/archives/24016/,所以机智的我又用了之前写过的爬虫经验,解决方法就是自动生成url,其后面的数字不是可以变的吗,而且每部剧的都是唯一的,所以尝试了一下大概有多少篇文章,然后用range函数直接连续生成数来构造url。

但是很多url是不存在的,所以会直接挂掉,别担心,我们用的可是requests,其自带的status_code就是用来判断请求返回的状态的,所以只要是返回的状态码是404的我们都把它跳过,其他的都进去爬取链接,这就解决了url的问题了。

以下就是上述步骤的实现代码。

def get_urls(self):
  try:
    for i in range(2015,25000):
      base_url='http://cn163.net/archives/'
      url=base_url+str(i)+'/'
      if requests.get(url).status_code == 404:
        continue
      else:
        self.save_links(url)
  except Exception,e:
    pass

其余的就进行的很顺利了,网上找到前人写的类似的爬虫,但是只是爬取一篇文章的,所以借鉴了一下其正则表达式。自己用了BeautifulSoup还没有正则效果好,所以果断弃了,学海无涯啊。但是效果也不是那么理想,有一半左右的链接不能正确抓取,还需继续优化。

# -*- coding:utf-8 -*-
import requests 
import re
import sys
import threading
import time
reload(sys)
sys.setdefaultencoding('utf-8')
class Archives(object):

  def save_links(self,url):
    try:

      data=requests.get(url,timeout=3)
      content=data.text
      link_pat='"(ed2k://\|file\|[^"]+?\.(S\d+)(E\d+)[^"]+?1024X\d{3}[^"]+?)"'
      name_pat=re.compile(r'<h2 class="entry_title">(.*?)</h2>',re.S)
      links = set(re.findall(link_pat,content))
      name=re.findall(name_pat,content)
      links_dict = {}
      count=len(links)
    except Exception,e:
      pass
    for i in links:
      links_dict[int(i[1][1:3]) * 100 + int(i[2][1:3])] = i#把剧集按s和e提取编号
    try:
      with open(name[0].replace('/',' ')+'.txt','w') as f:
        print name[0]
        for i in sorted(list(links_dict.keys())):#按季数+集数排序顺序写入
          f.write(links_dict[i][0] + '\n')
      print "Get links ... ", name[0], count
    except Exception,e:
      pass

  def get_urls(self):
    try:
      for i in range(2015,25000):
        base_url='http://cn163.net/archives/'
        url=base_url+str(i)+'/'
        if requests.get(url).status_code == 404:
          continue
        else:
          self.save_links(url)
    except Exception,e:
      pass
  def main(self):
    thread1=threading.Thread(target=self.get_urls())
    thread1.start()
    thread1.join()
  if __name__ == '__main__':
  start=time.time()
  a=Archives()
  a.main()
  end=time.time()
  print end-start

完整版代码,其中还用到了多线程,但是感觉没什么用,因为Python的GIL的缘故吧,看似有两万多部剧,本以为要很长时间才能抓取完成,但是除去url错误的和没匹配到的,总共抓取时间20分钟不到。搞得我本来还想使用Redis在两台Linux上爬取,但是折腾了一番之后感觉没必要,所以就这样吧,后面需要更大数据的时候再去弄。

还有过程中遇到一个很折磨我的问题是文件名的保存,必须在此抱怨一下,txt文本格式的文件名能有空格,但是不能有斜线、反斜线、括号等。就是这个问题,一早上的时间都花在这上面的,一开始我以为是抓取数据的错误,后面查了半天才发现是爬取的剧名中带有斜杠,这可把我坑苦了。

本文作者:码农网 ? 肖豪

Python 相关文章推荐
Python help()函数用法详解
Mar 11 Python
python基于右递归解决八皇后问题的方法
May 25 Python
Python优化技巧之利用ctypes提高执行速度
Sep 11 Python
python的exec、eval使用分析
Dec 11 Python
python模块之paramiko实例代码
Jan 31 Python
用TensorFlow实现lasso回归和岭回归算法的示例
May 02 Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 Python
Python中new方法的详解
Jan 15 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
Jul 23 Python
Python socket处理client连接过程解析
Mar 18 Python
基于python图书馆管理系统设计实例详解
Aug 05 Python
Python选课系统开发程序
Sep 02 #Python
简单谈谈Python中函数的可变参数
Sep 02 #Python
Python实现自动添加脚本头信息的示例代码
Sep 02 #Python
利用Python获取操作系统信息实例
Sep 02 #Python
好用的Python编辑器WingIDE的使用经验总结
Aug 31 #Python
Linux下为不同版本python安装第三方库
Aug 31 #Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
Aug 30 #Python
You might like
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
JavaScript事件学习小结(一)事件流
2016/06/09 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
js中DOM事件绑定分析
2018/03/18 Javascript
layer.alert回调函数执行关闭弹窗的实例
2019/09/11 Javascript
通过Kettle自定义jar包供javascript使用
2020/01/29 Javascript
JS实现简单打字测试
2020/06/24 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
python实现中文分词FMM算法实例
2015/07/10 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
python 获取url中的参数列表实例
2018/12/18 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
python实现简单的tcp 文件下载
2020/09/16 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
eDreams葡萄牙:全球最大的在线旅行社之一
2019/04/15 全球购物
机电专业毕业生求职信
2013/10/27 职场文书
需求分析说明书
2014/05/09 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
新教师教学工作总结
2015/08/12 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
Android Gradle 插件自定义Plugin实现注意事项
2022/06/16 Java/Android