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

网址:豆瓣电影 Top 250

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

确定需要爬取的数据 :

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

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

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

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

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

# 导包
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 接着我们需要从页面源代码中提取出我们想要的数据

分析页面的结构

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'正则')

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

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

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模块

# 导包
import csv

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

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方便很多
以下是实现代码

 

# 导包
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 

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

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

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())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977847.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文笔记(七十二)Reward Centering(五)

Reward Centering&#xff08;五&#xff09; 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…

Flash-03

1-问题&#xff1a;Flash软件画两个图形&#xff0c;若有部分重合则变为一个整体 解决方法1&#xff1a;两个图形分属于不同的图层 解决方法2&#xff1a;将每个图形都转化为【元件】 问题2&#xff1a;元件是什么&#xff1f; 在 Adobe Flash&#xff08;现在称为 Adobe Anim…

ssh配置 远程控制 远程协作 github本地配置

0.设备版本 windows11 ubuntu24.0.4 1.1 在 Linux 上启用 SSH 服务 首先&#xff0c;确保 Linux 计算机上安装并启用了 SSH 服务。 安装和启动 OpenSSH 服务&#xff08;如果未安装&#xff09; # 在终端安装 OpenSSH 服务&#xff08;如果尚未安装&#xff09; sudo apt …

C语言数据结构—堆的应用及Topk问题

目录 1、堆排序 1、把数组先原地调整成堆 1.1 向上调整 1.2 向下调整 1.3 两种调整方式的时间复杂度分析 2、进行排序 1、堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1、建堆 升序&#xff1a;建大堆 降序&#xff1a;建小堆 2、利…

贪心算法精品题

1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…

【Blender】三、材质篇--01,Blender材质基础 原理化BSDF

0 00:00:05,460 --> 00:00:09,980 好 材质篇上一张呢 我们做了12个模型 我知道大家很想把它晒出来 1 00:00:10,440 --> 00:00:17,360 但是咱们先把材质学了吧 学材质 我们只要抓住那些对精髓的东西就好了 能够用手试出来的东西呢 你 2 00:00:17,530 --> 00:00:30,37…

博客系统完整开发流程

前言 通过前⾯课程的学习, 我们掌握了Spring框架和MyBatis的基本使用, 并完成了图书管理系统的常规功能开发, 接下来我们系统的从0到1完成⼀个项⽬的开发. 企业开发的流程 1. 需求评审(产品经理(PM)会和运营(想口号),UI,测试,开发等沟通) ,会涉及到背景/目标/怎么做,可能会有多…

iOS App的启动与优化

App的启动流程 App启动分为冷启动和热启动 冷启动&#xff1a;从0开始启动App热启动&#xff1a;App已经在内存中&#xff0c;但是后台还挂着&#xff0c;再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段&#xff1a; dyld&#xff1a…

一键导出数据库表到Excel

工作中&#xff0c;我们经常需要将数据库表导出到Excel&#xff0c;通常我们会用数据库编辑器之类的工具提供的导出功能来导出&#xff0c;但是它们的导出功能通常都比较简单。 这篇文章将介绍一种简单易用并且功能强大的导出方法。 新增导出 打开的卢导表工具&#xff0c;新…

1.1部署es:9200

安装es&#xff1a;root用户&#xff1a; 1.布署java环境 - 所有节点 wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.rpm yum localinstall jdk-8u341-linux-x64.rpm -y java -version 2.下载安装elasticsearch - 所有节点 wget ftp://10.3.148.254/Note/Elk/…

基于YOLO11深度学习的半导体芯片缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

财务运营域——营收稽核系统设计

摘要 本文主要介绍了营收稽核系统的背景、特点与作用。营收稽核系统的产生源于营收管理复杂性、财务合规与审计需求、提升数据透明度与决策效率、防范舞弊与风险管理、技术进步与自动化需求、多元化业务模式以及跨部门协作与数据整合等多方面因素。其特点包括自动化与智能化、…

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…

速通HTML

目录 HTML基础 1.快捷键 2.标签 HTML进阶 1.列表 a.无序列表 b.有序列表 c.定义列表 2.表格 a.内容 b.合并单元格 3.表单 a.input标签 b.单选框 c.上传文件 4.下拉菜单 5.文本域标签 6.label标签 7.按钮标签 8.无语义的布局标签div与span 9.字符实体 HTML…

ui设计公司兰亭妙微分享:科研单位UI界面设计

科研单位的UI界面设计是一项至关重要的任务&#xff0c;它不仅关乎科研工作的效率&#xff0c;还直接影响到科研人员的用户体验。以下是对科研单位UI界面设计的详细分析&#xff1a; 一、设计目标 科研单位的UI界面设计旨在提升科研工作的效率与便捷性&#xff0c;同时确保科…

蓝桥杯刷题-dp-线性dp(守望者的逃离,摆花,线段)

[NOIP 2007 普及组] 守望者的逃离 题目描述 恶魔猎手尤迪安野心勃勃&#xff0c;他背叛了暗夜精灵&#xff0c;率领深藏在海底的娜迦族企图叛变。 守望者在与尤迪安的交锋中遭遇了围杀&#xff0c;被困在一个荒芜的大岛上。 为了杀死守望者&#xff0c;尤迪安开始对这个荒岛…

【算法设计与分析】(一)介绍算法与复杂度分析

【算法设计与分析】&#xff08;一&#xff09;介绍算法与复杂度分析 前言一、什么是算法&#xff1f;二、算法的抽象机制三、描述算法四、复杂度分析4.1 时间复杂度4.2 空间复杂度 前言 从搜索引擎的高效检索&#xff0c;到推荐系统的个性化推荐&#xff0c;再到人工智能领域…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car&#xff0c;需要转换到相机坐标系下&#xff0c;旋转矩阵R_car2Cam&#xff0c;平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1&#xff1a;先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

OpenGL ES -> GLSurfaceView绘制点、线、三角形、正方形、圆(顶点法绘制)

XML文件 <?xml version"1.0" encoding"utf-8"?> <com.example.myapplication.MyGLSurfaceViewxmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"…

基于springboot大学生学科竞赛管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 学科竞赛一直是检测学生学习能力好坏的重要手段&#xff0c;随着社会的发展&#xff0c;学科竞赛已经渗透到各个方面。但是传统方式的竞赛方式已经不能更好的胜任越来越多的需求&#xff0c;所以需要设计一个大学生学科竞赛管理系统&#xff0c;来满足日益重要的学科竞赛…