上代码:
'''
先爬豆瓣top250的电影,并放入一个表格中去。
思路:
先爬取最小共同父级标签,然后针对每一个父级标签,提取里面的序号/电影名/评分/推荐语/链接。
然后将其放入csv表格中去。
'''
#导入库,csv用来进行表格操作
import requests,csv
from bs4 import BeautifulSoup
#———————————————————爬取电影信息———————————————————#
#因为是top250的电影,而一页只能显示25条电影信息,所有一共有10页,定义一个开始的电影序号
#每增加一页,序号就加25
movie_num = 0
#用于存放电影信息的列表
movies = [] #所有电影
movie_names = [] #名称
movie_sequs = [] #序号
movie_stars = [] #评分
movie_recomms = [] #推荐语
movie_hrefs = [] #链接
#为躲避反爬虫机制,伪装成网页请求,一般通用
headers={
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US)AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20',
'Host':'movie.douban.com'
}
while movie_num <= 225:
#url = 'https://movie.douban.com/top250?start=0&filter=',电影分页的url
url = 'https://movie.douban.com/top250?start={}&filter='.format(movie_num)
#requests.get()返回一个Response实例
get_pages = requests.get(url,headers = headers)
#判断响应状态码
if get_pages.status_code == 200:
#页面解析,返回的是bs对象
soup = BeautifulSoup(get_pages.text,'html.parser')
#通过class_ = 'info',爬取最小共同父级标签
movieslist = soup.find_all('div',class_ = 'item')
#爬取序号,名称,链接,推荐语,评分,并添加至相应的列表中
for items in movieslist:
movie_sequs.append(items.find('em').text)
movie_names.append(items.find('span',class_ = 'title').text)
movie_hrefs.append(items.find('a').get('href'))
#一些电影并没有推荐语,当发生这种情况时,就执行except后面的语句
try:
movie_recomms.append(items.find('span',class_ = 'inq').text)
#如何判断是AttributeError异常?先让程序运行一次,在出错时控制台会提示出现的是什么类型的异常,并指明异常位置。
except AttributeError:
#如果没有推荐语(此时相应的标签内容为空),则用一些字符串代替
#如果不这样做,可能运行的时候会发生IndexError: list index out of range错误
#因为None无法添加到列表中
if type(items.find('span',class_ = 'inq') == 'None'):
movie_recomms.append('------无推荐语------')
movie_stars.append(items.find('span',class_ = 'rating_num').text)
#将以上电影信息整合到一个列表中,且列表的每一个元素都包含一个电影的5个信息('序号','电影名称','链接','推荐语','评分')
for i in range(movie_num,len(movie_sequs)):
#注意:不能用赋值语句,否则会报错IndexError: list assignment index out of range
#因为movies = []在定义时是一个空列表,只能通过往里追加元素
#如果想要使用赋值语句,可在开始时定义movies = [None] * 250,可以使用以下语句:
#moveis[i] = [movie_sequs[i],movie_names[i],movie_hrefs[i],movie_recomms[i],movie_stars[i]]
#将一个电影的5条信息放入一个列表中,并作为一个子列表(元素)添加到movies列表中去
movies.append([movie_sequs[i],movie_names[i],movie_hrefs[i],movie_recomms[i],movie_stars[i]])
#print('{}-{},{},{} 评分 {}'.format(movie_sequs[i],movie_names[i],movie_hrefs[i],movie_recomms[i],movie_stars[i]))
else:
print('状态码是{},访问不成功!'.format(get_pages.status_code))
#movie_num更新以便下一进入到下一页
movie_num += 25
#可以打印一下验证一下结果
print(movies)
#———————————————————创建表格并将表头和电影信息写入表格中———————————————————#
#表格的标题
headersOfExcel = ['序号','电影名称','链接','推荐语','评分']
#调用open()函数打开csv文件,传入参数:文件名“moveis_csv.csv”、追加模式“a”、newline=''。
with open('moveis_csv.csv','a',newline = '') as movCsv:
# 用csv.writer()函数创建一个writer对象。
write_movies = csv.writer(movCsv,dialect = 'excel')
#用writerow()函数将表头写进csv文件里
write_movies.writerow(headersOfExcel)
#注意:
#如果出现了PermissionError: [Errno 13] Permission denied: 'moveis_csv.csv'的报错,
#可能是由于以下原因:
#1.你有可能已经打开了这个文件,关闭这个文件即可
#2.open 打开一个文件夹(目录),而不是文件
#将电影信息逐行写入excle表格中
for movs in movies:
write_movies.writerow(movs)
以下是打印的部分结果:
1)HTML页面:
先把这个页面打印出来,在旁边作参考,就可以很方便地知道应该选取哪些标签了。也不用来回来地翻看网页了。
2)先解决好第1页的问题:
1-肖申克的救赎,https://movie.douban.com/subject/1292052/,希望让人自由。 评分 9.7
2-霸王别姬,https://movie.douban.com/subject/1291546/,风华绝代。 评分 9.6
3-阿甘正传,https://movie.douban.com/subject/1292720/,一部美国近现代史。 评分 9.5
4-这个杀手不太冷,https://movie.douban.com/subject/1295644/,怪蜀黍和小萝莉不得不说的故事。 评分 9.4
5-美丽人生,https://movie.douban.com/subject/1292063/,最美的谎言。 评分 9.5
6-泰坦尼克号,https://movie.douban.com/subject/1292722/,失去的才是永恒的。 评分 9.4
7-千与千寻,https://movie.douban.com/subject/1291561/,最好的宫崎骏,最好的久石让。 评分 9.4
8-辛德勒的名单,https://movie.douban.com/subject/1295124/,拯救一个人,就是拯救整个世界。 评分 9.5
9-盗梦空间,https://movie.douban.com/subject/3541415/,诺兰给了我们一场无法盗取的梦。 评分 9.3
10-忠犬八公的故事,https://movie.douban.com/subject/3011091/,永远都不能忘记你所爱的人。 评分 9.4
11-海上钢琴师,https://movie.douban.com/subject/1292001/,每个人都要走一条自己坚定了的路,就算是粉身碎骨。 评分 9.3
12-楚门的世界,https://movie.douban.com/subject/1292064/,如果再也不能见到你,祝你早安,午安,晚安。 评分 9.3
13-三傻大闹宝莱坞,https://movie.douban.com/subject/3793023/,英俊版憨豆,高情商版谢耳朵。 评分 9.2
14-机器人总动员,https://movie.douban.com/subject/2131459/,小瓦力,大人生。 评分 9.3
15-放牛班的春天,https://movie.douban.com/subject/1291549/,天籁一般的童声,是最接近上帝的存在。 评分 9.3
16-星际穿越,https://movie.douban.com/subject/1889243/,爱是一种力量,让我们超越时空感知它的存在。 评分 9.3
17-大话西游之大圣娶亲,https://movie.douban.com/subject/1292213/,一生所爱。 评分 9.2
18-熔炉,https://movie.douban.com/subject/5912992/,我们一路奋战不是为了改变世界,而是为了不让世界改变我们。 评分 9.3
19-疯狂动物城,https://movie.douban.com/subject/25662329/,迪士尼给我们营造的乌托邦就是这样,永远善良勇敢,永远出乎意料。 评分 9.2
20-无间道,https://movie.douban.com/subject/1307914/,香港电影史上永不过时的杰作。 评分 9.2
21-龙猫,https://movie.douban.com/subject/1291560/,人人心中都有个龙猫,童年就永远不会消失。 评分 9.2
22-教父,https://movie.douban.com/subject/1291841/,千万不要记恨你的对手,这样会让你失去理智。 评分 9.3
23-当幸福来敲门,https://movie.douban.com/subject/1849031/,平民励志片。 评分 9.1
24-怦然心动,https://movie.douban.com/subject/3319755/,真正的幸福是来自内心深处。 评分 9.1
25-触不可及,https://movie.douban.com/subject/6786002/,满满温情的高雅喜剧。 评分 9.2
3)再添加一个循环,解决10页的问题,并将将结果放入一个表格中。在这个过程中要不断的调试,直到最后程序可以运行。以下是部分结果: