实战:手刃豆瓣电影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循环,有意向的可以思考一下 后续我会补充这个实战
相关推荐
Marst Code11 分钟前
上位机开发日记 · 第 2 篇 · 架构先行:六层分层与边界
python
李日华大战鸡红1 小时前
FOC状态空间方程模型推导(学习记录)
python·学习·线性代数
外收内放3 小时前
Python基础语法练习题(57-58)
开发语言·python
朝朝辞暮i3 小时前
VLA 系统学习第 3 课:从一次机器人示范,到真正送进神经网络的 Batch
人工智能·python·深度学习·神经网络·vla
小鹿的周先生4 小时前
第11章-Structured-Output
开发语言·人工智能·python
梦在远山后4 小时前
通过 WSS 让 Server 安全调用 Desktop 本地工具(下01):Ticket、人工确认、幂等与断线对账
python·langchain·agent
泡海椒4 小时前
JQuick-Excel 实战:FORMAT 管理日期与数字的 Excel 显示
开发语言·python·excel
学掌门5 小时前
老司机带你十分钟入门Python!
开发语言·python
YEGE学AI算法6 小时前
Python实现Log-Mel Fbank:分帧、加窗、FFT与Mel滤波器组
python·语音识别·fbank·log-mel·音频特征
甜到心里的蛋糕6 小时前
Playwright 无头浏览器自动发布 CSDN 图文草稿的实践(持久化 profile + 图床直传)
运维·python·playwright·爬虫自动化·博客运营