Python爬虫----抓取豆瓣电影Top250
2015-10-21 22:41
946 查看
有了上次利用python爬虫抓取糗事百科的经验,这次自己动手写了个爬虫抓取豆瓣电影Top250的简要信息。
1.观察url
首先观察一下网址的结构 http://movie.douban.com/top250?start=0&filter=&type= :
可以看到,问号?后有三个参数 start、filter、type,其中start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页...
filter顾名思义,是过滤已经看过的电影,filter和type在这里不重要,可以不管。
2.查看网页源代码
打开上面的网址,查看源代码,可以看到信息的展示结构如下:
其中<em class="">1</em>代表排名,<span class="title">肖申克的救赎</span>代表电影名,其他信息的含义也很容易能看出来。
于是接下来可以写正则表达式:
在此处flag参数re.S代表多行匹配。
3.使用面向对象的设计模式编码
代码如下:
代码比较简单,最后将信息写入一个文件,没有什么需要解释的地方。
4.运行截图
5.问题说明
打开文件浏览时发现有个别电影没有抓取下来或者信息中出现html代码,后来排查发现是因为豆瓣有部分电影的信息不全,缺少主演等导致html代码出现差异而导致正则表达式没有匹配到或者匹配出错。
1.观察url
首先观察一下网址的结构 http://movie.douban.com/top250?start=0&filter=&type= :
可以看到,问号?后有三个参数 start、filter、type,其中start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页...
filter顾名思义,是过滤已经看过的电影,filter和type在这里不重要,可以不管。
2.查看网页源代码
打开上面的网址,查看源代码,可以看到信息的展示结构如下:
<ol class="grid_view"> <li> <div class="item"> <div class="pic"> <em class="">1</em> <a href="http://movie.douban.com/subject/1292052/"> <img alt="肖申克的救赎" src="http://img3.douban.com/view/movie_poster_cover/ipst/public/p480747492.jpg" class=""> </a> </div> <div class="info"> <div class="hd"> <a href="http://movie.douban.com/subject/1292052/" class=""> <span class="title">肖申克的救赎</span> <span class="title"> / The Shawshank Redemption</span> <span class="other"> / 月黑高飞(港) / 刺激1995(台)</span> </a> <span class="playable">[可播放]</span> </div> <div class="bd"> <p class=""> 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br> 1994 / 美国 / 犯罪 剧情 </p> <div class="star"> <span class="rating5-t"><em>9.6</em></span> <span>646374人评价</span> </div> <p class="quote"> <span class="inq">希望让人自由。</span> </p> </div> </div> </div> </li>
其中<em class="">1</em>代表排名,<span class="title">肖申克的救赎</span>代表电影名,其他信息的含义也很容易能看出来。
于是接下来可以写正则表达式:
pattern = re.compile(u'<div.*?class="item">.*?<div.*?class="pic">.*?' + u'<em.*?class="">(.*?)</em>.*?' + u'<div.*?class="info">.*?<span.*?class="title">(.*?)' + u'</span>.*?<span.*?class="title">(.*?)</span>.*?' + u'<span.*?class="other">(.*?)</span>.*?</a>.*?' + u'<div.*?class="bd">.*?<p.*?class="">.*?' + u'导演: (.*?) ' + u'主演: (.*?)<br>' + u'(.*?) / (.*?) / ' + u'(.*?)</p>' + u'.*?<div.*?class="star">.*?<em>(.*?)</em>' + u'.*?<span>(.*?)人评价</span>.*?<p.*?class="quote">.*?' + u'<span.*?class="inq">(.*?)</span>.*?</p>', re.S)
在此处flag参数re.S代表多行匹配。
3.使用面向对象的设计模式编码
代码如下:
# -*- coding:utf-8 -*- __author__ = 'Jz' import urllib2 import re import sys class MovieTop250: def __init__(self): #设置默认编码格式为utf-8 reload(sys) sys.setdefaultencoding('utf-8') self.start = 0 self.param = '&filter=&type=' self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'} self.movieList = [] self.filePath = 'D:/coding_file/python_file/File/DoubanTop250.txt' def getPage(self): try: URL = 'http://movie.douban.com/top250?start=' + str(self.start) request = urllib2.Request(url = URL, headers = self.headers) response = urllib2.urlopen(request) page = response.read().decode('utf-8') pageNum = (self.start + 25)/25 print '正在抓取第' + str(pageNum) + '页数据...' self.start += 25 return page except urllib2.URLError, e: if hasattr(e, 'reason'): print '抓取失败,具体原因:', e.reason def getMovie(self): pattern = re.compile(u'<div.*?class="item">.*?<div.*?class="pic">.*?' + u'<em.*?class="">(.*?)</em>.*?' + u'<div.*?class="info">.*?<span.*?class="title">(.*?)' + u'</span>.*?<span.*?class="title">(.*?)</span>.*?' + u'<span.*?class="other">(.*?)</span>.*?</a>.*?' + u'<div.*?class="bd">.*?<p.*?class="">.*?' + u'导演: (.*?) ' + u'主演: (.*?)<br>' + u'(.*?) / (.*?) / ' + u'(.*?)</p>' + u'.*?<div.*?class="star">.*?<em>(.*?)</em>' + u'.*?<span>(.*?)人评价</span>.*?<p.*?class="quote">.*?' + u'<span.*?class="inq">(.*?)</span>.*?</p>', re.S) while self.start <= 225: page = self.getPage() movies = re.findall(pattern, page) for movie in movies: self.movieList.append([movie[0], movie[1], movie[2].lstrip(' / '), movie[3].lstrip(' / '), movie[4], movie[5], movie[6].lstrip(), movie[7], movie[8].rstrip(), movie[9], movie[10], movie[11]]) def writeTxt(self): fileTop250 = open(self.filePath, 'w') try: for movie in self.movieList: fileTop250.write('电影排名:' + movie[0] + '\r\n') fileTop250.write('电影名称:' + movie[1] + '\r\n') fileTop250.write('外文名称:' + movie[2] + '\r\n') fileTop250.write('电影别名:' + movie[3] + '\r\n') fileTop250.write('导演姓名:' + movie[4] + '\r\n') fileTop250.write('参与主演:' + movie[5] + '\r\n') fileTop250.write('上映年份:' + movie[6] + '\r\n') fileTop250.write('制作国家/地区:' + movie[7] + '\r\n') fileTop250.write('电影类别:' + movie[8] + '\r\n') fileTop250.write('电影评分:' + movie[9] + '\r\n') fileTop250.write('参评人数:' + movie[10] + '\r\n') fileTop250.write('简短影评:' + movie[11] + '\r\n\r\n') print '文件写入成功...' finally: fileTop250.close() def main(self): print '正在从豆瓣电影Top250抓取数据...' self.getMovie() self.writeTxt() print '抓取完毕...' DouBanSpider = MovieTop250() DouBanSpider.main()
代码比较简单,最后将信息写入一个文件,没有什么需要解释的地方。
4.运行截图
5.问题说明
打开文件浏览时发现有个别电影没有抓取下来或者信息中出现html代码,后来排查发现是因为豆瓣有部分电影的信息不全,缺少主演等导致html代码出现差异而导致正则表达式没有匹配到或者匹配出错。
相关文章推荐
- 09python生成文件脚本
- Window 下搭建OSQA系统
- Python -- 装饰器
- windows 装 python ipython
- 3.4 textwrap--格式化文本库(2)
- 64位的win7配置python、pip、numpy、scipy、matplotlib
- Python -- lambda, map, filter
- python文件操作之标准文件/命令行参数
- python staticmethod and classmethod方法
- Python list 操作
- python 实现 九九乘法表【eclipse 编辑器】
- Python的在线编辑环境
- Python -- 闭包
- 在pythonanywhere部署你的第一个应用
- python 数据处理学习pandas之DataFrame(二)
- [LeetCode]题解(python):030-Substring with Concatenation of All Words
- Python之继承
- python中super出现的TypeError: must be type, not classobj 原因及解决
- Python包和模块
- 「Python」利用OpenGL作渲染以及离屏渲染