爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

不温卜火 等级 737 0 0
标签: Python

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!

目录


爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_


推荐

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

一、小小课堂

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

在古代,每当你闲暇之时,会同老友几人一起吃酒喝茶,觥筹交错,畅所欲言!而在如今,我们在无聊之时,又正值好友几人闲暇之时,可能会同去看当下最新的电影。但是如果只有我们自己一人,这时的你会怎如何做呢?

如果是我的话,我就会先自行查看豆瓣电影的评分,从中选择自己感兴趣的影片进行观看。这样不仅节省了我们的时间,更能陶冶我们的情操。同时我们还能在观影之后,查看别人给出的影评,从中给出中肯的评价,好为别人提供价值标杆。
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
好吧,说了那么多其实就是为了引出我们今天这篇博文所要爬取的网站——《豆瓣电影》。-。-

由于咱是技术博主,所以这些文邹邹的话咱就不写了哈。

以往的博文,大都是讲解的怎样爬取静态网页。这不,本篇博文博主专门选择了动态网页豆瓣电影进行数据采集。

所谓动态网页加载是通过js的ajax加载的数据或js算法(加密)得到的数据,并不是直接可以得到的数据结果。

豆瓣电影这个网站是通过ajax加载的数据。为什么会这样说呢?一会儿在分析网页结构的时候,博主会进行解释!

二、大体过程分析

在此,先给出豆瓣电影的URL:https://movie.douban.com/chart

    1. 分析获取的URL
      爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
    1. 单击分类信息,跳转到分类电影列表
      爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
      爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
      这个页面是有多页数据加载的,当用户向下滚动右侧的滚动,加载数据,这个经过分析是ajax加载的数据,需要找到ajax请求的网址。
      爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
      先找到分类,提取分类的名字和类型编号,然后再爬分类下的电影数据。
  • 2.提取数据的方法

ajax返回的数据是json,response.json()得到的是字典,用字典操作就可以了,当然用正则是肯定可以的。其实专门操作json的有一个模块叫jsonpath。

三、具体细节分析

3.1 先获取整个网页的源码

import requests
from lxml import etree

type_url = "https://movie.douban.com/chart"

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}

def parse_url(url):
    """解析url,得到html"""
    response = requests.get(url=url, headers=headers)
    return response.content.decode("utf-8")

def parse_html(html):
    """解析url,得到字典"""
    etree_obj = etree.HTML(html)
    return etree_obj

content = parse_url(type_url)
print(content) 

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

3.2 获取分类

我们首先先看下网页内存在iframe没有
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
由于有iframe 所以不能使用xpath

下面我们先来看下我们所要爬取分类的格式
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
我们可以看到其格式为<a href="/typerank?type_name=剧情&amp;type=11&amp;interval_id=100:90&amp;action=">剧情</a>

既然xpath不能使用,那么我们就使用正则进行解析

<a href="/typerank?type_name=剧情&amp;type=11&amp;interval_id=100:90&amp;action=">剧情</a>

r'<a href="/typerank\?type_name=(.*?)&type=(\d+)&interval_id=100:90&action=">.*?</a>' 

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
🆗,我们已经成功拿到电影的分类,下面开始尝试拿到其中一个分类中的所有数据

3.3 获取一页的所有数据

movie_url = "https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20"
response = requests.get(url=movie_url,headers=headers)
content = response.json()
print(content) 

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

3.4 循环获取所有URL及内容

我们先看下地址栏的URL
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
URL对比

https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85%E7%89%87&type=11&interval_id=100:90&action=
https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85%E7%89%87&type=11&interval_id=90:80&action= 

我们可以看到其中的interval_id是以10为单位移动的。那么我们是不是能够有一个大胆的想法能否拼接这个网址,然后循环爬取内容么呢?
答案是可以的,在此博主就不多讲解了,直接给出代码

 movie_url = "https://movie.douban.com/j/chart/top_list"

