使用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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
Python使用sax模块解析XML文件示例
Apr 04 Python
Pandas中Series和DataFrame的索引实现
Jun 27 Python
使用python搭建服务器并实现Android端与之通信的方法
Jun 28 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
Jun 23 Python
Python保存并浏览用户的历史记录
Apr 29 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设置静态内容缓存时间的方法
2014/12/01 PHP
php对xml文件的增删改查操作实现方法分析
2017/05/19 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
JS设计模式之惰性模式(二)
2017/09/29 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
python 接收处理外带的参数方法
2018/12/03 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Python lxml模块的基本使用方法分析
2019/12/21 Python
pytorch中图像的数据格式实例
2020/02/11 Python
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
电子信息专业自荐书
2014/02/04 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
安徽导游词
2015/02/12 职场文书
岗位聘任报告
2015/03/02 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
新娘婚礼致辞
2015/07/27 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
python-for x in range的用法(注意要点、细节)
2021/05/10 Python