python学习之抓取猫眼电影Top100榜单

目录

  • 1 本篇目标
  • 2 url分析
  • 3 页面抓取
  • 4 页面分析
  • 5 代码整合
  • 6 优化
  • 参考:

近期开始学习python爬虫,熟悉了基本库、解析库之后,决定做个小Demo来实践下,检验学习成果。

1 本篇目标

  • 抓取猫眼电影总排行榜Top100电影单
  • 根据电影演员表统计演员上榜次数

2 url分析

目标站点为https://maoyan.com/board/4,打开之后就可以看到排行榜信息,如图所示

页面上显示10部电影,有名次、影片名称、演员信息等信息。当拉到最下面点击第二页的时候,发现url变成了https://maoyan.com/board/4?offset=10,对比原先多了个offset=10,第二页是显示排名11~20的电影,可以推断这是一个偏移量,所以第一页应该是offset=0,第二页是offset=10,依次类推。

3 页面抓取

url分析完之后,利用request模块,我们就可以试试抓取页面。

import requests
# 抓取一页电影信息
def get_one_page(page_index):
    url = 'https://maoyan.com/board/4?offset=' + str(page_index)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0'}
    response = requests.get(url=url, headers=headers)

4 页面分析

页面成功抓取后需要解析提取信息,打开页面的开发者模式,在Network监听组件中查看源代码(注意:不在Elements选项中直接查看源码是因为该源码可能经过javascirpt渲染),如图:

由图可知,一个影片所有信息是在一个<dd>标签里面,一页有10个。

其中名次信息位置是

<i class="board-index board-index-11">11</i>,

电影名称信息位置是:

<p class="name">
    <a href="/films/9025" title="喜剧之王" data-act="boarditem-click" data-val="{movieId:9025}">喜剧之王</a>
</p>

演员信息位置是:

<p class="star">主演:周星驰,莫文蔚,张柏芝</p>

知道了相关信息的位置,就可以利用Pyquery模块对资源进行定位和抓取。继续完善刚才的方法

import requests
from pyquery import PyQuery as pq

# 抓取一页电影信息
def get_one_page(page_index):
    url = 'https://maoyan.com/board/4?offset=' + str(page_index)
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0'}
    response = requests.get(url=url, headers=headers)
    doc = pq(response.text)

    page_info = ''
    name_list = []
    # 遍历<dd>标签,一页抓取10部电影
    for i in doc('dd').items():
        # 计算空格,用于美化格式
        name_len = len(i('.name').children().text())
        other_len = 15 - name_len
        space = ''
        for j in range(other_len):
            space += ' '

        # 按照‘排序 电影名称 主演’的方式返回文本
        page_info += i('.board-index').text() + ' ' + i('.name').children().text() + space + i('.star').text() + '\n'
        name_list += i('.star').text().split(':')[1].split(',')
    # 返回一页电影信息和演员信息
    return page_info, name_list

5 代码整合

在成功抓取一页信息之后,整合代码,将所有信息抓取并处理。

def info_handle():
    # 存储电影信息
    movie_info = ''
    # 存储出现过的演员信息,有重复
    name_info_list = []
    for index in range(10):
        movie_info += get_one_page(index * 10)[0]
        name_info_list += get_one_page(index * 10)[1]

    # 统计人名出现次数
    name_count_list = []
    for i in set(name_info_list):
        dict_name_count = (i, name_info_list.count(i))
        name_count_list.append(dict_name_count)
    # 根据人名出现次数排行
    name_count_list.sort(key=lambda k: k[1], reverse=True)

    # 输出电影信息到文本
    with open('C:\\Users\\d\\Desktop\\xxx.txt', 'w') as f:
        f.write(movie_info)

    # 打印演员出现次数
    for k, v in name_count_list:
        print(k, v)

执行结果如下

txt文本内容:

控制台打印的排名如下:

从结果可以看出,100部电影,张国荣一人就占了7部,排名第一。

6 优化

从图片可以看出,演员排名其实不是很直观,最好是有一个图表的方式。python的matplotlib模块是一个数据可视化模块,拥有很强的功能。不过目前我只是初步学习基础模块,并没有深入了解matplotlib,所以只能从网上找到小demo,简单了解用法之后加以改造。具体用法和原理,待后续深入学习。

声明一个draw.py文件

import matplotlib.pyplot as plt
import numpy as np

class NameCount():
    # 此函数用于垂直条形图
    def show_name_bard(self, name_list_sort, name_list_count):
        plt.rcdefaults()
        fig, ax = plt.subplots()

        y_pos = np.arange(len(name_list_sort))
        ax.barh(y_pos, name_list_count, align='center',
                color='green', ecolor='black')
        plt.rcParams['font.sans-serif'] = ['SimHei']
        ax.set_yticks(y_pos)
        ax.set_yticklabels(name_list_sort)
        ax.invert_yaxis()  # labels read top-to-bottom
        # ax.set_xlabel('')
        ax.set_title('Top100电影演员占有部数统计')
        # 在图画上显示数字
        for x, y in enumerate(name_list_count):
            plt.text(y, x + 0.1, '%s' % y)
        plt.show()

    def getNameTimesSort(self, name_list):
        name_list.sort(key=lambda k: k[1], reverse=True)
        # 按出现次数排序后的人名列表
        name_list_sort = []
        # 按出现次数排序后的人名次数列表,取前20名
        name_list_count = []
        for k, v in name_list[0:20]:
            name_list_sort.append(k)
            name_list_count.append(v)

        # 绘制条形图
        self.show_name_bard(name_list_sort, name_list_count)

