买了本书,《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'\n\D*(.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;'
                           + u'(.*?)\n\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] + '\r\n')
            fp.write('电影名称:' + movie[1] + '\r\n')
            fp.write('外文名称:' + movie[2] + '\r\n')
            fp.write('电影别名:' + movie[3] + '\r\n')
            fp.write('导演姓名:' + movie[4] + '\r\n')
            fp.write('上映年份:' + movie[5] + '\r\n')
            fp.write('制作国家/地区:' + movie[6] + '\r\n')
            fp.write('电影类别:' + movie[7] + '\r\n')
            fp.write('电影评分:' + movie[8] + '\r\n')
            fp.write('参评人数:' + movie[9] + '\r\n')
            fp.write('简短影评:' + movie[10] + '\r\n\r\n')

        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
简短影评:最美的谎言。

 

posted on 2020-03-13 16:10  garfieldtom  阅读(216)  评论(0编辑  收藏  举报