Python 爬虫基础 爬取豆瓣电影Top榜(最新 超详细)
网址: 豆瓣电影 Top 250
本案列所使用的模块:
- requests
- parsel pip install parsel
- csv 保存数据
工具:
爬虫工具库-spidertools.cn
爬取步骤:
一.请求数据 模拟浏览器向服务器发送请求
打开网站 打开开发者工具 F12 or 右击
Ctrl+F 打开搜索 搜索我们需要的数据接口
老样子 复制curl 打开我们的工具 转换成py请求代码 记住一定是bash
二. 获取服务器返回的数据
在本地新建py文件 运行后可以测试检查我们想要的数据 是否成功请求到
在控制台点击Ctral+f 搜索需要爬取的内容 发现有
三. 解析数据 提取我们想要的数据
本次我们采用新的模块进行数据的提取 parsel 采用里面的CSS 选择器
Explain:css 选择器 主要根据标签属性内容提取数据
导包 import parsel
初始化selector 对象 将网页响应文本转换为可解析的对象
selector = parsel.Selector(resp.text)
接着我们分析 静态页面数据
如上面的箭头所示 我们可以发现 每一条电影数据都是包含在 li 标签中的 而所有的li标签 在div框中 因此我们可以获取到包含所有数据的根标签 后续通过for 循坏进行遍历 提取其中的内容
# 获取所有li标签 返回数据列表 列表里面的每一个元素都是selector对象
# 通过CSS选择器去提取数据 和css语法一样 可以.css 也可以.xpath 但xpath可以用正则就不在这里赘述了
# '.类名属性' '# id属性'
lis = selector.css('.grid_view li')
继续分析提取电影名字等信息
电影名字: 类名为hd下面的span 标签 第一个为电影名称
类似地像这样分析提取数据
# 接着for 循坏提取数据
for i in lis:
title = i.css('.hd span.title:nth-child(1)::text').getall()
# 提取主演 演员的信息
movie_info_list = i.css('.bd p:nth-child(1)::text').getall()
# 根据控制台的输出结果 对我们的代码做一个调整
# 把列表取出 通过strip方法 去除所有的空格 接着以 空格分隔数据
actor_list = movie_info_list[0].strip().split('NBSPNBSPNBSP')
# 将主演和导演分开取值 分别赋值 取个变量
# 用字符串替换 将不想要的字符替换 弄成我们想要的数据 只要导演 主演的名字 其它一律不要
actor1 = actor_list[0].replace('导演:', '').replace('/...', '').replace('主演:', '').split(' ')
# 通过后续的运行我们可以发现 有的只有导演没有主演的情况 这时候我们可以 做个if判断语句
# 当提取出来的导演信息的长度为2时 正常取值 只有一个就赋值相同
if len(actor1) == 2:
actor2 = actor1[0]
actor3 = actor1[1]
else:
actor2 = actor1[0]
actor3=actor2
# 进一步处理数据
movie_info = movie_info_list[1].strip().split('NBSP/NBSP')
# 电影年份
movie_year = movie_info[0].split('/')[0]
# 电影国家
movie_country = movie_info[0].split('/')[1]
# 电影类型
movie_type = movie_info[0].split('/')[2]
# 电影简介
introduce = i.css('.quote .inq::text').getall()
# 电影评论
judge = i.css(' .rating_num::text').getall()
# 评价人数
people = i.css('.star span:nth-child(4)::text').getall()
具体的每个信息的提取我就不多讲述了 大家可以自己去琢磨分析
四.保存数据 保存数据到本地
我们可以通过字典类型进行数据的保存
dit = {
'标题': title[0],
'导演': actor2,
'演员': actor3,
'电影年份': movie_year,
'国家': movie_country,
'电影类型': movie_type,
'电影简介': introduce,
'电影评分': judge[0],
'评论人数': people[0],
}
导入Csv 模块
1.打开或创建CSV文件:使用 open 函数以追加模式 (a) 和 UTF-8 编码 (utf-8-sig) 打开或创建 一个豆瓣Top250.csv 文件
2.创建DictWriter对象:使用 csv.DictWriter 创建一个字典写入器对象,指定字段名称列表。
3.写入表头:调用 writeheader 方法将字段名称作为表头写入CSV文件。
4.后续 将dit 字典数据写入文件
f = open('豆瓣Top250.csv', mode='a', encoding='utf-8-sig', newline='')
#newline换行的意思
csv_writer = csv.DictWriter(f, fieldnames=[
'标题',
'导演',
'演员',
'电影年份',
'国家',
'电影类型',
'电影简介',
'电影评分',
'评论人数',
])
csv_writer.writeheader()
对此数据的采集就结束啦 至于多页的数据采集 我们可以分析它每一页的参数变化
以下分别是第二页和第三页以及最后一页的url地址
可以发现 每多一页 多25 可以for循坏 步长就是25
以下是全部的代码 可以供大家交流学习使用 本次的案列分析就到这里 感谢大家的观看
import requests
import parsel
import csv
f = open('豆瓣Top250.csv', mode='a', encoding='utf-8-sig', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'标题',
'导演',
'演员',
'电影年份',
'国家',
'电影类型',
'电影简介',
'电影评分',
'评论人数',
])
csv_writer.writeheader()
num=0
for i in range(0,250,25):
print(f'正在爬取第{num}页数据')
num += 1
url = f'https://movie.douban.com/top250?start={i}&filter='
headers = {
'user-agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
}
resp = requests.get(url, headers=headers)
selector = parsel.Selector(resp.text)
lis = selector.css('.grid_view li') # 获取所有li标签 返回数据列表 列表里面的每一个元素都是selector对象
for i in lis:
title = i.css('.hd span.title:nth-child(1)::text').getall()
movie_info_list = i.css('.bd p:nth-child(1)::text').getall()
actor_list = movie_info_list[0].strip().split('NBSPNBSPNBSP')
actor1 = actor_list[0].replace('导演:', '').replace('/...', '').replace('主演:', '').split(' ')
if len(actor1) == 2:
actor2 = actor1[0]
actor3 = actor1[1]
else:
actor2 = actor1[0]
actor3=actor2
movie_info = movie_info_list[1].strip().split('NBSP/NBSP')
movie_year = movie_info[0].split('/')[0]
movie_country = movie_info[0].split('/')[1]
movie_type = movie_info[0].split('/')[2]
introduce = i.css('.quote .inq::text').getall()
judge = i.css(' .rating_num::text').getall()
people = i.css('.star span:nth-child(4)::text').getall()
dit = {
'标题': title[0],
'导演': actor2,
'演员': actor3,
'电影年份': movie_year,
'国家': movie_country,
'电影类型': movie_type,
'电影简介': introduce,
'电影评分': judge[0],
'评论人数': people[0],
}
csv_writer.writerow(dit)
print(title, actor1, movie_year, movie_country, movie_type, introduce, judge, people)
作者:Serendipity_Carl