回到用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一下爬虫的编写流程。以下内容仅供交流学习使用,没有别的意思。
以某湾的最新视频下载资源为例,其网址是
http://某piratebay.se/browse/200
因为该网页里有大量广告,只贴一下正文部分内容:
对于一个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标签。
而对于每一个资源,需要提取的信息有:
1、视频分类
2、资源名称
3、资源链接
4、资源大小
5、上传时间
就这么多就够了,如果有需要,还可以增加。
首先提取一段tr标签里的代码来观察一下。
视频
(电视)
The Walking Dead Season 3 Episodes 1-3 HDTV-x264
已上传 3 分钟前, 大小 2 GiB, 上传者 paridha
0
0
下面用正则表达式来提取html代码中的内容。对正则表达式不了解的同学,可以去 http://docs.python.org/2/library/re.html 了解一下。
为何要用正则表达式而不用其他一些解析HTML或者DOM树的工具是有原因的。我之前试过用BeautifulSoup3来提取内容,后来发觉速度实在是慢死了啊,一秒钟能够处理100个内容,已经是我电脑的极限了。。。而换了正则表达式,编译后处理内容,速度上直接把它秒杀了!
提取这么多内容,我的正则表达式要如何写呢?
根据我以往的经验,“.*?”或者“.+?”这个东西是很好使的。不过也要注意一些小问题,实际用到的时候就会知道
对于上面的tr标签代码,我首先需要让我的表达式匹配到的符号是
表示内容的开始,当然也可以是别的,只要不要错过需要的内容即可。然后我要匹配的内容是下面这个,获取视频分类。
(电视)
接着我要匹配资源链接了,
再到其他资源信息,
font class="detDesc">已上传 3 分钟前, 大小 2 GiB, 上传者
最后匹配
大功告成!
当然,最后的匹配可以不需要在正则表达式里表示出来,只要开始位置定位正确了,后面获取信息的位置也就正确了。
对正则表达式比较了解的朋友,可能知道怎么写了。我Show一下我写的表达式处理过程,
就这么简单,结果出来了,自我感觉挺欢喜的。
当然,这样设计的爬虫是有针对性的,定向爬取某一个站点的内容。也没有任何一个爬虫不会对收集到的链接进行筛选。通常可以使用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'.+?\(.+?">(.+?).+?class="detLink".+?">(.+?).+?(.+?), 大小 (.+?),', 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纸,他不会说,坑爹啊!!!……都说现在是信息爆炸的时代,所以比的还是谁的数据挖掘能力强
好吧,那么问题来了学习挖掘机(数据)技术到底哪家强?
推荐阅读
如何解决《如何从新行设置数组的每个元素》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何在代码优先迁移中强制删除并重新创建选定的表?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《尝试执行迁移时模型的未处理挂起操作》经验,为你挑选了0个好方法。 ... [详细] 如何解决《Xcode命令行测试执行问题》经验,为你挑选了1个好方法。 ... [详细] 如何解决《将字符串拆分为数组并修剪每个值的有效方法-Swift》经验,为你挑选了1个好方法。 ... [详细] 如何解决《django-在查询集上切片/过滤后过滤,其中结果已被限制》经验,为你挑选了2个好方法。 ... [详细] 如何解决《Laravel5:Apachephphttp认证》经验,为你挑选了0个好方法。 ... [详细] 如何解决《SQLServer-正确分解付款》经验,为你挑选了1个好方法。 ... [详细] 如何解决《SwiftPureMVC:不符合NSObjectProtocol》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Sitecore“随机”对象引用未设置为对象的实例》经验,为你挑选了0个好方法。 ... [详细] 如何解决《滚动并获取具有对资源的特定访问权限的用户列表》经验,为你挑选了1个好方法。 ... [详细] 如何解决《错误C2355:'this':只能在非静态成员函数或非静态数据成员初始值设定项中引用》经验,为你挑选了1个好方法。 ... [详细] 如何解决《从inquirer.js菜单运行protractor.js测试》经验,为你挑选了0个好方法。 ... [详细] 如何解决《使用JAAS从webapp1登录webapp2》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何使用sorted()一次对两列进行排序》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何刷新(F5)并使用AngularJS获取另一个页面?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何水平居中UICollectionView细胞?》经验,为你挑选了6个好方法。 ... [详细] 如何解决《如何组合2个SQL查询并检索累积计数?》经验,为你挑选了0个好方法。 ... [详细] 如何解决《两个线程如何"进入""同步"方法》经验,为你挑选了1个好方法。 ... [详细] 如何解决《为什么scalaz.NonEmptyList不支持像"find"这样的常见列表操作》经验,为你挑选了1个好方法。 ... [详细]吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1在"文本"小部件中重新绑定"全选"
- 2当我不关心调用约定时,我是否应该更喜欢__fastcall上的"默认"调用约定?
- 3将php输出保存在文件中
- 4Linq到实体的联盟订单
- 5StyleCop Madness:受保护的领域
- 6在Android中的CURL
- 7SimpleDB Manager
- 8我如何在godaddy为s3托管网站转发domain.com到www.domain.com?
- 9如何检查是否提供了液体模板的所有值?
- 10Symfony2/Memcached集成
- 11调试时会打开.class文件而不是.java
- 12button_to使用GET方法
- 13如何从ipodlibrary获取歌曲并使用AVPlayer播放
- 14Java - 为PC/Mac创建独立GUI应用程序的任何方法?
- 15是否有任何工具可以在iOS应用运行时生成对象图?
- 16IOS重复接口定义
- 17防止包装菜单项
- 18如何在android中保存图像和表面视图?
- 19Symfony/Doctrine中的SQL注入
- 20DataGridView:使用数组或List <t>添加新行
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有