有了上次利用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.查看网页源代码
打开上面的网址,查看源代码,可以看到信息的展示结构如下:
12
- 3
4395 1 6 7108 9
113812 13 肖申克的救赎 14 / The Shawshank Redemption 15 / 月黑高飞(港) / 刺激1995(台) 16 17 18 19 [可播放] 2021223723 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /... 24 1994 / 美国 / 犯罪 剧情 25
26 27 2829 9.6 30 646374人评价 3132 3334 希望让人自由。 35
36
其中1代表排名,肖申克的救赎代表电影名,其他信息的含义也很容易能看出来。
于是接下来可以写正则表达式:
1 pattern = re.compile(u'.*?.*?' 2 + u'(.*?).*?' 3 + u'.*?(.*?)' 4 + u'.*?(.*?).*?' 5 + u'(.*?).*?.*?' 6 + u'.*?.*?' 7 + u'导演: (.*?) ' 8 + u'主演: (.*?)' 9 + u'(.*?) / (.*?) / ' 10 + u'(.*?)' 11 + u'.*?.*?(.*?)' 12 + u'.*?(.*?)人评价.*?.*?' 13 + u'(.*?).*?', re.S)
在此处flag参数re.S代表多行匹配。
3.使用面向对象的设计模式编码
代码如下:
1 # -*- coding:utf-8 -*- 2 __author__ = 'Jz' 3 import urllib2 4 import re 5 import sys 6 7 class MovieTop250: 8 def __init__(self): 9 #设置默认编码格式为utf-8 10 reload(sys) 11 sys.setdefaultencoding('utf-8') 12 self.start = 0 13 self.param = '&filter=&type=' 14 self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'} 15 self.movieList = [] 16 self.filePath = 'D:/coding_file/python_file/File/DoubanTop250.txt' 17 18 def getPage(self): 19 try: 20 URL = 'http://movie.douban.com/top250?start=' + str(self.start) 21 request = urllib2.Request(url = URL, headers = self.headers) 22 response = urllib2.urlopen(request) 23 page = response.read().decode('utf-8') 24 pageNum = (self.start + 25)/25 25 print '正在抓取第' + str(pageNum) + '页数据...' 26 self.start += 25 27 return page 28 except urllib2.URLError, e: 29 if hasattr(e, 'reason'): 30 print '抓取失败,具体原因:', e.reason 31 32 def getMovie(self): 33 pattern = re.compile(u'.*?.*?' 34 + u'(.*?).*?' 35 + u'.*?(.*?)' 36 + u'.*?(.*?).*?' 37 + u'(.*?).*?.*?' 38 + u'.*?.*?' 39 + u'导演: (.*?) ' 40 + u'主演: (.*?)' 41 + u'(.*?) / (.*?) / ' 42 + u'(.*?)' 43 + u'.*?.*?(.*?)' 44 + u'.*?(.*?)人评价.*?.*?' 45 + u'(.*?).*?', re.S) 46 while self.start关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?