爬虫基础入门之爬取豆瓣电影Top250-Re正则的使用

news/2025/2/25 7:39:53

网址:豆瓣电影 Top 250

本案例所需要的模块
requests (用于发送HTTP请求)re (用于字符串匹配和操作)

确定需要爬取的数据 :

  1. 电影的名称
  2. 电影的年份
  3. 电影的评分
  4. 电影评论人数

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

准备工作 -分析页面:
F12 or 右击点击检查 查看页面源代码 目的是确定数据是否为静态数据

Ctrl + F 快捷键打开搜索框 将我们所需要爬取的数据输入
发现数据都在前端的页面当中
即拿到页面的源代码 从中提取数据

接着复制浏览器的URL地址 在pycharm里面构建请求

python"># 导包
import requests
import re

url = 'https://movie.douban.com/top250'

# 构建请求体
# user-agent 即UA 为浏览器的基本信息 爬虫程序就是伪装成浏览器从网页拿数据
headers = {
    'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',

}

resp = requests.get(url=url, headers=headers)

print(resp.text.encode('gbk', 'ignore').decode('gbk'))

  我这里会出现一个编码的问题 查找资料之后 需要先用 GBK 编码,加个 ignore 丢弃错误的字符,然后再解码

之后在拿到的网页源代码中 老样子Ctrl+F 检查爬取的数据是否存在

二. 解析数据 提取数据

OK 接着我们需要从页面源代码中提取出我们想要的数据

分析页面的结构

python">ex = re.compile(r'<div class="hd">.*?<span class="title">(?P<name>.*?)</span>',re.S)
# 不需要的内容通过.*?过掉 给需要取出的内容 取值为name 类似字典
result = ex.findall(text)

# findall返回的是一个列表
# finditer 返回的是一个迭代器 后续需要通过for循环取出
# re.search() 返回的是match对象  需要.group拿数据 只能拿到匹配到的第一个数据
# re.match() 从头开始匹配 类似^
# 预加载正则表达式  后续可重复使用该正则
# re.complie(r'正则')

继续编写正则 想象这是一篇文章 不需要的通过.*?过滤出去 用(.*?)保留下来
后续通过类似 键值对取值取出

我们通过迭代器的方式 提取

python">ex = re.compile(r'<div class="hd">.*?<span class="title">(?P<name>.*?)'
                r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?'
                r'<span class="rating_num" property="v:average">(?P<judge>.*?)</span>.*?'
                r'<span>(?P<num>.*?)人评价</span>.*?'
                r'<p class="quote"><span class="inq">(?P<intro>.*?)。</span></p>',re.S)
result = ex.finditer(text)
for i in result:
    # 通过.group取数据
    # 检验拿到的数据
    print(i.group('name'))
    #  去除前面的空格
    print(i.group('year').strip())
    print(i.group('judge'))
    print(i.group('num'))

三.保存数据 存储为 csv excel 文件

接着我们保存爬取的数据  需要用到csv模块

python"># 导包
import csv

f = open('movie.csv','w',encoding='utf-8',newline='')
# newline 解决空行的问题
csv_writer = csv.writer(f)
# 写入表头
csv_writer.writerow(['电影名','年份','评分','评价人数'])

python">for i in result:
    # 将数据存储为字典格式
    dit = i.groupdict()
    # 处理年份前的空格
    dit['year'] = dit['year'].strip()
    #将值写入csv文件
    csv_writer.writerow(dit.values())
# 与with open 不同的是 open需要手动关闭
f.close()

另外一种保存数据的方式 pandas 个人觉得pandas方便很多
以下是实现代码

 

python"># 导包
import pandas as pd
# 定义一个空列表 后面将dit字典数据存储进去
lis = []

for i in result:
    dit = i.groupdict()
    # 处理年份前的空格
    dit['year'] = dit['year'].strip()
    # 只需要改这两行代码
    lis.append(dit)
    pd.DataFrame(lis).to_excel('movie1.xlsx',index=False)

运行结果如下 如果在excel 中打开此文件 会乱码 需要将编码格式写为 utf-8-sig 

多页采取的话 需要分析一下 请求的url地址 之后构建个for循环去遍历

分析二三页的地址 可得 start参数间隔25 

其实是为了学习正则而采用正则去提取数据 只有在特定的情况下才使用正则 一般使用其它的方法

