python3爬取豆瓣top250电影
需求:爬取豆瓣电影top250的排名、电影名称、评分、评论人数和一句话影评
环境:python3.6.5
准备工作:
豆瓣电影top250(第1页)网址:https://movie.douban.com/top250?start=0 或者 https://movie.douban.com/top250
每页展示25个电影,一共10张翻页
第2页:https://movie.douban.com/top250?start=&filter=
第3页:https://movie.douban.com/top250?start=&filter=
……
最后一页:https://movie.douban.com/top250?start=&filter=
由此可见,除了首页代码其他9页(相对首页增加了一些字符串)以25递增
查看每页的html代码:
在浏览器空白区域点击“查看源代码”(不同的浏览器可能起的名字不一样),找到所需要的内容。
快速定位html有效信息的方法:
例如排名第一的电影是《肖申克的救赎》,在html源码中搜索(ctrl+F)这个名字(不要加书名号),快速定位大致位置,如下图

仔细研究html代码:
所有影片存放在ol列表中,每一部影片在一个li中,需要提取的信息在不同的标签中,如下图所示

代码逻辑为:查找ol→li→各个标签
需要用到的第三方库:
from bs4 import BeautifulSoup as bs
from urllib import request
读取html源码(以首页为例)
h="https://movie.douban.com/top250"
resp = request.urlopen(h)
html_data = resp.read().decode('utf-8')
soup = bs(html_data,'lxml')
#print(soup.prettify())
第5行的soup.prettify()输出的比较好看,但是有可能更改一些并列标签的前后位置,用这个输出只是看起来更人性化一些
查找ol标签,获取本页面上25部电影
通过class名称,因为这个class是唯一命名的,因此无需find_all,只需要find(这个是查找第一个)
movieList = soup.find('ol',attrs={'class':"grid_view"})
在ol内查找li标签,无class和id,只需标签名即可
movie = movieList.find_all('li')#获取每一个li(每个li是一个电影),以数组方式
返回结果是一位数组,每个元素是li标签
在每一个li标签内提取有用信息
for i in range(0,25):
name = movie[i].find('span',class_="title").string#获得影片名称
score = movie[i].find('span',class_="rating_num").string#获得影片评分
num = movie[i].find('div',class_="star").find_all('span')[-1].string.strip('人评价')#获得影片评价人数
quote = movie[i].find('span',class_="inq")#获得影片短评
.string和get_text()在本代码中显示结果一样(有些代码中返回显示也是不同的),但是返回类型不同
注意第4行获取评价人数时,span标签内无class和id等,只能先把div中所有的信息提取(返回结果是一位数组),人数在数组中最后一个,通过数组方法[-1]提取这个标签,通过string提取标签内内容,再用strip字符串方法去掉“人评价”这几个字
还有一点需要注意是,有几部影片是没有短评的(通过运行程序的结果才能看到,返回的是None),如果需要显示的更加人性化一些,添加以下语句:
if quote is None:
quote = "暂无"
else:
quote = quote.string
查找所有信息:不要想着把10页的html先拼接成一个html处理,这样的的html进行soup时只能提取到第一个<html>标签内的,也就是说只能查到第一页的信息。因此总体思路还是遍历每一页的电影信息,然后将结果拼接成数组。如果只是print出来或者逐行写入歧途文件的话无需整合所有影片
写入txt文件,提取出的结果是二维数组
#将数组movieData250写入文件txt
import codecs
s ="—————————豆瓣电影top250——————————\r\n"
f = codecs.open("豆瓣电影top250.txt",'w','utf-8')
f.write(s) for i in movieData250:
f.write(str(i)+'\r\n') #\r\n为换行符
f.close()
源代码:
#豆瓣电影前250信息,写入txt文件 from bs4 import BeautifulSoup as bs
from urllib import request
k = 0
n = 1
movieData250 = [] #读取每一个网页25个电影信息
def info25():
movieData = []
for i in range(0,25):
name = movie[i].find('span',class_="title").string#获得影片名称
score = movie[i].find('span',class_="rating_num").string#获得影片评分
num = movie[i].find('div',class_="star").find_all('span')[-1].string.strip('人评价')#获得影片评价人数
quote = movie[i].find('span',class_="inq")#获得影片短评
if quote is None:
quote = "暂无"
else:
quote = quote.string
#movieData[i] = [i+1,name,score,num,quote]
movieData.append([i+1+k,name,score,num,quote])
#print(movieData)
return movieData
#movieData250 = movieData250 + movieData while(k == 0):
h="https://movie.douban.com/top250"
resp = request.urlopen(h)
html_data = resp.read().decode('utf-8')
soup = bs(html_data,'lxml')
#print(soup.prettify())
#movieList=soup.find('ol')#寻找第一个ol标签,得到所有电影
#movieList=soup.find('ol',class_="grid_view")#以下两种方法均可
movieList = soup.find('ol',attrs={'class':"grid_view"})
movie = movieList.find_all('li')#获取每一个li(每个li是一个电影),以数组方式
movieData250 +=info25()
k += 25 while(k<250): h = "https://movie.douban.com/top250?start=" + str(k) + "&filter="
resp=request.urlopen(h)
html_data=resp.read().decode('utf-8')
soup=bs(html_data,'lxml')
#print(soup.prettify())
#movieList=soup.find('ol')#寻找第一个ol标签,得到所有电影
#movieList=soup.find('ol',class_="grid_view")#以下两种方法均可
movieList=soup.find('ol',attrs={'class':"grid_view"})
movie=movieList.find_all('li')#获取每一个li(每个li是一个电影),以数组方式
movieData250 += info25()
k+=25 print(movieData250) #将数组movieData250写入文件txt
import codecs
s ="—————————豆瓣电影top250——————————\r\n"
f = codecs.open("豆瓣电影top250.txt",'w','utf-8')
f.write(s) for i in movieData250:
f.write(str(i)+'\r\n') #\r\n为换行符
f.close()
输出的txt:

