使⽤Python编写简单⽹络爬⾍抓取视频下载资源
我第⼀次接触爬⾍这东西是在今年的5⽉份,当时写了⼀个博客搜索引擎,所⽤到的爬⾍也挺智能的,起码⽐电影来了这个站⽤到的爬⾍⽔平⾼多了!
回到⽤Python写爬⾍的话题。
Python⼀直是我主要使⽤的脚本语⾔,没有之⼀。Python的语⾔简洁灵活,标准库功能强⼤,平常可以⽤作计算器,⽂本编码转换,图⽚处理,批量下载,批量处理⽂本等。总之我很喜欢,也越⽤越上
⼿,这么好⽤的⼀个⼯具,⼀般⼈我不告诉他。。。
因为其强⼤的字符串处理能⼒,以及urllib2,cookielib,re,threading这些模块的存在,⽤Python来写爬⾍就简直易于反掌了。简单到什么程度呢。我当时跟某同学说,我写电影来了⽤到的⼏个爬⾍以
及数据整理的⼀堆零零散散的脚本代码⾏数总共不超过1000⾏,写电影来了这个⽹站也只有150来⾏代码。因为爬⾍的代码在另外⼀台64位的⿊苹果上,所以就不列出来,只列⼀下VPS上⽹站的代
码,tornadoweb框架写的
[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⼀下爬⾍的编写流程。以下内容仅供交流学习使⽤,没有别的意思。
以某湾的最新视频下载资源为例,其⽹址是
因为该⽹页⾥有⼤量⼴告,只贴⼀下正⽂部分内容:
对于⼀个python爬⾍,下载这个页⾯的源代码,⼀⾏代码⾜以。这⾥⽤到urllib2库。
>>> import urllib2
>>> html = urllib2.urlopen('某piratebay.se/browse/200').read()
>>> print 'size is', len(html)
size is 52977
当然,也可以⽤os模块⾥的system函数调⽤wget命令来下载⽹页内容,对于掌握了wget或者curl⼯具的同学是很⽅便的。
使⽤Firebug观察⽹页结构,可以知道正⽂部分html是⼀个table。每⼀个资源就是⼀个tr标签。
⽽对于每⼀个资源,需要提取的信息有:
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%3A80&tr=udp%3A%2F%2Ftracker.publicbt%3A80&tr=udp%3A 
  <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或者DOM树的⼯具是有原因的。我之前试过⽤BeautifulSoup3来提取内容,后来发觉速度实在是慢死了啊,⼀秒钟能够处理100个内容,已经是我电脑的极
限了。。。⽽换了正则表达式,编译后处理内容,速度上直接把它秒杀了!
提取这么多内容,我的正则表达式要如何写呢?
根据我以往的经验,“.*?”或者“.+?”这个东西是很好使的。不过也要注意⼀些⼩问题,实际⽤到的时候就会知道
对于上⾯的tr标签代码,我⾸先需要让我的表达式匹配到的符号是
<tr>
表⽰内容的开始,当然也可以是别的,只要不要错过需要的内容即可。然后我要匹配的内容是下⾯这个,获取视频分类。
(<a href="/browse/205" title="此⽬录中更多">电视</a>)
接着我要匹配资源链接了,
<a href="..." class="detLink" title="...">...</a>
再到其他资源信息,
font class="detDesc">已上传 <b>3 ;分钟前</b>, ⼤⼩ 2 GiB, 上传者
最后匹配
</tr>
⼤功告成!
当然,最后的匹配可以不需要在正则表达式⾥表⽰出来,只要开始位置定位正确了,后⾯获取信息的位置也就正确了。
对正则表达式⽐较了解的朋友,可能知道怎么写了。我Show⼀下我写的表达式处理过程,
就这么简单,结果出来了,⾃我感觉挺欢喜的。
当然,这样设计的爬⾍是有针对性的,定向爬取某⼀个站点的内容。也没有任何⼀个爬⾍不会对收集到的链接进⾏筛选。通常可以使⽤BFS(宽度优先搜索算法)来爬取⼀个⽹站的所有页⾯链接。
完整的Python爬⾍代码,爬取某湾最新的10页视频资源:
# coding: utf8
import urllib2
import re
import pymongo
db = pymongo.Connection().test
url = '某piratebay.se/browse/200/%d/3'
find_re = repile(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数据库,同时可能因为⽆法访问某湾⽹站⽽⽆法得到正常结果。
所以说,电影来了⽹站⽤到的爬⾍不难写,难的是获得数据后如何整理获取有⽤信息。例如,如何匹配⼀个影⽚信息跟⼀个资源,如何在影⽚信息库和视频链接之间建⽴关联,这些都需要不断尝试各种⽅法,最后选出⽐较靠谱的。
曾有某同学发邮件想花钱也要得到我的爬⾍的源代码。
网页计算器html代码
要是我真的给了,我的爬⾍就⼏百来⾏代码,⼀张A4纸,他不会说,坑爹啊……
都说现在是信息爆炸的时代,所以⽐的还是谁的数据挖掘能⼒强
好吧,那么问题来了学习挖掘机(数据)技术到底哪家强?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。