Python 爬虫基础 爬取豆瓣电影Top榜(最新 超详细)

网址: 豆瓣电影 Top 250

本案列所使用的模块:

  1. requests
  2. parsel  pip install  parsel
  3. csv 保存数据  

工具:

爬虫工具库-spidertools.cn

爬取步骤:

一.请求数据  模拟浏览器向服务器发送请求 

        打开网站 打开开发者工具 F12 or 右击     

Ctrl+F 打开搜索 搜索我们需要的数据接口

老样子 复制curl 打开我们的工具  转换成py请求代码 记住一定是bash

二. 获取服务器返回的数据

在本地新建py文件  运行后可以测试检查我们想要的数据 是否成功请求到

在控制台点击Ctral+f 搜索需要爬取的内容 发现有

三. 解析数据 提取我们想要的数据

        本次我们采用新的模块进行数据的提取 parsel  采用里面的CSS 选择器

        Explain:css 选择器 主要根据标签属性内容提取数据

        导包  import parsel

        初始化selector 对象   将网页响应文本转换为可解析的对象

       selector = parsel.Selector(resp.text)

        接着我们分析 静态页面数据

        如上面的箭头所示  我们可以发现 每一条电影数据都是包含在  li 标签中的 而所有的li标签 在div框中 因此我们可以获取到包含所有数据的根标签 后续通过for 循坏进行遍历 提取其中的内容

        

# 获取所有li标签 返回数据列表 列表里面的每一个元素都是selector对象
# 通过CSS选择器去提取数据 和css语法一样  可以.css 也可以.xpath 但xpath可以用正则就不在这里赘述了
# '.类名属性'    '# id属性'
lis = selector.css('.grid_view li')  

         继续分析提取电影名字等信息 

        电影名字: 类名为hd下面的span 标签  第一个为电影名称

        类似地像这样分析提取数据

# 接着for 循坏提取数据 
for i in lis:
        title = i.css('.hd span.title:nth-child(1)::text').getall()
        # 提取主演 演员的信息
        movie_info_list = i.css('.bd p:nth-child(1)::text').getall()
        # 根据控制台的输出结果 对我们的代码做一个调整
        # 把列表取出 通过strip方法 去除所有的空格 接着以 空格分隔数据
        actor_list = movie_info_list[0].strip().split('NBSPNBSPNBSP')
        # 将主演和导演分开取值 分别赋值 取个变量 
        # 用字符串替换 将不想要的字符替换 弄成我们想要的数据  只要导演 主演的名字 其它一律不要
        actor1 = actor_list[0].replace('导演:', '').replace('/...', '').replace('主演:', '').split('    ')
        # 通过后续的运行我们可以发现 有的只有导演没有主演的情况 这时候我们可以 做个if判断语句
            # 当提取出来的导演信息的长度为2时 正常取值 只有一个就赋值相同
        if len(actor1) == 2:
            actor2 = actor1[0]
            actor3 = actor1[1]
        else:
            actor2 = actor1[0]
            actor3=actor2
        # 进一步处理数据
        movie_info = movie_info_list[1].strip().split('NBSP/NBSP')
        # 电影年份
        movie_year = movie_info[0].split('/')[0]
        # 电影国家
        movie_country = movie_info[0].split('/')[1]
        # 电影类型
        movie_type = movie_info[0].split('/')[2]
        # 电影简介
        introduce = i.css('.quote .inq::text').getall()
        # 电影评论
        judge = i.css(' .rating_num::text').getall()
        # 评价人数
        people = i.css('.star span:nth-child(4)::text').getall()

        具体的每个信息的提取我就不多讲述了 大家可以自己去琢磨分析

    四.保存数据 保存数据到本地

        我们可以通过字典类型进行数据的保存

        
        dit = {
            '标题': title[0],
            '导演': actor2,
            '演员': actor3,
            '电影年份': movie_year,
            '国家': movie_country,
            '电影类型': movie_type,
            '电影简介': introduce,
            '电影评分': judge[0],
            '评论人数': people[0],
        }
       

        导入Csv 模块
        1.打开或创建CSV文件:使用 open 函数以追加模式 (a) 和 UTF-8 编码 (utf-8-sig) 打开或创建 一个豆瓣Top250.csv 文件
        2.创建DictWriter对象:使用 csv.DictWriter 创建一个字典写入器对象,指定字段名称列表。
        3.写入表头:调用 writeheader 方法将字段名称作为表头写入CSV文件。
        4.后续 将dit 字典数据写入文件

f = open('豆瓣Top250.csv', mode='a', encoding='utf-8-sig', newline='')
#newline换行的意思
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '导演',
    '演员',
    '电影年份',
    '国家',
    '电影类型',
    '电影简介',
    '电影评分',
    '评论人数',
])
csv_writer.writeheader()

对此数据的采集就结束啦  至于多页的数据采集 我们可以分析它每一页的参数变化

以下分别是第二页和第三页以及最后一页的url地址 

可以发现 每多一页 多25 可以for循坏 步长就是25

以下是全部的代码 可以供大家交流学习使用  本次的案列分析就到这里 感谢大家的观看

import requests
import parsel
import csv


f = open('豆瓣Top250.csv', mode='a', encoding='utf-8-sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '导演',
    '演员',
    '电影年份',
    '国家',
    '电影类型',
    '电影简介',
    '电影评分',
    '评论人数',
])
csv_writer.writeheader()


num=0
for i in range(0,250,25):
    print(f'正在爬取第{num}页数据')
    num += 1
    url = f'https://movie.douban.com/top250?start={i}&filter='
    headers = {
        'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
    }
    resp = requests.get(url, headers=headers)

    selector = parsel.Selector(resp.text)
    

    lis = selector.css('.grid_view li')  # 获取所有li标签 返回数据列表 列表里面的每一个元素都是selector对象

    for i in lis:
        title = i.css('.hd span.title:nth-child(1)::text').getall()
        movie_info_list = i.css('.bd p:nth-child(1)::text').getall()
        actor_list = movie_info_list[0].strip().split('NBSPNBSPNBSP')
        actor1 = actor_list[0].replace('导演:', '').replace('/...', '').replace('主演:', '').split('    ')
        if len(actor1) == 2:
            actor2 = actor1[0]
            actor3 = actor1[1]
        else:
            actor2 = actor1[0]
            actor3=actor2
        movie_info = movie_info_list[1].strip().split('NBSP/NBSP')
        movie_year = movie_info[0].split('/')[0]
        movie_country = movie_info[0].split('/')[1]
        movie_type = movie_info[0].split('/')[2]
        introduce = i.css('.quote .inq::text').getall()
        judge = i.css(' .rating_num::text').getall()
        people = i.css('.star span:nth-child(4)::text').getall()
        dit = {
            '标题': title[0],
            '导演': actor2,
            '演员': actor3,
            '电影年份': movie_year,
            '国家': movie_country,
            '电影类型': movie_type,
            '电影简介': introduce,
            '电影评分': judge[0],
            '评论人数': people[0],
        }
        csv_writer.writerow(dit)

        print(title, actor1, movie_year, movie_country, movie_type, introduce, judge, people)





        

作者:Serendipity_Carl

物联沃分享整理
物联沃-IOTWORD物联网 » Python 爬虫基础 爬取豆瓣电影Top榜(最新 超详细)

发表回复