def get_movie(movie_type, low_score, high_score):
    """获取电影"""
    movie_type_name = movie_type[0]
    movie_type_num = movie_type[1]
    print(movie_type_num)

    i = 0
    while True:
        # 参数
        params = {
            "type": movie_type_num,
            "interval_id": "{}:{}".format(high_score, low_score),
            "action": "",
            "start": i,
            "limit": 20
        }
        # 发请求获取数据
        content = parse_json(movie_url, params)
        print(content)
        exit()

def start():
    """爬虫开始"""
    low_score = int(input("输入要爬取的最低分(以5为单位),最高分默认是加10>"))
    high_score = low_score + 10

    movie_type_list = get_movie_type()
    for movie_type in movie_type_list:
        get_movie(movie_type, low_score, high_score)

if __name__ == '__main__':
    start() 

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

3.5 得到数据

至于此部分只是单纯的提取JSON中的数据,在此就不多解释了
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

def get_movie(movie_type, low_score, high_score):
    """获取电影"""
    movie = {
        "title": "",  # 电影名称
        "actors": "",  # 主演
        "release_date": "",  # 上映日期
        "regions": "",  # 上映地
        "types": "",  # 类型
        "score": "",  # 评分
        "vote_count": "",  # 评论数
        "url": "",  # url
    }

    movie_type_name = movie_type[0]
    movie_type_num = movie_type[1]

    i = 0
    while True:
        # 参数
        params = {
            "type": movie_type_num,
            "interval_id": "{}:{}".format(high_score, low_score),
            "action": "",
            "start": i,
            "limit": 20
        }
        # 发请求获取数据
        data_list = parse_json(movie_url, params)
        # 判断循环退出
        if not data_list:
            break
        # 循环
        for data in data_list:
            movie["title"] = data["title"]
            movie["actors"] = data["actors"]
            movie["release_date"] = data["release_date"]
            movie["regions"] = data["regions"]  
            movie["types"] = data["types"]     
            movie["score"] = data["score"]     
            movie["vote_count"] = data["vote_count"]  
            movie["url"] = data["url"]         
            save(movie)

        i += 20 

四、完整源码

# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-09 8:27
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 豆瓣电影.py
  @Version:1.0

