GarfieldTom

买了本书,《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
简短影评:最美的谎言。

 

分类:

技术点:

相关文章: