Python爬虫抓取豆瓣TOP250数据从分析到实践的全过程(详细图解)

 更新时间:2025年10月25日 08:56:31   作者:蒋星熠Jaxonic  
本文介绍了使用Python爬取豆瓣电影Top250数据的方法,首先验证了目标数据在页面源代码中,然后通过requests模块获取页面内容,添加请求头绕过反爬机制,接着使用re模块编写正则表达式,采用惰性匹配模式提取信息,通过循环实现翻页爬取,将10页共250条数据保存为CSV文件

一、开门见山,探究网页结构

在爬取之前我们要确定需要的数据究竟是在页面源代码里,还是不在页面源代码里(是不是一次性全加载进来的),如果页面源代码里没有想要的数据,说明还有其它请求获取的数据。

让我们打开页面:

右键查看页面源代码,Ctrl+/页面搜索关键词:肖申克

可以看到这时候我们需要的数据是都在页面源代码里的,验证了我们的想法:该页面数据是一次性全加载进来的,因此得到以下思路。

二、确定思路

1.拿到页面源代码/响应

2.编写正则,提取页面数据

3.保存数据

三、步骤详解

1.初步爬取

1.1 确定请求方式

接下来按F12,进入开发者工具看看怎么个事儿,发现有个Top250(这个就是第一页的页面url链接,即响应就是页面源代码

1.2 引入request模块

发现这里的请求是Get,因此引入request模块,导入request.get(页面链接)

import requests

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

resp=requests.get(url)  #获取对应页面url的请求响应

pageSource=resp.text   #把页面源代码输出

print(pageSource)  #打印

这时候运行发现结果是空的:

2.绕过反爬

2.1 加入请求头

说明缺少一个反爬的验证,浏览器自动拦截了,这时候需要加一个请求头

import requests

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

headers={

"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0"

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

pageSource=resp.text

print(pageSource)

这样就可以了:

3.编写正则表达式与正则匹配

3.1 编写正则表达式

接下来就需要进行数据分离:

引入re模块,编写正则表达式:

首先从标题开始提取,从<div class="item">为开头,目标是第二个框里的文字内容,这时候需要用到惰性匹配:.*?

3.2 对比表格

特性.* (贪婪).*? (非贪婪/懒惰)
核心原则匹配尽可能的字符匹配尽可能的字符
别名贪婪模式非贪婪模式、懒惰模式、最小匹配模式
回溯行为先吃到尾,再往回找吃一个看一次,满足就停
示例文本Hello "World" and "Universe"Hello "World" and "Universe"
正则".*"".*?"
匹配结果一个结果:"World" and "Universe"两个结果:"World" 和 "Universe"
适用场景匹配大块的、从开始标志到结束标志之间的所有内容匹配多个、成对标签/引号之间的单个内容
这里样例的惰性匹配的结果是两个结果的额原因是开启了全局模式
 

没有 g 标志:

  • 引擎在找到第一个匹配项后就停止。

有 g 标志:

  • 引擎在找到第一个匹配项后,会从上次匹配结束的位置开始,继续寻找下一个匹配项。

但是这里还有一个坑,那就是.在匹配的时候是跳过所有非换行符的内容

而re.S可以让正则表达式中的.匹配换行符

#编写正则表达式
re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>',re.S)

3.3 进行正则匹配

接下来进行正则匹配:

#进行正则匹配
result=obj.finditer(pageSource)
for item in result:
    print(item.group("name"))

然后根据上面的规则对源代码进行匹配:

#编写正则表达式
obj=re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<div class="bd">'
               r'.*?<p>.*?导演: (?P<dao>.*?)&nbsp;'
               r'.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
               r'.*?<span>(?P<num>.*?)人评价</span>',re.S)

#进行正则匹配
result=obj.finditer(pageSource)
for item in result:
    name=item.group("name")
    dao=item.group("dao")
    year = item.group("year").strip()   #去掉字符串两侧的空白
    score = item.group("score")
    num = item.group("num")
    print(name,dao,year,score,num)

得到了结果:

3.4 保存文件

接下来保存为文件:

f=open("top250.csv",mode="w",encoding='utf-8')

导出数据:

f.write(f"{name}{dao}{year}{score}{num}\n")

爬取一页的完整代码:

# 思路:
#
# 1.拿到页面源代码
#
# 2.编写正则,提取页面数据
#
# 3.保存数据

import requests
import re

f=open("top250.csv",mode="w",encoding='utf-8')



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

headers={

"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0"

}
resp=requests.get(url,headers=headers)
resp.encoding="utf-8"  #解决乱码问题
pageSource=resp.text

#编写正则表达式
obj=re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<div class="bd">'
               r'.*?<p>.*?导演: (?P<dao>.*?)&nbsp;'
               r'.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
               r'.*?<span>(?P<num>.*?)人评价</span>',re.S)

#进行正则匹配
result=obj.finditer(pageSource)
for item in result:
    name=item.group("name")
    dao=item.group("dao")
    year = item.group("year").strip()   #去掉字符串两侧的空白
    score = item.group("score")
    num = item.group("num")
    f.write(f"{name}{dao}{year}{score}{num}\n")
    print(name,dao,year,score,num)


f.close()
resp.close()

print("豆瓣Top250提取完毕")

这时候思考,现在的代码只能爬取一页的25条信息,如何爬取全部250条?

4.翻页爬取

由于发现每跳转一页页面url的start都会增加25,因此得出可以用while循环来爬取全部数据

