使用Python编写简单网络爬虫抓取视频下载资源


Posted in Python onNovember 04, 2014

我第一次接触爬虫这东西是在今年的5月份,当时写了一个博客搜索引擎,所用到的爬虫也挺智能的,起码比电影来了这个站用到的爬虫水平高多了!

回到用Python写爬虫的话题。

Python一直是我主要使用的脚本语言,没有之一。Python的语言简洁灵活,标准库功能强大,平常可以用作计算器,文本编码转换,图片处理,批量下载,批量处理文本等。总之我很喜欢,也越用越上手,这么好用的一个工具,一般人我不告诉他。。。

因为其强大的字符串处理能力,以及urllib2,cookielib,re,threading这些模块的存在,用Python来写爬虫就简直易于反掌了。简单到什么程度呢。我当时跟某同学说,我写电影来了用到的几个爬虫以及数据整理的一堆零零散散的脚本代码行数总共不超过1000行,写电影来了这个网站也只有150来行代码。因为爬虫的代码在另外一台64位的黑苹果上,所以就不列出来,只列一下VPS上网站的代码,tornadoweb框架写的 使用Python编写简单网络爬虫抓取视频下载资源

[xiaoxia@307232 movie_site]$ wc -l *.py template/*
  156 msite.py
   92 template/base.html
   79 template/category.html
   94 template/id.html
   47 template/index.html
   77 template/search.html

下面直接show一下爬虫的编写流程。以下内容仅供交流学习使用,没有别的意思。

以某湾的最新视频下载资源为例,其网址是

http://某piratebay.se/browse/200

因为该网页里有大量广告,只贴一下正文部分内容:

使用Python编写简单网络爬虫抓取视频下载资源

对于一个python爬虫,下载这个页面的源代码,一行代码足以。这里用到urllib2库。

>>> import urllib2
>>> html = urllib2.urlopen('http://某piratebay.se/browse/200').read()
>>> print 'size is', len(html)
size is 52977

当然,也可以用os模块里的system函数调用wget命令来下载网页内容,对于掌握了wget或者curl工具的同学是很方便的。

使用Firebug观察网页结构,可以知道正文部分html是一个table。每一个资源就是一个tr标签。

使用Python编写简单网络爬虫抓取视频下载资源

而对于每一个资源,需要提取的信息有:

1、视频分类
2、资源名称
3、资源链接
4、资源大小
5、上传时间

就这么多就够了,如果有需要,还可以增加。

首先提取一段tr标签里的代码来观察一下。

<tr>
  <td class="vertTh">
   <center>
    <a href="/browse/200" title="此目录中更多">视频</a><br />
    (<a href="/browse/205" title="此目录中更多">电视</a>)
   </center>
  </td>
  <td>
<div class="detName">   <a href="/torrent/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264" class="detLink" title="细节 The Walking Dead Season 3 Episodes 1-3 HDTV-x264">The Walking Dead Season 3 Episodes 1-3 HDTV-x264</a>
</div>
<a href="magnet:?xt=urn:btih:4f63d58e51c1a4a997c6f099b2b529bdbba72741&dn=The+Walking+Dead+Season+3+Episodes+1-3+HDTV-x264&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.istole.it%3A6969&tr=udp%3A%2F%2Ftracker.ccc.de%3A80" title="Download this torrent using magnet"><img src="//static.某piratebay.se/img/icon-magnet.gif" alt="Magnet link" /></a>   <a href="//torrents.某piratebay.se/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264.7782194.TPB.torrent" title="下载种子"><img src="//static.某piratebay.se/img/dl.gif" class="dl" alt="下载" /></a><img src="//static.某piratebay.se/img/11x11p.png" /><img src="//static.某piratebay.se/img/11x11p.png" />
   <font class="detDesc">已上传 <b>3 分钟前</b>, 大小 2 GiB, 上传者 <a class="detDesc" href="/user/paridha/" title="浏览 paridha">paridha</a></font>
  </td>
  <td align="right">0</td>
  <td align="right">0</td>
 </tr>

下面用正则表达式来提取html代码中的内容。对正则表达式不了解的同学,可以去 http://docs.python.org/2/library/re.html 了解一下。

为何要用正则表达式而不用其他一些解析HTML或者DOM树的工具是有原因的。我之前试过用BeautifulSoup3来提取内容,后来发觉速度实在是慢死了啊,一秒钟能够处理100个内容,已经是我电脑的极限了。。。而换了正则表达式,编译后处理内容,速度上直接把它秒杀了!

提取这么多内容,我的正则表达式要如何写呢?

根据我以往的经验,“.*?”或者“.+?”这个东西是很好使的。不过也要注意一些小问题,实际用到的时候就会知道 使用Python编写简单网络爬虫抓取视频下载资源

对于上面的tr标签代码,我首先需要让我的表达式匹配到的符号是

<tr>

表示内容的开始,当然也可以是别的,只要不要错过需要的内容即可。然后我要匹配的内容是下面这个,获取视频分类。

(<a href="/browse/205" title="此目录中更多">电视</a>)

接着我要匹配资源链接了,

<a href="..." class="detLink" title="...">...</a>

再到其他资源信息,

font class="detDesc">已上传 <b>3 分钟前</b>, 大小 2 GiB, 上传者

最后匹配

</tr>

大功告成!

当然,最后的匹配可以不需要在正则表达式里表示出来,只要开始位置定位正确了,后面获取信息的位置也就正确了。

对正则表达式比较了解的朋友,可能知道怎么写了。我Show一下我写的表达式处理过程,

使用Python编写简单网络爬虫抓取视频下载资源

就这么简单,结果出来了,自我感觉挺欢喜的。

当然,这样设计的爬虫是有针对性的,定向爬取某一个站点的内容。也没有任何一个爬虫不会对收集到的链接进行筛选。通常可以使用BFS(宽度优先搜索算法)来爬取一个网站的所有页面链接。

完整的Python爬虫代码,爬取某湾最新的10页视频资源:

# coding: utf8
import urllib2
import re
import pymongo
db = pymongo.Connection().test
url = 'http://某piratebay.se/browse/200/%d/3'
find_re = re.compile(r'<tr>.+?\(.+?">(.+?)</a>.+?class="detLink".+?">(.+?)</a>.+?<a href="(magnet:.+?)" .+?已上传 <b>(.+?)</b>, 大小 (.+?),', re.DOTALL)
# 定向爬去10页最新的视频资源
for i in range(0, 10):
    u = url % (i)
    # 下载数据
    html = urllib2.urlopen(u).read()
    # 找到资源信息
    for x in find_re.findall(html):
        values = dict(
            category = x[0],
            name = x[1],
            magnet = x[2],
            time = x[3],
            size = x[4]
        )
        # 保存到数据库
        db.priate.save(values)
print 'Done!'

以上代码仅供思路展示,实际运行使用到mongodb数据库,同时可能因为无法访问某湾网站而无法得到正常结果。

所以说,电影来了网站用到的爬虫不难写,难的是获得数据后如何整理获取有用信息。例如,如何匹配一个影片信息跟一个资源,如何在影片信息库和视频链接之间建立关联,这些都需要不断尝试各种方法,最后选出比较靠谱的。

曾有某同学发邮件想花钱也要得到我的爬虫的源代码。
要是我真的给了,我的爬虫就几百来行代码,一张A4纸,他不会说,坑爹啊!!!……

都说现在是信息爆炸的时代,所以比的还是谁的数据挖掘能力强 使用Python编写简单网络爬虫抓取视频下载资源

好吧,那么问题来了学习挖掘机(数据)技术到底哪家强?使用Python编写简单网络爬虫抓取视频下载资源使用Python编写简单网络爬虫抓取视频下载资源使用Python编写简单网络爬虫抓取视频下载资源

Python 相关文章推荐
Python 的 Socket 编程
Mar 24 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
基于Python的接口测试框架实例
Nov 04 Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
OpenCV图像颜色反转算法详解
May 13 Python
Django REST framework 分页的实现代码
Jun 19 Python
postman传递当前时间戳实例详解
Sep 14 Python
Python的pygame安装教程详解
Feb 10 Python
编写python代码实现简单抽奖器
Oct 20 Python
Python爬虫进阶之Beautiful Soup库详解
Apr 29 Python
Python 文字识别
May 11 Python
Python爬取Coursera课程资源的详细过程
Nov 04 #Python
使用python开发vim插件及心得分享
Nov 04 #Python
Python学习笔记之os模块使用总结
Nov 03 #Python
Python中获取网页状态码的两个方法
Nov 03 #Python
Python random模块常用方法
Nov 03 #Python
Python求两个list的差集、交集与并集的方法
Nov 01 #Python
python多线程threading.Lock锁用法实例
Nov 01 #Python
You might like
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
json属性名为什么要双引号(个人猜测)
2014/07/31 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
js表单序列化判断空值的实例
2017/09/22 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
JS实现分页导航效果
2020/02/19 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
Python multiprocessing模块中的Pipe管道使用实例
2015/04/11 Python
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
python将unicode和str互相转化的实现
2020/05/11 Python
大学生的自我鉴定范文
2014/01/21 职场文书
军校大学生个人的自我评价
2014/02/17 职场文书
意向书范文
2014/03/31 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
公司领导班子民主生活会对照检查材料
2014/10/02 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis
APP界面设计技巧和注意事项
2022/04/29 杂记