'''
import requests
import time
import re
import random
import csv
from lxml import etree

type_url = "https://movie.douban.com/chart"
movie_url = "https://movie.douban.com/j/chart/top_list"

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
}

def parse_html(url, params={}):
    """解析url,得到html"""
    response = requests.get(url=url, headers=headers, params=params)
    return response.content.decode("utf-8")

def parse_json(url, params={}):
    """解析url,得到字典"""
    response = requests.get(url=url, headers=headers, params=params)
    return response.json()

def get_movie_type():
    """获取电影分类"""
    content = parse_html(type_url)
    return re.findall(r'<a href="/typerank\?type_name=(.*?)&type=(\d+)&interval_id=100:90&action=">.*?</a>', content)

def get_movie(movie_type, low_score, high_score):
    """获取电影"""
    movie = {
        "title": "",  # 电影名称
        "actors": "",  # 主演
        "release_date": "",  # 上映日期
        "regions": "",  # 上映地
        "types": "",  # 类型
        "score": "",  # 评分
        "vote_count": "",  # 评论数
        "url": "",  # url
    }

    movie_type_name = movie_type[0]
    movie_type_num = movie_type[1]

    i = 0
    while True:
        # 参数
        params = {
            "type": movie_type_num,
            "interval_id": "{}:{}".format(high_score, low_score),
            "action": "",
            "start": i,
            "limit": 20
        }
        # 发请求获取数据
        data_list = parse_json(movie_url, params)
        # 判断循环退出
        if not data_list:
            break
        # 循环
        for data in data_list:
            movie["title"] = data["title"]
            movie["actors"] = data["actors"]
            movie["release_date"] = data["release_date"]
            movie["regions"] = data["regions"]  # 国家
            movie["types"] = data["types"]     # 类型
            movie["score"] = data["score"]     # 评分
            movie["vote_count"] = data["vote_count"]  # 评论条数
            movie["url"] = data["url"]         # url
            save(movie)

        i += 20

def save(item):
    """将数据保存到csv中"""
    with open("./豆瓣电影.csv", "a", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerow(item.values())

def start():
    """爬虫开始"""
    low_score = int(input("输入要爬取的最低分(以5为单位),最高分默认是加10>"))
    high_score = low_score + 10

    movie_type_list = get_movie_type()
    for movie_type in movie_type_list:
        print("{}爬取中...".format(movie_type[0]))
        get_movie(movie_type, low_score, high_score)

if __name__ == '__main__':
    start()

#  测试代码:
# content = parse_url(type_url)
# # 由于有iframe 所以不能使用xpath
# print(re.findall(r'<a href="/typerank\?type_name=(.*?)&type=(\d+)&interval_id=100:90&action=">.*?</a>',content))
#
#
# """
# <a href="/typerank?type_name=剧情&amp;type=11&amp;interval_id=100:90&amp;action=">剧情</a>
#
# r'<a href="/typerank\?type_name=(.*?)&type=(\d+)&interval_id=100:90&action=">.*?</a>'
# """
#
# response = requests.get(url=movie_url,headers=headers)
# content = response.json()
# print(content) 

五、保存完成结果

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_)爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_
爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影_

本文转自 https://buwenbuhuo.blog.csdn.net/article/details/109329736,如有侵权,请联系删除。

收藏
评论区

相关推荐

商业数据分析从入门到入职(9)Python网络数据获取
@toc 前言本文主要讲Python最常见的应用之一——网络数据获取,即爬虫:先介绍了网页和网络的基础知识,为从网页中获取数据打好基础;接下来以两个案例介绍从网络中获取数据和处理数据的不同方式,以进一步认识Python爬虫和数据处理。 一、网络和网页基础知识 1.数据来源数据源有很多,可以从数据库中获取,可以从文件中获取,也可以从
Python网络爬虫与信息提取
title: Python网络爬虫与信息提取date: 20201210 01:00:23tags: Pythoncategories: 学习笔记 写在前面 不知道写啥其实说实话[TOC] 网络爬虫之规则 安装requests库cmd 命令行打开输入pip3 install requests,等待即可简单测试,爬一下bkjwpythonimport requ
《Python3网络爬虫开发实战》
提取码:1028内容简介 · · · · · ·本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib、requests、正则表达式、Beautiful Soup、XPath、pyquery、数据存储、Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,后介绍了pyspider框架、S
创建免费ip代理池
&ensp;&ensp;&ensp;&ensp; 反爬技术越来越成熟,为了爬取目标数据,必须对爬虫的请求进行伪装,骗过目标系统,目标系统通过判断请求的访问频次或请求参数将疑似爬虫的ip进行封禁,要求进行安全验证,通过python的第三方库faker可以随机生成header伪装请求头,并且减缓爬虫的爬取速度,能很好的避过多数目标系统的反扒机制,但对一些安全等级
3000字 “婴儿级” 爬虫图文教学 | 手把手教你用Python爬取 “实习网”!
1\. 为"你"而写 这篇文章,是专门为那些 "刚学习" Python爬虫的朋友,而专门准备的文章。希望你看过这篇文章后,能够清晰的知道整个 "爬虫流程"。从而能够 "独立自主" 的去完成,某个简单网站的数据爬取。好了,咱们就开始整个 “爬虫教学” 之旅吧!2\. 页面分析 ① 你要爬取的网站是什么?首先,我们应该清楚你要爬去的网站是什么?由于这里我们想要
手把手教你使用XPath爬取免费代理IP
大家好,我是霖hero。前言 可能有人说,初学者Python爬虫爬数据太难啦,构造正则表达式的时候,太烦琐了,眼睛都看花了,而且前一秒还可以愉快地爬取,下一秒IP就被封了,这还爬个屁啊,不爬了。哎,不要着急,这篇文章我们教你如何使用XPath来爬取快代理中的免费代理IP,告别眼花,告别IP被封的烦恼。XPath首先我们来简单了解一下XPath,想要了解更多
实战|手把手教你用Python爬取存储数据,还能自动在Excel中可视化!
大家好,在之前我们讲过如何用Python构建一个带有GUI的爬虫小程序,很多本文将迎合热点,延续上次的NBA爬虫GUI,探讨如何爬取虎扑NBA官网数据。 并且将数据写入Excel中同时自动生成折线图,主要有以下几个步骤。本文将分为以下两个部分进行讲解 在虎扑NBA官网球员页面中进行爬虫,获取球员数据。 清洗整理爬取的球员数据,对其进行可视化。
手把手教你用Pycharm连接远程Python环境
前言本次咱们来操作一下如何在Pycharm上,使用远程服务器上的Python环境。 为什么这样做?这个要从我的一次经历说起,有一次我帮朋友爬取一些东西,由于类别不同,分了几次爬取,这一次我写好规则之后,依然正常爬取,由于我本人比较善良,加上数据量目测并不是太多,并没有使用代理ip,并且将scpay的速度控制的比较慢,一般爬取时,一般也就几分钟而已,泡一杯咖
50 行代码教你爬取猫眼电影 TOP100 榜所有信息
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫架构中的HTML下载器、HTML解析器、数据存储器三大模块: HTML下载器:利用requests模块下载HTML网页; HTML解析器:利用re正则表达
Python3 网络爬虫:下载小说的正确姿势
点击上方“ **Python爬虫与数据挖掘** ”,进行关注 回复“**书籍**”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 少年心事当拂云。 ![](https://oscimg.oschina.net/oscnet/09902b71501b9e8c3cb656b5dfbbb0552e0.jpg) 1 **
Python基础练习(一)中国大学定向排名爬取
说好的要从练习中学习爬虫的基础操作,所以就先从容易爬取的静态网页开始吧! 今天要爬取的是最好大学网上的2018年中国大学排名。我个人认为这个是刚接触爬虫时用来练习的一个很不错的网页了。 在说这个练习之前,给新着手学习爬虫的同学提供一个中国MOOC上北京理工大学嵩天老师的视频, [Python网络爬虫与信息提取](https://www.oschina.n
Python实现王者荣耀小助手(一)
简单来说网络爬虫,是指抓取万维网信息的程序或者脚本,Python在网络爬虫有很大优势,今天我们用Python实现获取王者荣耀相关数据,做一个小助手: 前期准备,环境搭建: Python2.7 sys模块提供了许多函数和变量来处理 Python 运行时环境的不同部分; urllib模块提供了一系列用于操作URL的功能,爬虫所需要的功能,基本上在urll
Python爬取暴走漫画动态图
最近再之乎上看到比较好的Python爬虫教程,看过之后对爬虫有了大概的了解,随后自己写了个爬取[暴走漫画](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fbaozoumanhua.com%2Fcatalogs%2Fgif)动图的爬虫练练手,另外附上[Python爬虫教程](https://w
Python爬取网易云歌单
#### 基本配置: * Python版本:3.7 #### 相关模块: from urllib import parsefrom lxml import etreefrom urllib3 import disable_warningsimport requests #### 案例关键点: 使用单线程爬取,未登录,爬取网易云
Python爬虫
Python爬虫-xpath ============== * Python爬虫-xpath * 说明 * 再说明 * 插件推荐 * 语法讲述 * 举栗子 * 代码里使用 * 实战句子迷 * 需要的总结: 说明 -- 关于Python爬虫请求数据方面的知