# Python3 爬虫实战 — 猫眼电影TOP100

TRHX

2019-09-24

Python3 学习笔记 / 爬虫实战

字数统计:

964字

阅读时长≈

5分

> 爬取时间：2019-09-23
> 爬取难度：★☆☆☆☆☆
> 请求链接：https://maoyan.com/board/4
> 爬取目标：猫眼 TOP100 的电影名称、排名、主演、上映时间、评分、封面图地址，数据保存为 CSV 文件
> 涉及知识：请求库 requests、解析库 lxml、Xpath 语法、CSV 文件储存
> 完整代码：https://github.com/TRHX/Python3-Spider-Practice/tree/master/maoyan-top100
> 其他爬虫实战代码合集（持续更新）：https://github.com/TRHX/Python3-Spider-Practice
> 爬虫实战专栏（持续更新）：https://itrhx.blog.csdn.net/article/category/9351278

# 【1x00】循环爬取网页模块

观察猫眼电影TOP100榜，请求地址为：https://maoyan.com/board/4

每页展示10条电影信息，翻页观察 url 变化：

第一页：https://maoyan.com/board/4

第二页：https://maoyan.com/board/4?offset=10

第三页：https://maoyan.com/board/4?offset=20

一共有10页，利用一个 for 循环，从 0 到 100 每隔 10 取一个值拼接到 url，实现循环爬取每一页

    1
    2
    3
    4
    5
    6
    7
    8

    def index_page(number):
        url = 'https://maoyan.com/board/4?offset=%s' % number
        response = requests.get(url=url, headers=headers)
        return response.text

    if __name__ == '__main__':
        for i in range(0, 100, 10):
            index = index_page(i)

# 【2x00】解析模块

定义一个页面解析函数 `parse_page()`，使用 lxml 解析库的 Xpath 方法依次提取电影排名（ranking）、电影名称（movie_name）、主演（performer）、上映时间（releasetime）、评分（score）、电影封面图 url（movie_img）

通过对主演部分的提取发现有多余的空格符和换行符，循环 performer 列表，使用 `strip()` 方法去除字符串头尾空格和换行符

电影评分分为整数部分和小数部分，依次提取两部分，循环遍历组成一个完整的评分

最后使用 `zip()` 函数，将所有提取的对象作为参数，将对象中对应的元素打包成一个个元组，然后返回由这些元组组成的列表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    def parse_page(content):
        tree = etree.HTML(content)
        # 电影排名
        ranking = tree.xpath("//dd/i/text()")
        # 电影名称
        movie_name = tree.xpath('//p[@class="name"]/a/text()')
        # 主演
        performer = tree.xpath("//p[@class='star']/text()")
        performer = [p.strip() for p in performer]
        # 上映时间
        releasetime = tree.xpath('//p[@class="releasetime"]/text()')
        # 评分
        score1 = tree.xpath('//p[@class="score"]/i[@class="integer"]/text()')
        score2 = tree.xpath('//p[@class="score"]/i[@class="fraction"]/text()')
        score = [score1[i] + score2[i] for i in range(min(len(score1), len(score2)))]
        # 电影封面图
        movie_img = tree.xpath('//img[@class="board-img"]/@data-src')
        return zip(ranking, movie_name, performer, releasetime, score, movie_img)

# 【3x00】数据储存模块

定义一个 `save_results()` 函数，将所有数据保存到 `maoyan.csv` 文件

    1
    2
    3
    4

    def save_results(result):
        with open('maoyan.csv', 'a') as fp:
            writer = csv.writer(fp)
            writer.writerow(result)

