zoukankan      html  css  js  c++  java
  • Python抓取豆瓣Top250电影信息

    买了本书,《Python 3.5从零开始学》,根据书中例程改写了一个抓取豆瓣Top250电影信息的小爬虫练练手,完成了爬取信息写入文件,Linux下编译通过。

    #!/usr/bin/python3
    # *_* coding:utf8 *_*
    
    from urllib import request
    from http import cookiejar
    import re
    import pymysql
    
    
    class MovieTop(object):
    
        def __init__(self):
            self.start=0
            self.param='&filter='
            self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1;WOW64)'}
            self.movie_list=[]     #用于保存电影信息
            self.page_content=[]   #用于保存网页内容
    
        def get_page(self):
            try:
                while self.start<255: #255
                    #豆辨top250网址
                    url='https://movie.douban.com/top250?start='+str(self.start)
                    req=request.Request(url,headers=self.headers)
                    response=request.urlopen(req)
                    page=response.read().decode('utf-8')
                    page_num=(self.start+25)/25
                    print('正在抓取,第'+str(page_num)+'页数据...')
                    self.start+=25
                    self.page_content.append(page)
            except request.URLError as e:
                if hasattr(e,'reason'):
                    print('抓取失败,失败原因:',e.reason)
    
        def get_movies(self):
    
            #获取网页内容
            self.get_page()
            #解析网页内容
            reObj = re.compile(u'<div.*?class="item">.*?'
                               + u'<div.*?class="pic">.*?'
                               + u'<em.*?class="">(.*?)</em>.*?'
                               + u'<div.*?class="info">.*?'
                               + u'<span.*?class="title">(.*?)'
                               + u'</span>.*?<span.*?class="title">&nbsp;/&nbsp;(.*?)</span>.*?'
                               + u'<span.*?class="other">&nbsp;/&nbsp;(.*?)</span>.*?</a>.*?'
                               + u'<div.*?class="bd">.*?<p.*?class="">.*?'
                               + u'导演: (.*?)&nbsp;&nbsp;&nbsp;.*?<br>'
                               + u'
    D*(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;'
                               + u'(.*?)
    D*</p>.*?<div.*?class="star">.*?'
                               + u'<span.*?'
                               + u'class="rating_num".*?property="v:average">'
                               + u'(.*?)</span>.*?'
                               + u'.*?<span>(.*?)人评价</span>.*?'
                               + u'<p.*?class="quote">.*?'
                               + u'<span.*?class="inq">(.*?)'
                               + u'</span>.*?</p>', re.S)
    
            movies = reObj.findall(' '.join(self.page_content))
    
            #保存到movie_list
            for movie in movies:
                self.movie_list.append([movie[0],
                                        movie[1],
                                        movie[2],
                                        movie[3],
                                        movie[4],
                                        movie[5],
                                        movie[6],
                                        movie[7],
                                        movie[8],
                                        movie[9],
                                        movie[10]])
    
        #TODO:保存到失据库
        def  save_to_db(self,movies):
            # 建立连接
            db = pymysql.connect('localhost', 'root', 'xxxx', 'test')
            # 第一,游标
            cursor = db.cursor()
            # 执行语句
            cursor.execute('select * from movies')
            # 取一行
            data = cursor.fetchone()
    
            print(data)
    
            # 关闭连接
            db.close()
    
        #保存到文件
        def write_to_file(self):
            f_name = 'douban_movies'
            fp = open(f_name, 'w')
    
            for movie in self.movie_list:
                fp.write('电影排名:' + movie[0] + '
    ')
                fp.write('电影名称:' + movie[1] + '
    ')
                fp.write('外文名称:' + movie[2] + '
    ')
                fp.write('电影别名:' + movie[3] + '
    ')
                fp.write('导演姓名:' + movie[4] + '
    ')
                fp.write('上映年份:' + movie[5] + '
    ')
                fp.write('制作国家/地区:' + movie[6] + '
    ')
                fp.write('电影类别:' + movie[7] + '
    ')
                fp.write('电影评分:' + movie[8] + '
    ')
                fp.write('参评人数:' + movie[9] + '
    ')
                fp.write('简短影评:' + movie[10] + '
    
    ')
    
            fp.close()
            print("电影数据写入文件完毕!")
    
    if __name__ == "__main__":
        #创建对象
        mt=MovieTop()
        print("开始数据抓取...")
        mt.get_movies()
        mt.write_to_file()
        print("数据抓取完成!")

    结果示例:

    电影排名:1
    电影名称:肖申克的救赎
    外文名称:The Shawshank Redemption
    电影别名:月黑高飞(港)  /  刺激1995(台)
    导演姓名:弗兰克·德拉邦特 Frank Darabont
    上映年份:1994
    制作国家/地区:美国
    电影类别:犯罪 剧情
    电影评分:9.7
    参评人数:1917025
    简短影评:希望让人自由。
    
    电影排名:2
    电影名称:霸王别姬
    外文名称:Forrest Gump
    电影别名:福雷斯特·冈普
    导演姓名:罗伯特·泽米吉斯 Robert Zemeckis
    上映年份:1994
    制作国家/地区:美国
    电影类别:剧情 爱情
    电影评分:9.5
    参评人数:1457430
    简短影评:一部美国近现代史。
    
    电影排名:4
    电影名称:这个杀手不太冷
    外文名称:Léon
    电影别名:杀手莱昂  /  终极追杀令(台)
    导演姓名:吕克·贝松 Luc Besson
    上映年份:1994
    制作国家/地区:法国
    电影类别:剧情 动作 犯罪
    电影评分:9.4
    参评人数:1652942
    简短影评:怪蜀黍和小萝莉不得不说的故事。
    
    电影排名:5
    电影名称:美丽人生
    外文名称:La vita è bella
    电影别名:一个快乐的传说(港)  /  Life Is Beautiful
    导演姓名:罗伯托·贝尼尼 Roberto Benigni
    上映年份:1997
    制作国家/地区:意大利
    电影类别:剧情 喜剧 爱情 战争
    电影评分:9.5
    参评人数:923870
    简短影评:最美的谎言。
  • 相关阅读:
    OpenStack Pike超详细搭建安装文档 LinuxBridge版
    OpenStack Ocata 超详细搭建文档
    此博客关闭,转到 https://www.justbio.wang/
    面向对象03 封装 反射 内置方法
    面向对象02 继承
    面向对象01
    awk使用说明
    MySQL优化聊两句
    Redis分布式集群几点说道
    Nginx最大客户连接数算法一些遐想
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/12487148.html
Copyright © 2011-2022 走看看