Python爬取豆瓣Top250电影中2000年后上映的影片信息

Python爬取豆瓣Top250电影中2000年后上映的影片信息

前言

双十一前加在京东购物车的一个东西,价格330,Plus会员用券后差不多310。双十一当天打开看了下399,还得去抢满300减100的券。不得不说,套路真的深,京东是越来越没底线,吐槽一下。

考虑写个爬虫把部分商品信息价格优惠记录一下,近期忙到吐血,也没开始尝试。看大家第一条爬虫教学都是爬豆瓣电影信息(不过大多都已经不能运行,豆瓣的格式改过了),果真是娱乐至上的年代啊。。

我也遵从前辈们走过的路,来一遍爬取豆瓣Top250电影


准备

环境:Python2.7.15 64-bit
依赖库:urllib2

urllib2安装

pip install urllib2

urllib2简介

这段转自:https://blog.csdn.net/qq_41185868/article/details/80488303

urllib和urllib2之间PK
1、在python中,urllib和urllib2不可相互替代的。 整体来说,urllib2是urllib的增强,但是urllib中有urllib2中所没有的函数。
      urllib2可以用urllib2.openurl中设置Request参数,来修改Header头。如果你访问一个网站,想更改User Agent(可以伪装你的浏览器),你就要用urllib2.
      urllib支持设置编码的函数,urllib.urlencode,在模拟登陆的时候,经常要post编码之后的参数,所以要想不使用第三方库完成模拟登录,你就需要使用urllib。
     urllib一般和urllib2一起搭配使用
2、urllib 和urllib2都是接受URL请求的相关模块,但是提供了不同的功能。两个最显著的不同如下:
      urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
      urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等(伪装浏览器)。
      urllib2模块比较优势的地方是urlliburllib2.urlopen可以接受Request对象作为参数,从而可以控制HTTP Request的header部分。
      urllib2模块没有加入urllib.urlretrieve函数以及urllib.quote等一系列quote和unquote功能,因此有时也需要urllib的辅助
      urllib2在python3中被修改为urllib.request。

相关文章
urllib 
urllib2
urllib3
python的httplib、urllib和urllib2的区别及其应用
深入理解urllib、urllib2及requests


分析网页信息

<col class="grid_view">
    <li>
        <div class="item">
            <div class="pic">
                <em class="">1em>
                <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 Redemptionspan>
                            <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.6em>span>
                             <span>646374人评价span>
                    div>

                        <p class="quote">
                            <span class="inq">希望让人自由。span>
                        p>
                div>
            div>
        div>
    li>

正则表达式

