python爬取豆瓣电影榜单

python爬取豆瓣电影榜单并保存到本地excel中,以后就不愁没片看了。

目标

确定我们想要抓取的电影的相关内容。

  1. 抓取豆瓣top250电影的排名、电影名、评价(总结很到位)、评分、点评人数及电影的豆瓣页面。
  2. 抓取各种电影类型的排行榜前100。

编码

省略需求到编码中间的繁文缛节,直接上手编码。(此处是最终编码)
目标一使用BeautifulSoup解析页面查找元素。
目标二调用接口处理返回的json数据。

import requests
import openpyxl
import json
from bs4 import BeautifulSoup
from openpyxl.styles import Color, Font, Alignmentclass DouBanMovieList1():def __init__(self):self.path = r'D:\Download\豆瓣电影榜单\豆瓣电影.xlsx'def get_moviedata(self):data = []headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}for i in range(10):url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)response = requests.get(url=url, headers=headers)bs = BeautifulSoup(response.text, 'lxml')ranks = bs.select('em')titles = bs.find_all('div', class_='hd')evaluations = []for j in range(1, 26):if bs.select_one('#content > div > div.article > ol > li:nth-child(%d) > div > div.info > div.bd > p.quote > span'%(j)):evaluations.append(bs.select_one('#content > div > div.article > ol > li:nth-child(%d) > div > div.info > div.bd > p.quote > span'%(j)).get_text())else:evaluations.append('')ratings = bs.find_all('span', class_='rating_num')evaluation_numbers = bs.find_all('div', class_='star')links = bs.select('ol li div a')for rank, title, evaluation, rating, evaluation_number, link in zip(ranks, titles, evaluations, ratings, evaluation_numbers, links):data.append([rank.get_text(), title.get_text().split('\n')[2], evaluation, rating.get_text().strip(), evaluation_number.get_text().split('\n')[4].strip('人评价'), link.get('href')])return datadef create_excel(self):wb = openpyxl.Workbook()ws = wb.activews.title = '综合'font_kai = Font(name='楷体', bold=True)align_center = Alignment(horizontal='center', vertical='center')ws.cell(1, 1).value = '豆瓣综合电影榜单250'ws.cell(1, 1).font = font_kaiws.cell(1, 1).alignment = align_centerlabels = ['排行', '电影', '评价', '评分', '评分人数', '豆瓣链接', '看过']for i in range(1, len(labels)+1):ws.cell(2, i).value = labels[i-1]ws.cell(2, i).font = font_kaiws.cell(2, i).alignment = align_centerws.merge_cells('A1:G1')wb.save(self.path)def write_excel(self, data):wb = openpyxl.load_workbook(self.path)ws = wb['综合']font_song = Font(name='宋体')align_center = Alignment(horizontal='center', vertical='center')row = 3for i in data:for column in range(len(i)):ws.cell(row, column+1).value = i[column]ws.cell(row, column+1).font = font_songws.cell(row, column+1).alignment = align_centerrow += 1ws.column_dimensions['A'].width = 6.0ws.column_dimensions['B'].width = 20.0ws.column_dimensions['C'].width = 75.0ws.column_dimensions['D'].width = 6.0ws.column_dimensions['E'].width = 10.0ws.column_dimensions['F'].width = 45.0ws.column_dimensions['G'].width = 7.0wb.save(self.path)class DouBanMovieList2():def __init__(self):self.path = r'D:\Download\豆瓣电影榜单\豆瓣电影.xlsx'self.type_dict = {11: '剧情', 24: '喜剧', 5: '动作', 13: '爱情', 17: '科幻', 25: '动画', 10: '悬疑', 19: '惊悚', 20: '恐怖',1: '记录片', 23: '短片', 6: '情色', 26: '同性', 14: '音乐', 7: '歌舞', 28: '家庭', 8: '儿童', 2: '传记',4: '历史', 22: '战争', 3: '犯罪', 27: '西部', 16: '奇幻', 15: '冒险', 12: '灾难', 29: '武侠', 30: '古装',18: '运动', 31: '黑色电影'}def create_excel(self, type, sheetnumber):wb = openpyxl.load_workbook(self.path)ws = wb.create_sheet(type, sheetnumber)font_kai = Font(name='楷体', bold=True)align_center = Alignment(horizontal='center', vertical='center')ws.cell(1, 1).value = '豆瓣{}电影榜单100'.format(type)ws.cell(1, 1).font = font_kaiws.cell(1, 1).alignment = align_centerlabels = ['排行', '电影', '评分', '评分人数', '国家', '日期', '演员', '豆瓣链接', '看过']for i in range(1, len(labels)+1):ws.cell(2, i).value = labels[i-1]ws.cell(2, i).font = font_kaiws.cell(2, i).alignment = align_centerws.merge_cells('A1:I1')wb.save(self.path)def get_moviedata(self, type_num):data = []headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}number = 0for i in range(10, 1, -1):url = 'https://movie.douban.com/j/chart/top_list?type={}&interval_id={}%3A{}&action=&start=0&limit=100'.format(type_num, 10*i, 10*(i-1))response = requests.get(url=url, headers=headers)for movie in json.loads(response.text):if [movie['rank'], movie['title'], movie['score'], movie['vote_count'], '&'.join(movie['regions']), movie['release_date'], '/'.join(movie['actors']), movie['url']] not in data:data.append([movie['rank'], movie['title'], movie['score'], movie['vote_count'], '&'.join(movie['regions']), movie['release_date'], '/'.join(movie['actors']), movie['url']])if len(data) == 100:breakelif len(data) > 100:data = data[0:100]breakelse:passreturn datadef write_excel(self, type, data):wb = openpyxl.load_workbook(self.path)ws = wb[type]font_song = Font(name='宋体')align_center = Alignment(horizontal='center', vertical='center')align_left = Alignment(horizontal='left', vertical='center')row = 3for i in data:for column in range(len(i)):ws.cell(row, column + 1).value = i[column]ws.cell(row, column + 1).font = font_songif column == 4 or column == 6:ws.cell(row, column + 1).alignment = align_leftelse:ws.cell(row, column + 1).alignment = align_centerrow += 1ws.column_dimensions['A'].width = 6.0ws.column_dimensions['B'].width = 20.0ws.column_dimensions['C'].width = 6.0ws.column_dimensions['D'].width = 10.0ws.column_dimensions['E'].width = 15.0ws.column_dimensions['F'].width = 12.0ws.column_dimensions['G'].width = 35.0ws.column_dimensions['H'].width = 45.0ws.column_dimensions['I'].width = 7.0wb.save(self.path)if __name__ == '__main__':movie1 = DouBanMovieList1()movie1.create_excel()data = movie1.get_moviedata()movie1.write_excel(data)movie2 = DouBanMovieList2()sheetnumber = 1for type_num in movie2.type_dict.keys():type = movie2.type_dict[type_num]movie2.create_excel(type, sheetnumber)data = movie2.get_moviedata(type_num)movie2.write_excel(type, data)sheetnumber += 1

