买了本书,《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"> / (.*?)</span>.*?' + u'<span.*?class="other"> / (.*?)</span>.*?</a>.*?' + u'<div.*?class="bd">.*?<p.*?class="">.*?' + u'导演: (.*?) .*?<br>' + u' D*(.*?) / (.*?) / ' + 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 简短影评:最美的谎言。