豆瓣电影top250爬虫代码(豆瓣电影爬虫函数形式)

http://www.itjxue.com  2023-03-24 11:31  来源:未知  点击次数: 

从零开始学Python爬虫(四):正则表达式

Regular Expression, 正则表达式, 种使 表达式的 式对字符串进 匹配的语法规则。

我们抓取到的 源代码本质上就是 个超 的字符串, 想从 提取内容。 正则再合适不过了。

正则的优点: 速度快, 效率 , 准确性 正则的缺点: 新 上 难度有点 。

不过只要掌握了正则编写的逻辑关系, 写出 个提取 内容的正则其实并不复杂

正则的语法: 使 元字符进 排列组合 来匹配字符串

在线测试正则表达式网址:

元字符: 具有固定含义的特殊符号 常 元字符:

量词: 控制前 的元字符出现的次数

贪婪匹配和惰性匹配

这两个要着重的说 下,因为我们写爬 的最多的就是这个惰性匹配。

先看案例

那么接下来的问题是, 正则我会写了, 怎么在python程序中使 正则呢?答案是re模块

re模块中我们只需要记住这么 个功能就 够我们使 了。

下面一个案例,是练习用正则表达式提取豆瓣电影top250的数据并保存,一起来学一下吧。

Python爬虫实战(1)requests爬取豆瓣电影TOP250

爬取时间:2020/11/25

系统环境:Windows 10

所用工具:Jupyter Notebook\Python 3.0

涉及的库:requests\lxml\pandas\matplotlib\numpy

蛋肥想法: 先将电影名称、原名、评分、评价人数、分类信息从网站上爬取下来。

蛋肥想法: print数据列表后发现电影原名、分类信息等存在不需要的字符,需预先处理;同时因为后续想做一个豆瓣电影TOP250的维度分布图,而同一电影存在多个发行国家、类型(如“法国 美国 / 剧情 动作 犯罪”),为了简(偷)便(懒),这里均取第一个作为记入的数据;最后将数据保存为xlsx。

蛋肥想法: 蛋肥想知道在豆瓣电影TOP250中年份、国家、类型的维度数据,为了练手,使用刚才保存成xlsx的数据,并分别画成雷达图、柱形图、扇形图。

Python抓取豆瓣电影排行榜

1.观察url

首先观察一下网址的结构 ;filter=type= :

可以看到,问号?后有三个参数 start、filter、type,其中start代表页码,每页展示25部电影,0代表第一页,以此类推25代表第二页,50代表第三页...

filter顾名思义,是过滤已经看过的电影,filter和type在这里不重要,可以不管。

2.查看网页源代码

打开上面的网址,查看源代码,可以看到信息的展示结构如下:

1 ol class="grid_view" 2 li 3 div class="item" 4 div class="pic" 5 em class=""1/em 6 a href="" 7 img alt="肖申克的救赎" src="" class="" 8 /a 9 /div10 div class="info"11 div class="hd"12 a href="" class=""13 span class="title"肖申克的救赎/span14 span class="title" / The Shawshank Redemption/span15 span class="other" / 月黑高飞(港) / 刺激1995(台)/span16 /a17 18 19 span class="playable"[可播放]/span20 /div21 div class="bd"22 p class=""23 导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...br24 1994 / 美国 / 犯罪 剧情25 /p26 27 28 div class="star"29 span class="rating5-t"em9.6/em/span30 span646374人评价/span31 /div32 33 p class="quote"34 span class="inq"希望让人自由。/span35 /p36 /div37 /div38 /div39 /li

其中em class=""1/em代表排名,span class="title"肖申克的救赎/span代表电影名,其他信息的含义也很容易能看出来。

于是接下来可以写正则表达式:

1 pattern = re.compile(u'div.*?class="item".*?div.*?class="pic".*?' 2 + u'em.*?class=""(.*?)/em.*?' 3 + u'div.*?class="info".*?span.*?class="title"(.*?)' 4 + u'/span.*?span.*?class="title"(.*?)/span.*?' 5 + u'span.*?class="other"(.*?)/span.*?/a.*?' 6 + u'div.*?class="bd".*?p.*?class="".*?' 7 + u'导演: (.*?) ' 8 + u'主演: (.*?)br' 9 + u'(.*?) / (.*?) / '10 + u'(.*?)/p'11 + u'.*?div.*?class="star".*?em(.*?)/em'12 + u'.*?span(.*?)人评价/span.*?p.*?class="quote".*?'13 + u'span.*?class="inq"(.*?)/span.*?/p', 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-810 reload(sys)11 sys.setdefaultencoding('utf-8')12 self.start = 013 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 = '' + 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)/2525 print '正在抓取第' + str(pageNum) + '页数据...' 26 self.start += 2527 return page28 except urllib2.URLError, e:29 if hasattr(e, 'reason'):30 print '抓取失败,具体原因:', e.reason31 32 def getMovie(self):33 pattern = re.compile(u'div.*?class="item".*?div.*?class="pic".*?'34 + u'em.*?class=""(.*?)/em.*?'35 + u'div.*?class="info".*?span.*?class="title"(.*?)'36 + u'/span.*?span.*?class="title"(.*?)/span.*?'37 + u'span.*?class="other"(.*?)/span.*?/a.*?'38 + u'div.*?class="bd".*?p.*?class="".*?'39 + u'导演: (.*?) '40 + u'主演: (.*?)br'41 + u'(.*?) / (.*?) / '42 + u'(.*?)/p'43 + u'.*?div.*?class="star".*?em(.*?)/em'44 + u'.*?span(.*?)人评价/span.*?p.*?class="quote".*?'45 + u'span.*?class="inq"(.*?)/span.*?/p', re.S)46 while self.start = 225:47 page = self.getPage()48 movies = re.findall(pattern, page)49 for movie in movies:50 self.movieList.append([movie[0], movie[1], movie[2].lstrip(' / '),

51 movie[3].lstrip(' / '), movie[4],

52 movie[5], movie[6].lstrip(), movie[7], movie[8].rstrip(),53 movie[9], movie[10], movie[11]])54 55 def writeTxt(self):56 fileTop250 = open(self.filePath, 'w')57 try:58 for movie in self.movieList:59 fileTop250.write('电影排名:' + movie[0] + '\r\n')60 fileTop250.write('电影名称:' + movie[1] + '\r\n')61 fileTop250.write('外文名称:' + movie[2] + '\r\n')62 fileTop250.write('电影别名:' + movie[3] + '\r\n')63 fileTop250.write('导演姓名:' + movie[4] + '\r\n')64 fileTop250.write('参与主演:' + movie[5] + '\r\n')65 fileTop250.write('上映年份:' + movie[6] + '\r\n')66 fileTop250.write('制作国家/地区:' + movie[7] + '\r\n')67 fileTop250.write('电影类别:' + movie[8] + '\r\n')68 fileTop250.write('电影评分:' + movie[9] + '\r\n')69 fileTop250.write('参评人数:' + movie[10] + '\r\n')70 fileTop250.write('简短影评:' + movie[11] + '\r\n\r\n')71 print '文件写入成功...'72 finally:73 fileTop250.close()74 75 def main(self):76 print '正在从豆瓣电影Top250抓取数据...'77 self.getMovie()78 self.writeTxt()79 print '抓取完毕...'80 81 DouBanSpider = MovieTop250()82 DouBanSpider.main()

代码比较简单,最后将信息写入一个文件,没有什么需要解释的地方。

(责任编辑:IT教学网)

更多

推荐站内动态文章