实战:手刃豆瓣电影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循环,有意向的可以思考一下 后续我会补充这个实战
相关推荐
满怀冰雪6 小时前
06-自动微分入门:用 Paddle 计算梯度
人工智能·python·深度学习·paddle
xlrqx12 小时前
家电清洗培训课程类别、培训方式及费用情况究竟有哪些
大数据·python
lbb 小魔仙12 小时前
VS Code Python 高级调试技巧:从入门到精通
开发语言·python
lzqrzpt13 小时前
LED驱动电源行业品牌格局与技术差异深度总结
python·单片机·嵌入式硬件
李可以量化13 小时前
PTrade 策略入门:before_trading_start 函数详解(上)—— 盘前准备逻辑全指南
python
大海变好AI13 小时前
AIGC分层推理落地能否串联多工具完成自动化闭环
人工智能·python·自动化·aigc
二宝哥14 小时前
14.Python模块与包完全指南:从定义到实战
python
三声三视14 小时前
交互式用够了?用 Agent SDK 把 Claude 塞进 Python Web 服务
人工智能·python·ai·aigc·ai编程
zhanghaha131414 小时前
Python语言基础:4_数据类型转换
java·前端·python
larance15 小时前
机器学习特征预处理之标准化/归一化
开发语言·python·机器学习