pattern = re.compile(u'
  • .*?.*?.*?' + u'(.*?).*?' # 排名 + u'.*?(.*?).*?' # 电影名 + u' / (.*?).*?.*?' # 电影别名 # + u'.*?.*?' + u'导演: (.*?)   ' # 导演 + u'主演: (.*?)
    '
    # 主演 + u'(.*?) / ' # 年份 + u'(.*?) / ' # 原产国 + u'(.*?)

    '
    # 类型 + u'.*?.*?property="v:average">(.*?)' # 平均评分 + u'.*?(.*?)人评价.*?.*?' # 评论数 + u'(.*?).*?
  • '
    , re.S)

    完整代码

    # -*- coding:utf-8 -*-
    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 = './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 e:
                if hasattr(e, 'reason'):
                    print('抓取失败,具体原因:', e.reason)
        
        def getMovie(self):
            pattern = re.compile(u'
  • .*?.*?.*?' + u'(.*?).*?' # 排名 + u'.*?(.*?).*?' # 电影名 + u' / (.*?).*?.*?' # 电影别名 # + u'.*?.*?' + u'导演: (.*?)   ' # 导演 + u'主演: (.*?)
    '
    # 主演 + u'(.*?) / ' # 年份 + u'(.*?) / ' # 原产国 + u'(.*?)

    '
    # 类型 + u'.*?.*?property="v:average">(.*?)' # 平均评分 + u'.*?(.*?)人评价.*?.*?' # 评论数 + u'(.*?).*?
  • '
    , 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]]) def writeTxt(self): fileTop250 = open(self.filePath, 'w') try: for movie in self.movieList: playDateY = str(movie[5]).replace("\n", "").lstrip() if len(playDateY) == 4: yNum = int(playDateY) if(yNum < check_year): continue 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('上映年份:' + str(movie[5]).replace("\n", "").lstrip() + '\r\n') fileTop250.write('制作国家/地区:' + movie[6] + '\r\n') fileTop250.write('电影类别:' + str(movie[7]).replace("\n", "") + '\r\n') fileTop250.write('电影评分:' + movie[8] + '\r\n') fileTop250.write('参评人数:' + movie[9] + '\r\n') fileTop250.write('简短影评:' + movie[10] + '\r\n\r\n') print('文件写入成功...') finally: fileTop250.close() def main(self): print('正在从豆瓣电影Top250抓取数据...') self.getMovie() self.writeTxt() print('抓取完毕...') # 2000年以前的电影不关心 check_year = 2000 DouBanSpider = MovieTop250() DouBanSpider.main()

    ## 运行

    /Users/l2xin/Documents/Gitee/PythonUitls/WebCrowler/MovieTop250.py
    正在从豆瓣电影Top250抓取数据...
    正在抓取第1页数据...
    正在抓取第2页数据...
    正在抓取第3页数据...
    正在抓取第4页数据...
    正在抓取第5页数据...
    正在抓取第6页数据...
    正在抓取第7页数据...
    正在抓取第8页数据...
    正在抓取第9页数据...
    正在抓取第10页数据...
    文件写入成功...
    抓取完毕...
    

    DoubanTop250.txt

    电影排名:7
    电影名称:千与千寻
    外文名称:神隐少女(台)  /  Spirited Away
    导演姓名:宫崎骏 Hayao Miyazaki
    参与主演:柊瑠美 Rumi Hîragi / 入野自由 Miy...
    上映年份:2001
    制作国家/地区:日本
    电影类别:剧情 动画 奇幻                        
    电影评分:9.3
    参评人数:872152
    简短影评:最好的宫崎骏,最好的久石让。 
    
    电影排名:9
    电影名称:盗梦空间
    外文名称:潜行凶间(港)  /  全面启动(台)
    导演姓名:克里斯托弗·诺兰 Christopher Nolan
    参与主演:莱昂纳多·迪卡普里奥 Le...
    上映年份:2010
    制作国家/地区:美国 英国
    电影类别:剧情 科幻 悬疑 冒险                        
    电影评分:9.3
    参评人数:961314
    简短影评:诺兰给了我们一场无法盗取的梦。
    
    电影排名:10
    电影名称:机器人总动员
    外文名称:瓦力(台)  /  太空奇兵·威E(港)
    导演姓名:安德鲁·斯坦顿 Andrew Stanton
    参与主演:本·贝尔特 Ben Burtt / 艾丽...
    上映年份:2008
    制作国家/地区:美国
    电影类别:爱情 科幻 动画 冒险                        
    电影评分:9.3
    参评人数:636867
    简短影评:小瓦力,大人生。
    
    电影排名:11
    电影名称:忠犬八公的故事
    外文名称:忠犬小八(台)  /  秋田犬八千(港)
    导演姓名:莱塞·霍尔斯道姆 Lasse Hallström
    参与主演:理查·基尔 Richard Ger...
    上映年份:2009
    制作国家/地区:美国 英国
    电影类别:剧情                        
    电影评分:9.3
    参评人数:621135
    简短影评:永远都不能忘记你所爱的人。
    
    ···
    

    其他

    某些地方正则匹配还有问题,正则实在是不熟,以后再慢慢玩。

    电影排名:23
    电影名称:触不可及
    外文名称:闪亮人生(港)  /  逆转人生(台)
    导演姓名:奥利维·那卡什 Olivier Nakache / 艾力克·托兰达 Eric Toledano   主...
    2011 / 法国 / 剧情 喜剧

    9.2 463398人评价

    满满温情的高雅喜剧。

  • 24 怦然心动

    导演: 罗伯·莱纳 Rob Reiner 参与主演:玛德琳·卡罗尔 Madeline Carroll / 卡... 上映年份:2010 制作国家/地区:美国 电影类别:剧情 喜剧 爱情 电影评分:9.0 参评人数:746761 简短影评:真正的幸福是来自内心深处。


    参考

    • Py之urllib2:Python库之urllib、urllib2、urllib3系列简介、安装、使用方法之详细攻略

    • python爬虫实战 | 爬取豆瓣TOP250排名信息

    • http://www.cnblogs.com/jzincnblogs/p/4899348.html

    • https://blog.csdn.net/pbgc396dwxjb77f2je/article/details/79832021

  • 你可能感兴趣的:(Python,小技巧,正则表达式,python,爬虫)