实战:手刃豆瓣电影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循环,有意向的可以思考一下 后续我会补充这个实战
相关推荐
kexnjdcncnxjs7 小时前
如何在Navicat中创建基础数据表_可视化图形界面操作指南
jvm·数据库·python
m0_740796367 小时前
CSS如何兼容新旧方案结合响应式容器查询
jvm·数据库·python
zmsofts7 小时前
Maven核心能力深度解析:从项目管理到扩展机制
java·python·maven
qq_452396238 小时前
第十四篇:《JMeter插件扩展:自定义函数与第三方插件》
开发语言·python·jmeter
m0_702036538 小时前
mysql如何导出特定条件的查询数据_使用mysqldump加where参数
jvm·数据库·python
m0_733565469 小时前
bootstrap怎么实现响应式的文章瀑布流布局
jvm·数据库·python
m0_463672209 小时前
Golang如何用火焰图分析性能_Golang火焰图教程【对比】
jvm·数据库·python
knight_9___9 小时前
大模型project面试4
人工智能·python·深度学习·算法·面试·agent
m0_591364739 小时前
Go语言怎么做链路追踪_Go语言分布式链路追踪教程【精选】
jvm·数据库·python
m0_463672209 小时前
HTML函数工具是否支持雷蛇等游戏外设_RGB同步汇总【汇总】
jvm·数据库·python