实战:手刃豆瓣电影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循环,有意向的可以思考一下 后续我会补充这个实战
相关推荐
2301_814809861 小时前
如何用 cookie 的 HttpOnly 与 Secure 属性防范 XSS 攻击
jvm·数据库·python
m0_515098421 小时前
如何用 Object.keys 与 getOwnPropertyNames 遍历键名
jvm·数据库·python
databook1 小时前
如何让多个动画“齐步走”?
python·数学·动效
qq_189807032 小时前
golang如何实现日志按级别过滤_golang日志按级别过滤实现教程
jvm·数据库·python
abc123456sdggfd2 小时前
Golang map底层实现原理_Golang map哈希表原理教程【经典】
jvm·数据库·python
yaoxin5211232 小时前
391. Java 文件操作基础 - 方法链式调用
java·开发语言·python
justjinji2 小时前
JavaScript中利用宏任务拆分阻塞任务的实操案例
jvm·数据库·python
weixin_408717772 小时前
c++如何实现跨平台的文件读写进度监听器回调机制【实战】
jvm·数据库·python
一铭111992 小时前
gpt-claude-gemini 超级大模型安装使用教程
java·python·gpt·ai编程·claude·gemini