显示结果不是很友好~~~
python3爬取豆瓣top250电影的更多相关文章
- 基础爬虫,谁学谁会,用requests、正则表达式爬取豆瓣Top250电影数据!
爬取豆瓣Top250电影的评分.海报.影评等数据! 本项目是爬虫中最基础的,最简单的一例: 后面会有利用爬虫框架来完成更高级.自动化的爬虫程序. 此项目过程是运用requests请求库来获取h ...
- requests爬取豆瓣top250电影信息
''' 1.爬取豆瓣top250电影信息 - 第一页: https://movie.douban.com/top250?start=0&filter= - 第二页: https://movie ...
- Python-爬虫实战 简单爬取豆瓣top250电影保存到本地
爬虫原理 发送数据 获取数据 解析数据 保存数据 requests请求库 res = requests.get(url="目标网站地址") 获取二进制流方法:res.content ...
- 爬取豆瓣TOP250电影
自己跟着视频学习的第一个爬虫小程序,里面有许多不太清楚的地方,不如怎么找到具体的电影名字的,那么多级关系,怎么以下就找到的是那个div呢? 诸如此类的,有许多,不过先做起来再说吧,后续再取去弄懂. i ...
- Python3爬取豆瓣网电影信息
# -*- coding:utf-8 -*- """ 一个简单的Python爬虫, 用于抓取豆瓣电影Top前250的电影的名称 Language: Python3.6 ...
- 爬虫之爬取豆瓣top250电影排行榜及爬取斗图啦表情包解读及爬虫知识点补充
今日内容概要 如何将爬取的数据直接导入Excel表格 #如何通过Python代码操作Excel表格 #前戏 import requests import time from openpyxl impo ...
- 80 行代码爬取豆瓣 Top250 电影信息并导出到 CSV 及数据库
一.下载页面并处理 二.提取数据 观察该网站 html 结构 可知该页面下所有电影包含在 ol 标签下.每个 li 标签包含单个电影的内容. 使用 XPath 语句获取该 ol 标签 在 ol 标签中 ...
- 团队-爬取豆瓣Top250电影-团队-阶段互评
团队名称:咣咣踹电脑学号:2015035107217姓名:耿文浩 得分10 原因:组长带领的好,任务分配的好,积极帮助组员解决问题学号:2015035107213姓名:周鑫 得分8 原因:勇于分担,积 ...
- Python爬虫实例:爬取豆瓣Top250
入门第一个爬虫一般都是爬这个,实在是太简单.用了 requests 和 bs4 库. 1.检查网页元素,提取所需要的信息并保存.这个用 bs4 就可以,前面的文章中已经有详细的用法阐述. 2.找到下一 ...
随机推荐
- Struts2 拦截器(Interceptor )原理和配置
http://blog.csdn.net/kingmax54212008/article/details/51777851
- Oracle .NET Core
Oracle .NET Core Beta驱动已出,自己动手写EF Core Oracle https://www.cnblogs.com/yanweidie/p/9064609.html 使用.ne ...
- stm32f107的使用:
一 不能支持软件仿真: 二 外部晶体推荐25MHZ,但如果不用音频接口,也可以使用8M晶体,需修改这里成8000000: 此时设置如下: 并修改这里 改为: 因为
- Hadoop数据管理
本节主要从三方面介绍Hadoop数据管理:分布式文件系统HDFS.分部式数据库HBase和数据仓库工具Hive. 1. HDFS的数据管理 HDFS是分布式计算的存储基石,Hadoop分布式文件系统和 ...
- 《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门
准备工作 1.安装查看 Java 的版本号,推荐使用 Java 8. 安装 Flink 2.在 Mac OS X 上安装 Flink 是非常方便的.推荐通过 homebrew 来安装. brew in ...
- IIS访问网站出错[要求输入用户名密码]的解决方案
症状: 1.HTTP 500 - 内部服务器错误 2.您不具备使用所提供的凭据查看该目录或页的权限 3.基于所提供的凭据,您没有权限查看此目录或网页.HTTP 错误 401.3 - 访问被资源 ACL ...
- springboot项目实现批量新增功能
这个困扰我一整天东西,终于解决了. 首先是mybatis中的批量新增sql语句. 注意:这里我给的是我需要新增的字段,你们改成你们需要的字段. <insert id="insertBa ...
- JAVA常量介绍
常量: 在程序执行过程中,其值不发生改变的量: 1.分类: 字面值常量和自定义常量: 1.字面值常量有以下几种: 字符串常量.小数常量.整数常量.字符常量.布尔常量(true.false).空 ...
- Java面向对象(接口、多态)
面向对象 今日内容介绍 u 接口 u 多态 第1章 接口 1.1 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的 ...
- 小米OJ刷题日志
虽然这OJ上的题比较水,但还是挺有意思的.关键是能赚钱 特别是提交方式 居然不支持C++,垃圾OJ 4. 最长连续数列 排序后dp 5. 找出旋转有序数列的中间值 写个排序就做完了. 6. 交叉队列 ...