start=(页数-1)*25

四、完整代码与注意点

1.完整代码

# 思路:
#
# 1.拿到页面源代码
#
# 2.编写正则,提取页面数据
#
# 3.保存数据

import requests
import re

f=open("top250.csv",mode="w",encoding='utf-8')
#start=(页数-1)*25
page=1

while page<=10:
    url=f"https://movie.douban.com/top250?start={(page - 1) * 25}&filter="

    headers={

    "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36 Edg/141.0.0.0"

    }
    resp=requests.get(url,headers=headers)
    resp.encoding="utf-8"  #解决乱码问题
    pageSource=resp.text

    #编写正则表达式
    obj=re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?<div class="bd">'
                   r'.*?<p>.*?导演: (?P<dao>.*?)&nbsp;'
                   r'.*?<br>(?P<year>.*?)&nbsp;.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                   r'.*?<span>(?P<num>.*?)人评价</span>',re.S)

    #进行正则匹配
    result=obj.finditer(pageSource)
    for item in result:
        name=item.group("name")
        dao=item.group("dao")
        year = item.group("year").strip()   #去掉字符串两侧的空白
        score = item.group("score")
        num = item.group("num")
        f.write(f"{name}{dao}{year}{score}{num}\n")
        print(name,dao,year,score,num)
    print(f"第{page}页爬取完成")

    page = page + 1



f.close()
resp.close()

print("豆瓣Top250提取完毕")

2.注意点

解释一下

url=f"https://movie.douban.com/top250?start={(page - 1) * 25}&filter="

这里的f必须要加

不加 f 的情况:

url="https://movie.douban.com/top250?start={(page - 1) * 25}&filter="

实际URL变成了:

https://movie.douban.com/top250?start={(page - 1) * 25}&filter=

注意:{(page - 1) * 25} 被当作普通字符串,而不是要计算的表达式。无论 page 是多少,URL 始终是这个固定的字符串。

豆瓣服务器收到这个请求时,看到 start={(page - 1) * 25},它不知道这是什么,通常会将其视为 start=0 或者忽略这个参数,所以每次都返回第一页的数据。

五、结果展示

成功爬取250条数据~

到此这篇关于Python爬虫抓取豆瓣TOP250数据从分析到实践的全过程(详细图解)的文章就介绍到这了,更多相关Python爬取豆瓣TOP数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Python+Flask设计实现AI智能天气助手系统

    基于Python+Flask设计实现AI智能天气助手系统

    这篇文章主要为大家详细介绍了如何基于Python和Flask设计实现一个AI智能天气助手系统,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下
    2025-03-03
  • Python使用xlrd模块实现操作Excel读写的方法汇总

    Python使用xlrd模块实现操作Excel读写的方法汇总

    本文介绍Python中使用xlrd、xlwt、xlutils模块操作Excel文件的方法,xlrd用于读取Excel文件,但2.0.0版本后不支持.xlsx格式,xlwt用于创建和写入Excel文件,而xlutils主要用于复制和处理Excel文件,详细介绍了如何打开文件、获取工作表信息、操作行列数据和处理日期格式数据
    2024-10-10
  • 手动安装python3.6的操作过程详解

    手动安装python3.6的操作过程详解

    这篇文章主要介绍了如何手动安装python3.6,本文给大家带来了安装步骤,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Python中decorator使用实例

    Python中decorator使用实例

    这篇文章主要介绍了Python中decorator使用实例,本文讲解了如何调用decorator、decorator函数的定义、decorator的应用场景等内容,需要的朋友可以参考下
    2015-04-04
  • Python使用xlrd轻松读取Excel文件的示例代码

    Python使用xlrd轻松读取Excel文件的示例代码

    本文主要介绍了使用 Python 的 xlrd 库读取 Excel 文件的方法,包括安装、各种操作如工作表操作、单元格操作、行与列操作、处理不同数据类型、性能优化、结合其他库、自定义处理等,还提到了一些特殊情况的处理及自定义类封装读取逻辑,需要的朋友可以参考下
    2024-11-11
  • 安装好Pycharm后如何配置Python解释器简易教程

    安装好Pycharm后如何配置Python解释器简易教程

    这篇文章主要介绍了安装好Pycharm后如何配置Python解释器简易教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • python 5个顶级异步框架推荐

    python 5个顶级异步框架推荐

    这篇文章主要介绍了python5个顶级的异步框架,帮助大家更好的利用python进行web开发,感兴趣的朋友可以了解下
    2020-09-09
  • Pandas数据清洗与过滤空值技巧

    Pandas数据清洗与过滤空值技巧

    在数据分析过程中,使用pandas库进行数据清洗和过滤空值是基本而重要的步骤,首先,导入pandas库并加载数据,其次,利用isnull()或isna()方法检查数据中的空值,接着,可以使用dropna()方法过滤掉含有空值的行,或针对特定列过滤空值
    2024-09-09
  • Python 装饰器原理、定义与用法详解

    Python 装饰器原理、定义与用法详解

    这篇文章主要介绍了Python 装饰器原理、定义与用法,结合实例形式分析了Python装饰器的概念、定义、实现方法、应用场景及相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • Python中使用partial改变方法默认参数实例

    Python中使用partial改变方法默认参数实例

    这篇文章主要介绍了Python中使用partial改变方法默认参数实例,本文直接给出使用实例,代码中包含详细注释,需要的朋友可以参考下
    2015-04-04

最新评论