填坑

需求没分析清楚就直接编码,这种情况不用想直接填坑就行了(坑不是宝儿姐挖的)。
1、说好的top250,为什么不足250?

比如这种数据没有评价,是一条不完整的数据;因为代码中使用了zip函数,而zip函数返回列表长度与最短的对象相同,所以每有一条不完整的数据,结果就会少一条数据。
2、说好的榜单100,为什么不足100?
刚开始使用的是https://movie.douban.com/j/chart/top_list?type=26&interval_id=100%3A90&action=&start=0&limit=100这个接口,如果在100-90区间段里的电影不少于100就不会出错,但少于100的话,结果就会不足100。

结果

以后每看一部就可以在后面“看过”那一列打✔了。

python爬取豆瓣电影榜单相关推荐

  1. Python爬取猫眼电影榜单评分,以及评论

    猫眼电影评论爬取 [目标] (1)爬取榜单电影名称以及评分,简单的数据可视化. (2)爬取< 你好,李焕英>的评论,用词云显示 第一步:了解反爬机制: 1.请求过多,ip地址会被封掉24h ...

  2. python爬取豆瓣图书榜单 并存放数据库心得

    最近javaweb 项目存放图书的数据库存放的图书太少 决定去豆瓣榜单 爬取一些数据 首先是爬取网页得到数据 以字典类型先储存下来 贴上代码 def init(self, keyword): self ...

  3. 利用python爬取猫眼电影榜单TOP100

    代码如下 import re import requests import json #from multiprocessing import Pool # 多进程#url = 'https://ma ...

  4. 【python爬虫自学笔记】(实战)----爬取猫眼电影榜单Top100

    目的:爬取猫眼电影榜单TOP100的信息并保存在文档中. 查看网站结构,确定思路: 首先请求网页的地址为maoyan.com/board/4,电影信息的内容包含在一个个dd标签之中,分析dd标签中的内 ...

  5. Python全栈开发-Python爬虫-05 爬取猫眼电影榜单信息

    爬取猫眼电影榜单信息(翻页) 一. 获取url及headers 首先进入猫眼电影首页: 猫眼电影 之后点击菜单栏的 榜单 并在下面选择 TOP100榜 接着右击检查并刷新界面,在Network中找到4 ...

  6. 使用PHP+QueryList 爬取猫眼电影榜单信息

    爬虫是我一直以来跃跃欲试的技术,现在的爬虫框架很多,比较流行的是基于python,nodejs,java,C#的的框架,其中又以基于python的爬虫流行最为广泛,还有的已经是一套傻瓜式的软件操作,如 ...

  7. 【爬虫二】爬取豆瓣音乐榜单

    前言 借助有效率的工具,可以让我们更加方便的写出爬虫程序.本篇使用request和bs4库爬取豆瓣音乐榜单. 介绍 豆瓣音乐榜单:https://music.douban.com/top250 bs4 ...

  8. 利用python爬取豆瓣电影top250

    利用python爬取豆瓣电影top250: 注:本内容只是作为个人学习记录 1.业务分析 进入网页https://movie.douban.com/top250 可以看见每部电影都呈现在眼前,点击电影 ...

  9. Python爬取豆瓣电影top250的电影信息

    Python爬取豆瓣电影top250的电影信息 前言 一.简介 二.实例源码展示 小结 前言 相信很多小伙伴在学习网络爬虫时,老师们会举一些实例案例讲解爬虫知识,本文介绍的就是经典爬虫实际案例–爬取豆 ...