# 【4x00】完整代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59

    # =============================================
    # --*-- coding: utf-8 --*--
    # @Time    : 2019-09-23
    # @Author  : TRHX
    # @Blog    : www.itrhx.com
    # @CSDN    : https://blog.csdn.net/qq_36759224
    # @FileName: maoyan.py
    # @Software: PyCharm
    # =============================================

    import requests
    from lxml import etree
    import csv

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    }

    def index_page(number):
        url = 'https://maoyan.com/board/4?offset=%s' % number
        response = requests.get(url=url, headers=headers)
        return response.text

    def parse_page(content):
        tree = etree.HTML(content)
        # 电影排名
        ranking = tree.xpath("//dd/i/text()")
        # 电影名称
        movie_name = tree.xpath('//p[@class="name"]/a/text()')
        # 主演
        performer = tree.xpath("//p[@class='star']/text()")
        performer = [p.strip() for p in performer]
        # 上映时间
        releasetime = tree.xpath('//p[@class="releasetime"]/text()')
        # 评分
        score1 = tree.xpath('//p[@class="score"]/i[@class="integer"]/text()')
        score2 = tree.xpath('//p[@class="score"]/i[@class="fraction"]/text()')
        score = [score1[i] + score2[i] for i in range(min(len(score1), len(score2)))]
        # 电影封面图
        movie_img = tree.xpath('//img[@class="board-img"]/@data-src')
        return zip(ranking, movie_name, performer, releasetime, score, movie_img)

    def save_results(result):
        with open('maoyan.csv', 'a') as fp:
            writer = csv.writer(fp)
            writer.writerow(result)

    if __name__ == '__main__':
    	print('开始爬取数据...')
        for i in range(0, 100, 10):
            index = index_page(i)
            results = parse_page(index)
            for i in results:
                save_results(i)
    	print('数据爬取完毕！')

# 【4x00】数据截图

<fancybox>
</fancybox>

您的喜欢是作者写作最大的动力！❤️

- PayPal
- AliPay
- WeChatPay
- QQPay

Donate

最后更新于 2019年10月21日

爬虫

猫眼电影

###### 上一页

#### Python3 爬虫实战 — 豆瓣电影TOP250

###### 爬虫 豆瓣电影

###### 下一页

#### Python3 爬虫学习笔记 C18

###### 爬虫 pyspider

#### 评论

## ๑۩ﺴ TRHX ﺴ۩๑

本文目录
欢迎光临

Hexo QQ 交流群 Telegram 交流群

CSDN 内容合伙人

文章分类

- BLOG
  (4)
- CDN
  (1)
- Hexo
  (9)
- Java
  (1)
- Linux
  (2)
- Markdown
  (2)
- Python 数据分析
  (27)
- Matplotlib
  (11)
- NumPy
  (6)
- Pandas
  (10)
- Python3 学习笔记
  (41)
- 基础学习
  (9)
- 学习经验
  (4)
- 爬虫学习
  (18)
- 爬虫实战
  (10)
- VPS
  (1)
- WEB前端
  (2)
- 图床
  (1)

热门标签
12306 3D图 58同城 Ajax BLOG Beautiful Soup CDN Coding Pages DataFrame Deepin Elicpse GitHub Pages Github Github Pages GroupBy HTTPS Hexo ICP备案 IO操作 Index JDBC JS 预加载 LaTeX Markdown Material X Matplotlib MongoDB MySQL NumPy PEP8 Pandas PicGo Pygame Python Redis SEO SQL Server 2012 SSR Selenium Series Ubuntu User-Agent VMware VPS XPath if语句 input()函数 instant.page jsDelivr lxml matplotibrc pyspider requests spfk urllib while循环 主题个性化 代理 位运算 公安备案 函数 函数应用 分割 切片 列表 判断函数 前程无忧 变量 合并数据集 哔哩哔哩 图例 图床 图形验证码 垃圾 备份 子图 字典 字符串函数 安居客 层级索引 年终总结 广播 异常 技巧 拼接 排序 排序函数 操作列表 散点图 数学函数 数据分裂 数据可视化 数据合并 数据替换 数据类型 数据读写 数据重塑 数组 文件 文件储存 无界面浏览器 时间序列 映射 条件函数 条形图 极区图 极坐标图 柱状图 模块 正则表达式 滑动验证码 点触验证码 爬虫 猫眼电影 瓜子二手车 画布 直方图 矩阵 等值线图 等高线图 算术函数 算术运算 类 索引 线性代数 线性图 统计函数 统计描述 统计计算 继承 编辑器 缺失值 网格 肺炎疫情 虎扑论坛 补丁 豆瓣电影 迭代 雷达图 饼状图
最近在听