前言


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

 

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

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

      虽然找到了标题所属的“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'})

根据标记查不到内容  

 

 异步存储

 

异步存储的链接

链接的内容(电影信息)


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

 


数据采集—电影数据


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

# ========== 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).text
soup = BeautifulSoup(res,'html.parser')

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

type_id = re.findall('type=(.*?)&', 
                     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=1000')

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

# 构建空列表,用于存储爬虫的数据信息
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,今天关于“豆瓣电影分类排行榜”的爬虫,我们就分享到这里,喜欢看电影的你还不赶快试试!!如果你有问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让跟多的人学习和操作。最后,本文相关的Python脚本和PDF版本已存放到百度云盘,可以通过下面的链接获取

链接: https://pan.baidu.com/s/1miwvW6k 密码: wnp5


关注“每天进步一点点2015  

原文链接:,转发请

刘顺祥 勤勤恳恳学习与分享的小牛

加关注
喜欢 | 0

登陆后发表文章

  • 0条回应给“快来围观2W+的豆瓣电影分类排行榜(含代码)”的评论