快来围观2W+的豆瓣电影分类排行榜(含代码)

浏览: 1934

之前向各位网友分享过一篇文章《【干货】-- 带你抓取并分析知乎高评分电影》,是关于如何从知乎网站中抓取经网友整理好后的电影信息,说白了是在网友汇总的基础上做了数据的爬虫工作。今天就来手把手的分享一篇关于如何直接从豆瓣网中抓取所有电影(2万多部)的评分信息,希望对热爱看电影的小伙伴有所帮助,减少不知道看啥电影的困惑。首先来看一下“豆瓣电影排行榜”的主页截图:

快来围观2W+的豆瓣电影分类排行榜(含代码)

会发现,在主页中的左侧包含了各式各样的电影类型,如剧情、喜剧、爱情和动作等。当我任意点击一个类型,就会出现如下的截图,以剧情类电影为例:

快来围观2W+的豆瓣电影分类排行榜(含代码)

在上面的截图中,有我们需要抓取的每部电影的信息,如电影名称、电影评分、参与评论的人数等。按照一般的爬虫顺序,会首先查看电影信息页的源代码,即按一下F12键,然后点击电影名称,获得其所属的标记。如下图所示:

快来围观2W+的豆瓣电影分类排行榜(含代码)

虽然找到了标题所属的“span”下面的“a”标签,但是当你去爬虫时,却没有任何返回的结果。究其原因,发现原来电影相关的数据并没有直接存储在HTML源代码中,而是异步存储在了json文件中。如下图所示:

# 剧情类电影主页url = 'https://movie.douban.com/typerank?type_name=剧情&type=11&interval_id=100:90&action='# 发送请求res = requests.get(home, headers = headers).text# 解析请求后的响应信息soup = BeautifulSoup(res,'html.parser')# 按照标记爬取电影名称soup.findAll('span',{'class':'movie-name-text'})

根据标记查不到内容

快来围观2W+的豆瓣电影分类排行榜(含代码)

异步存储

快来围观2W+的豆瓣电影分类排行榜(含代码)

异步存储的链接

快来围观2W+的豆瓣电影分类排行榜(含代码)

链接的内容(电影信息)

快来围观2W+的豆瓣电影分类排行榜(含代码)

从这个异步存储的链接中我们会发现,只需要改动链接中的几个值就可以获得其它类型的电影信息。其中第一个红框控指的是电影类型,第二个红框控指的是电影排名的百分比,如前10%的电影(即90%~100%),第三个红框指的是页面显示多少部电影,这里不妨设置1000部电影(虽然10%比例的电影只有600左右部)。

快来围观2W+的豆瓣电影分类排行榜(含代码)

知道了该如何抓取豆瓣电影的步骤后,我们直接上代码,代码中每一步都给出了解释,感兴趣的读者可以仔细研究并操作:

数据采集—电影数据

# ========== Python3 + Jupyter ========== #

# ==================== 步骤一 抓取所有电影的类型id ==================== #

# 导入第三方包

import requests

from bs4 import BeautifulSoup

import pandas as pd

import time

import re

# 设置头文件,用于反爬虫

headers = {'Accept':'*/*','Accept-Encoding':'gzip, deflate, br',

'Accept-Language':'zh-CN,zh;q=0.8',

'Connection':'keep-alive',

'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}

# 根据豆瓣主页抓取各个电影的类型ID

home = 'https://movie.douban.com/chart'

res = requests.get(home, headers = headers).textsoup = BeautifulSoup(res,'html.parser')

# 通过正则表达式获取每个电影类型的id

type_id = re.findall('type=(.*?)&amp',

str(soup.findAll('div',{'class':'types'})[0]))

# ==================== 步骤二 根据异步存储的链接规律,生成所有的抓取链接==================== #

# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20

# 根据url的规律,生成抓取数据的目标url

urls = []

for num in type_id:

for i in range(100,-10,-10):

urls.append('https://movie.douban.com/j/chart/top_list?type='+num+'&interval_id='+str(i)+'%3A'+str(i-10)+'&action=&start=0&limit=100')

# ==================== 步骤三 抓取电影信息 ==================== #

# 构建空列表,用于存储爬虫的数据信息

title = []

types = []

regions = []

date = []

actor_count = []

score = []

vote_counts = []

actors = []

# 通过for循环抓取每一页电影的信息

for url in urls:

res = requests.get(url, headers = headers).text

# 通过正则表达式完成数据的扣取

title.extend(re.findall('"title":"(.*?)",', res))

types.extend(re.findall('"types":[(.*?)],', res))

regions.extend(re.findall('"regions":[(.*?)],', res))

date.extend(re.findall('"release_date":"(.*?)",', res))

actor_count.extend(re.findall('"actor_count":(.*?),', res))

score.extend(re.findall('"score":"(.*?)",', res))

vote_counts.extend(re.findall('"vote_count":(.*?),', res))

actors.extend(re.findall('"actors":[(.*?)],', res))

# 每隔3秒抓取一页数据 time.sleep(3)

# 将抓取下来的数据存放到字典中

data_dict = {'title':title,'types':types,'regions':regions,

'date':date,'actor_count':actor_count,'score':score,

'vote_counts':vote_counts,'actors':actors}

# ==================== 步骤四 数据的存储 ==================== #

# 将数据存储为数据框结构

df = pd.DataFrame(data_dict)

# 数据导出

df.to_excel('films_info.xlsx', index = False)


结语


OK,今天关于“豆瓣电影分类排行榜”的爬虫,我们就分享到这里,喜欢看电影的你还不赶快试试!!如果你有问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让跟多的人学习和操作。

推荐 3
本文由 每天进步一点点2015 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册