然后在info_handle方法中引入getNameTimesSort方法,讲原先用于打印的排好序的name_count_list传入

    # 画出垂直条形图
    statistics = draw.NameCount()
    statistics.getNameTimesSort(name_count_list)

这样就可以生成图像,一目了然:


参考:

《python3网络爬虫开发实战》

原文地址:https://www.cnblogs.com/yozar/p/11457799.html

时间: 2024-10-14 22:14:47

python学习之抓取猫眼电影Top100榜单的相关文章

爬虫实战01——爬取猫眼电影top100榜单

#需求:抓取猫眼电影TOP100的电影名称.时间.评分.图片等信息,提取的结果会以文件的形式保存下来 import requests import time from lxml import etree import json import csv import codecs class MaoYanTop100Spider: #存储电影详情页的url film_page_url_list = [] #存储每个的电影信息 #film_info = {} film_info_list = [] #

使用requests爬取猫眼电影TOP100榜单

Requests是一个很方便的python网络编程库,用官方的话是"非转基因,可以安全食用".里面封装了很多的方法,避免了urllib/urllib2的繁琐. 这一节使用requests库对猫眼电影的TOP100榜进行抓取. 1 获得页面. 首先确定要爬取的url为http://maoyan.com/board/4,通过requests模块,打印出页面的信息 def get_a_page(url): try: response = requests.get(url) if respon

Python-爬虫-基本库(requests)使用-抓取猫眼电影Too100榜

1 #抓取猫眼电影,https://maoyan.com/board/4 榜单电影列表 2 import requests 3 import re 4 from requests.auth import HTTPBasicAuth 5 6 #定义爬虫工具类 7 class SpiderTools(): 8 def __init__(self): 9 super(SpiderTools, self).__init__() 10 #抓取首页信息 11 def load_onePage(self,ur

python爬虫,爬取猫眼电影top100

import requests from bs4 import BeautifulSoup url_list = [] all_name = [] all_num = [] all_actor = [] all_score = [] class Product_url(): # 这个地方传入的url是 https://maoyan.com/board/4?offset= global url_list def __init__(self, url): self.url = url for x i

抓取猫眼电影top100的正则、bs4、pyquery、xpath实现方法

import requests import re import json import time from bs4 import BeautifulSoup from pyquery import PyQuery as pq from lxml import etree # 获取页面源码 def get_one_page(url): try: headers = { # 伪装请求头 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10

00_抓取猫眼电影排行TOP100

前言: 学习python3爬虫大概有一周的时间,熟悉了爬虫的一些基本原理和基本库的使用,本次就准备利用requests库和正则表达式来抓取猫眼电影排行TOP100的相关内容. 1.本次目标: 需要爬去出猫眼电影排行TOP100的电影相关信息,包括:名称.图片.演员.时间.评分,排名.提取站点的URL为http://maoyan.com/board/4,提取的结果以文本形式保存下来. 2.准备工作 只需要安装好requests库即可. 安装方式有很多种,这里只简单的介绍一下通过pip这个包管理工具

python爬取猫眼电影top100排行榜

爬取猫眼电影TOP100(http://maoyan.com/board/4?offset=90)1). 爬取内容: 电影名称,主演, 上映时间,图片url地址保存到mariadb数据库中;2). 所有的图片保存到本地/mnt/maoyan/电影名.png 代码: import re import pymysql as mysql from urllib import request from urllib.request import urlopen u = 'root' p = 'root'

用pyquery 初步改写崔庆才的 抓取猫眼电影排行(正在更新)特意置顶,提醒自己更新

目前正在学Python爬虫,正在读崔庆才的<Python3网络爬虫开发实战>,之前学习正则表达式,但是由于太难,最后放弃了(学渣的眼泪....),在这本书上的抓取猫眼电影排行上,后来自学了pyquery,发现用pyquery可以解决这个问题,目前自己试着写了代码 这个是抓取一页的情况的代码(没有图的链接以及排名还有其他90页的情况) import requests from pyquery import PyQuery as pq def get_one_page(url): headers

# [爬虫Demo] pyquery+csv爬取猫眼电影top100

目录 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 代码君 [爬虫Demo] pyquery+csv爬取猫眼电影top100 站点分析 https://maoyan.com/board/4?offset=0 翻页操作只会改变offset偏移量,每部电影的信息都在dd标签内,使用pyquery库中的css选择器直接解析页面 代码君 css选择器直接选择和使用find()方法的区别:find()用于选择子节点,因此限定了选择的区域,速度可能要快些,直接传入''选择器可能