以下是本次案例的所有代码 供学习交流使用

python">import requests
import re
import csv

f = open('movie.csv', 'w', encoding='utf-8-sig',newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['电影名', '年份', '评分', '评价人数'])
for page in range(0, 250, 25):

    url = f'https://movie.douban.com/top250?start={page}&filter='

    headers = {
        'user-agent':
            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0',
    }

    resp = requests.get(url=url, headers=headers)
    text = resp.text.encode('gbk', 'ignore').decode('gbk')
    ex = re.compile(r'<div class="hd">.*?<span class="title">(?P<name>.*?)'
                    r'</span>.*?<p class="">.*?<br>(?P<year>.*?)&nbsp.*?'
                    r'<span class="rating_num" property="v:average">(?P<judge>.*?)</span>.*?'
                    r'<span>(?P<num>.*?)人评价</span>.*?'
                    , re.S)
    result = ex.finditer(text)
    for i in result:
        dit = i.groupdict()
        # 处理年份前的空格
        dit['year'] = dit['year'].strip()
        csv_writer.writerow(dit.values())


http://www.niftyadmin.cn/n/5865185.html

相关文章

Python将GIF动图转换为Base64编码字符串

文章目录 步骤一&#xff1a;准备Python环境步骤二&#xff1a;编写Python脚本步骤三&#xff1a;运行Python脚本步骤四&#xff1a;查看输出步骤五&#xff1a;在HTML中使用Base64字符串注意事项 在Web开发中&#xff0c;有时需要将图像文件&#xff08;如GIF动图&#xff09;…

Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相

(图片&#xff1a;AWS) Anthropic 旗下先进的 AI 模型 Claude 3.7 Sonnet 似乎即将发布。业界预计&#xff0c;亚马逊可能会在2025年2月26日的活动中公布相关消息。泄露的信息表明&#xff0c;该模型将托管于 AWS Bedrock 平台&#xff0c;该平台以提供尖端 AI 模型访问而闻名…

MFC—加法器

1.需要为编辑框添加变量 2.在cpp文件中的按钮中添加代码 void CMFCAddtionDlg::OnBnClickedButton1() {// TODO: 在此添加控件通知处理程序代码UpdateData(true);//把控件里的值更新给变量m_add m_add1 m_add2;//加法UpdateData(false);//把控件相加的值赋值给控件 }

Python+Flutter前后端分离开发跨平台待办事项APP实战

以下是一个简单的示例&#xff0c;展示如何使用 Flutter 开发一个待办事项应用&#xff0c;并通过 FastAPI 和 SQLAlchemy 作为后端接口。为了简化代码&#xff0c;所有的 Flutter 前端代码将写在一个 main.dart 文件中。 1. 后端部分&#xff08;FastAPI SQLAlchemy&#xf…

Node.js 入门 原型链污染

前言 node.js是后端的语言 我们知道的apache 服务器 才能支撑一些代码 但是 node.js是一个独立的环境&#xff08;node.js本身就是一个平台&#xff09;这个就是为什么很多小程序和app是直接使用它的 nodejs的特点 &#xff1a; 1、单线程 &#xff1a;一次node 只能执行…

DSP芯片C6678的SRIO及其中断跳转的配置

C6678SRIO读写测试门铃中断跳转测试 SRIO简述代码前言SRIO配置原始代码1.使能电源2.初始化SRIO回环修改 3.SRIO测试 Doorbell门铃中断1.初始化中断函数2.中断向量表建立3.中断向量表的链接 本博客基于创龙“678ZH产品线”的SRIO代码&#xff0c;部分参考于网友们的博客&#xf…

angular表格排序分页

说明: 使用angular实现表格&#xff0c;包括数据源&#xff0c;排序&#xff0c;分页 效果图&#xff1a; step1:C:\Users\Administrator\WebstormProjects\untitled4\src\app\setting\setting.component.ts import { Component, ViewChild, AfterViewInit } from angular/c…

一文讲解Redis中的数据一致性问题

一文讲解Redis中的数据一致性问题 在技术派实战项目中&#xff0c;我们采用的是先写 MySQL&#xff0c;再删除 Redis 的方式来保证缓存和数据库的数据一致性。 我举例说明一下。 对于第一次查询&#xff0c;请求 B 查询到的缓存数据是 10&#xff0c;但 MySQL 被请求 A 更新为…