Python爬虫豆瓣电影top100(python爬虫豆瓣电影评价代码)

http://www.itjxue.com  2023-03-28 05:57  来源:未知  点击次数: 

.利用python获得豆瓣电影前30部电影的中文片名,排名,导演,主演,上映时间

热门频道

首页

博客

研修院

VIP

APP

问答

下载

社区

推荐频道

活动

招聘

专题

打开CSDN APP

Copyright ? 1999-2020, CSDN.NET, All Rights Reserved

打开APP

python 网络爬虫 1.2 获取豆瓣TOP250电影的中英文名、港台名、导演、上映年份、电影分类以及评分,将数据存入文档。 原创

2021-07-19 01:03:15

2点赞

zynaln

码龄8年

关注

题目:

获取豆瓣TOP250电影的中英文名、港台名、导演、上映年份、电影分类以及评分,将数据存入文档。

代码:

输出结果:

文章知识点与官方知识档案匹配

Python入门技能树网络爬虫urllib

201761 人正在系统学习中

打开CSDN APP,看更多技术内容

最新发布 用python爬取豆瓣影评及影片信息(评论时间、用户ID、评论内容)

用python爬取豆瓣影评及影片信息(评论时间、用户ID、评论内容)

继续访问

python

写评论

7

14

2

分享

从零开始学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、获取网页请求

2、解析获取的网页

3、提速数据

4、保存文件

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()

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

python爬虫抓取电影top20排名怎么写

初步接触python爬虫(其实python也是才起步),发现一段代码研究了一下,觉得还比较有用处,Mark下。?

上代码:

#!/usr/bin/python#coding=utf-8#Author: Andrew_liu#mender:cy"""

一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称

Anthor: Andrew_liu

mender:cy

Version: 0.0.2

Date: 2017-03-02

Language: Python2.7.12

Editor: JetBrains PyCharm 4.5.4

"""import stringimport reimport urllib2import timeclass DouBanSpider(object) :

"""类的简要说明

主要用于抓取豆瓣Top100的电影名称

Attributes:

page: 用于表示当前所处的抓取页面

cur_url: 用于表示当前争取抓取页面的url

datas: 存储处理好的抓取到的电影名称

_top_num: 用于记录当前的top号码

"""

def __init__(self):

self.page = 1

self.cur_url = "h0?start={page}filter=type="

self.datas = []

self._top_num = 1

print u"豆瓣电影爬虫准备就绪, 准备爬取数据..."

def get_page(self, cur_page):

"""

根据当前页码爬取网页HTML

Args:

cur_page: 表示当前所抓取的网站页码

Returns:

返回抓取到整个页面的HTML(unicode编码)

Raises:

URLError:url引发的异常

"""

url = self.cur_url ? ? ? ?try:

my_page = urllib2.urlopen(url.format(page=(cur_page - 1) * 25)).read().decode("utf-8") ? ? ? ?except urllib2.URLError, e: ? ? ? ? ? ?if hasattr(e, "code"): ? ? ? ? ? ? ? ?print "The server couldn't fulfill the request."

print "Error code: %s" % e.code ? ? ? ? ? ?elif hasattr(e, "reason"): ? ? ? ? ? ? ? ?print "We failed to reach a server. Please check your url and read the Reason"

print "Reason: %s" % e.reason ? ? ? ?return my_page ? ?def find_title(self, my_page):

"""

通过返回的整个网页HTML, 正则匹配前100的电影名称

Args:

my_page: 传入页面的HTML文本用于正则匹配

"""

temp_data = []

movie_items = re.findall(r'span.*?class="title"(.*?)/span', my_page, re.S) ? ? ? ?for index, item in enumerate(movie_items): ? ? ? ? ? ?if item.find("nbsp") == -1:

temp_data.append("Top" + str(self._top_num) + " " + item)

self._top_num += 1

self.datas.extend(temp_data) ? ?def start_spider(self):

"""

爬虫入口, 并控制爬虫抓取页面的范围

"""

while self.page = 4:

my_page = self.get_page(self.page)

self.find_title(my_page)

self.page += 1def main():

print u"""

###############################

一个简单的豆瓣电影前100爬虫

Author: Andrew_liu

mender: cy

Version: 0.0.2

Date: 2017-03-02

###############################

"""

my_spider = DouBanSpider()

my_spider.start_spider()

fobj = open('/data/moxiaokai/HelloWorld/cyTest/blogcode/top_move.txt', 'w+') ? ?for item in my_spider.datas: ? ? ? ?print item

fobj.write(item.encode("utf-8")+'\n')

time.sleep(0.1) ? ?print u"豆瓣爬虫爬取完成"if __name__ == '__main__':

main()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

运行结果:?

?

(责任编辑:IT教学网)

更多

推荐Javascript/Ajax文章