使用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里隐藏的“禅”
Jun 16 Python
Python实现豆瓣图片下载的方法
May 25 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
详解Python 数据库 (sqlite3)应用
Dec 07 Python
详解Python pygame安装过程笔记
Jun 05 Python
详解django三种文件下载方式
Apr 06 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
python正则表达式的懒惰匹配和贪婪匹配说明
Jul 13 Python
Python configparser模块应用过程解析
Aug 14 Python
python将图片转为矢量图的方法步骤
Mar 30 Python
python源码剖析之PyObject详解
May 18 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 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多图上传小程序代码
2011/07/17 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
Python 功能和特点(新手必学)
2015/12/30 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
基于HTML5的WebGL经典3D虚拟机房漫游动画
2017/11/15 HTML / CSS
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
六年级情感作文之500字
2019/10/23 职场文书
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js