使用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小程序
Aug 15 Python
pygame学习笔记(3):运动速率、时间、事件、文字
Apr 15 Python
Python处理文本换行符实例代码
Feb 03 Python
Python爬虫工程师面试问题总结
Mar 22 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
python实现画出e指数函数的图像
Nov 21 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
详细分析Python collections工具库
Jul 16 Python
Python实现扫码工具的示例代码
Oct 09 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
Python之基础函数案例详解
Aug 30 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
PHP抓取远程图片(含不带后缀的)教程详解
2016/10/21 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
jQuery 解析xml文件
2009/08/09 Javascript
js 居中漂浮广告
2010/03/21 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
vue 使用插槽分发内容操作示例【单个插槽、具名插槽、作用域插槽】
2020/03/06 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
蔻驰法国官网:COACH法国
2018/11/14 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
error和exception有什么区别
2012/10/02 面试题
思想作风纪律整顿心得体会
2014/09/04 职场文书
高中生学习计划书
2014/09/15 职场文书
住房抵押登记委托书
2014/09/27 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
2016大学生暑期社会实践心得体会
2016/01/14 职场文书
《时代广场的蟋蟀》读后感:真挚友情,温暖世界!
2020/01/08 职场文书