实战:手刃豆瓣电影TOP250

一、服务器地址

https://movie.douban.com/top250

复制代码
我要爬取的是电影的名称,导演,哪年出版的,多少评分,多少评价

二、获取内容

需要去获取250个所有勾出来的数据 ,利用之前所了解的requests模块、re模块和正则表达式

三、前提思考

3.1地址的寻找

复制代码
我们先去看需要的数据是在页面源代码里面还是不是在页面源代码里面

通过图片中的页面源代码可知道:

requests.get().text 这种方式拿到的页面源代码一定是有我需要的数据的

接下面来我们的操作就是先去拿到源代码,再去想办法去提取所需要的内容

3.2用请求的方法

复制代码
这里我们要先去知道是使用get请求还是post请求 ---- 俩种方法

(1)

如果要用这个地址栏的地址的话,则一定是get请求方法

(2)

从这个方法去查看也是用get请求方法

3.3思路

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

四、主要代码

复制代码
# CSV后缀名文件  是以逗号形式分隔的
file = open("top250.csv","w",encoding="utf-8")

# 1.拿到页面源代码
import requests

#这里我们要先去知道是使用get请求还是post请求 ---- 俩种方法
url = "https://movie.douban.com/top250"

# headrs 这个值后面的数据来自于上图中所用红色边框框出来的数据
#        ---- 注意:花括号类的格式要与之完全相同
headrs = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
}

req = requests.get(url,headers=headrs)
# 如果你打印出来的汉字不对(乱码),则需要添加下方代码
# req.encoding = 'utf-8'

# 打印出来的源代码是空行的话,这种情况一般都是缺少反爬的认证 ,也就是浏览器的验证
pageSource = req.text
print(pageSource)

# 2.1编写正则
import re
# 我们需要写的正则太长,所以我们先拿一行的数据,如 先拿<span class="title">肖申克的救赎</span>,后面的在慢慢去补充正则表达式
# 惰性匹配  .*? --- .*任意匹配,?匹配最近的那一个
# obj = re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>')
# 此时里面还有个坑没有解决   ---- .不匹配换行,而源代码中很多换行  所以我们需要让点去匹配换行
# 在正则上无法搞定,可以在python中搞定  --- re.S 可以让正则中的 . 去匹配换行符
# 需要的内容数据就用()括起来,不需要的数据就用.*?过滤掉
obj = re.compile(r'<div class="item">.*?<span class="title">(?P<name>.*?)</span>.*?'
                 r'<p>.*?导演: (?P<daoyan>.*?)&nbsp;.*?<br>(?P<year>.*?)&nbsp;.*?'
                 r'<span class="rating_num" property="v:average">(?P<score>.*?)</span>'
                 r'.*?<span>(?P<num>.*?)人评价</span>', re.S)

# 2.2提取内容
# 进行正则匹配
result = obj.finditer(pageSource)
for item in result:
    name = item.group("name")  #匹配完之后,拿结果
    daoyan = item.group("daoyan")
    year = item.group("year").strip() #去除字符串俩端的空白
    score = item.group("score")
    num = item.group("num")
    # 3.保存数据
    file.write(f"{name},{daoyan},{year},{score},{num}\n")  #\n 是用来换行

file.close()   #让文件关闭
req.close()  #将这个结果也关闭

五、查看创建的文件中的数据

六、续后想法

由top.csv文件可知我们只获取了25个数据,而网页中有250个数据

后面数据如何获取呢?

--- 页数减一乘25

复制代码
# 如何翻页提取数据
# (页数 - 1) * 25 => start
# 使用for循环,有意向的可以思考一下 后续我会补充这个实战
相关推荐
jerryinwuhan7 小时前
Python快速入门(纯净版)
python
liferecords7 小时前
第 12 讲 · Python 侧接入:火焰图定位热点与间接使用硬件加速
python·性能分析·鲲鹏·火焰图·ctypes
hhzz7 小时前
【OpenCV 入门到精通 11】机器学习应用:KNN、SVM 与 K-Means 实战
人工智能·python·深度学习·opencv
K 旺仔小馒头8 小时前
【项目】商城系统用户端测试报告
自动化测试·python·功能测试
东莞市云毅网络有限公司8 小时前
用 SQLite FTS5 给企业文档建本地全文索引:中文分词与权重调优
python·数据清洗·rag·企业知识库·文档解析
钱栈up8 小时前
health从200变000:一次差点引发双端口冲突的后端巡检复盘
python
正经教主8 小时前
【FDE系列】阶段2:Day 22:变量、数据类型、条件判断 — Python 的“记忆“和“判断“
人工智能·python·fde
打工仔折腾 AI8 小时前
Pascal Editor 本地部署实战:Bun 启动 WebGPU 3D 编辑器并解决公网访问报错
人工智能·后端·python·性能优化
m0_547486668 小时前
《Python从入门到数据分析应用》全套PPT课件2026
python·数据分析
All for pursuit.8 小时前
FastAPI+Ollama 部署本地AI大模型对话助手
python·github·aigc·ollama