最新文章

  1. 没想到我提前56年感受了赛博朋克
  2. java连接Excel数据库读取,写入,操纵Excel表格
  3. gbk 转 UTF-8
  4. [Java核心技术(卷I)] - Java中的参数能做什么和不能做什么
  5. 每日一题(14)—— 交换a,b的值(不使用中间变量)
  6. 什么?你竟然还没有用这几个chrome插件? 1
  7. C++:成绩类Score
  8. linux监听apache代码,linux系统使用python监控apache服务器进程脚本分享
  9. (转) Eclipse Maven 编译错误 Dynamic Web Module 3.1 requires Java 1.7 or newer 解决方案
  10. 基于springboot的高校后勤系统
  11. hdu4540---DP入门
  12. CAD门窗lisp_门窗CAD大样图
  13. 美国60所真正著名的大学
  14. 联想模拟器安装激活面具magisk教程
  15. 网络及网络设备(持续更新)
  16. java 移动目录_java 移动文件夹内的文件,从一个目录移动到另外一个目录
  17. codeforces beta round 1
  18. win10计算机丢失msvcr,win10系统运行程序提示计算机中丢失msvcr110.dll的教程
  19. ffmpeg的各种黑科技
  20. 在C/C++中常用的符号

热门文章

  1. C++ 实现红黑树结构
  2. javaweb JAVA JSP超市订单后台管理系统源码超市管理系统商品进销存系统超市后台管理
  3. 什么是分布式操作系统?我们为什么需要分布式操作系统?
  4. 基于WIFI探针的商业大数据分析系统(hadoop+spark+hbase+bootstrap+echarts)
  5. 什么是java web项目的根路径
  6. Unicode编码转换
  7. root用户给普通用户提权,禁止root远程登录
  8. 北京中考英​语写作主题22篇,涵盖近年热门话题
  9. Spring-Boot 使用JSR-107集成EHCache3.x (配置Clustered以及DISK)
  10. 数据中心制冷系统故障原因及排除方法