【python爬虫实战】用python爬取爱奇艺电视剧十大榜单的全部数据!

目录
  • 一、爬取目标
  • 二、讲解代码
  • 三、查看结果
  • 四、视频演示
  • 五、附完整源码

一、爬取目标

本次爬取的目标是,爱奇艺电视剧类目下的10个榜单:电视剧风云榜-爱奇艺风云榜
爱奇艺页面

可以看到,这10个榜单包含了:
热播榜、飙升榜、必看榜、古装榜、言情榜、都市榜、搞笑榜、年代榜、悬疑榜、奇幻榜。

我们以热播榜为例,打开Chrome浏览器,按F12进入开发者模式,选择网络 -> XHR这个选项,重新刷新一下页面,并且逐次下拉页面到最底部,展现出全部100部电视剧:
开发者模式

查看捕获到的请求链接地址,每翻一次页,出现一条链接地址,并且该地址的响应数据就是20条电视剧的数据。
所以,这个地址就是我们要请求的地址了。

二、讲解代码

首先,导入需要用到的爬虫库:

import requests  # 发送请求
import pandas as pd  # 存入excel文件
from time import sleep  # 随机等待,防止反爬
import random  # 设置随机

从请求地址的Request Header处,拷贝过来一个请求头,放到代码里:

headers = {
	"accept": "application/json, text/plain, */*",
	"accept-encoding": "gzip, deflate, br",
	"accept-language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
	"origin": "https://www.iqiyi.com",
	"referer": "https://www.iqiyi.com/",
	"sec-ch-ua": "" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"",
	"sec-ch-ua-mobile": "?1",
	"sec-ch-ua-platform": ""Android"",
	"sec-fetch-dest": "empty",
	"sec-fetch-mode": "cors",
	"sec-fetch-site": "same-site",
	"user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Mobile Safari/537.36"
}

爱奇艺的这个榜单页面,反爬不那么厉害,请求头中连cookie都不用加!
由于我想自动爬取这10个榜单,每个榜单对应一个tag标签,从哪里获取呢?经过分析,是从另外一个请求地址返回的:
开发者模式2
发现了吗?每个榜单名称是一个tagName,对应一个tagId。拿到tagId,带入到榜单数据的请求地址中:

for page in range(1, 5):
	url = "https://pcw-api.iqiyi.com/strategy/pcw/data/topRanksData?page_st={}&tag={}&category_id=2&date=&pg_num={}".format(v_tag_id, v_tag_id, page)
	r = requests.get(url, headers=headers)

这样,就完成了向页面发送请求的过程。

顺便说一下这个for循环,一共翻4页,每页25条数据,对应一共100部电视剧。

用json格式接收返回的数据:

json_data = r.json()

然后开始解析json数据:

content_list = json_data["data"]["formatData"]["data"]["content"]
for content in content_list:
	# 排名
	order_list.append(order)
	# 标题
	title_list.append(content["title"])
	print(order, " ", content["title"])
	# 描述
	try:
		desc_list.append(content["desc"])
	except:
		desc_list.append("")
	# 标签
	tags_list.append(content["tags"])
	tag_info = content["tags"].split(" / ")
	# 上映年份
	year = tag_info[0]
	year_list.append(year)
	# 主演
	actor = tag_info[-1]
	actor_list.append(actor)
	# 弹幕
	try:
		danmu_list.append(content["danmu"].replace("条弹幕", ""))
	except:
		danmu_list.append("")
	# 霸榜
	try:
		babang_list.append(content["babang"])
	except:
		babang_list.append("")
	# 实时热度
	if v_tag_name == "飙升榜":
		index_list.append(content["index"] + "%")
	else:
		index_list.append(content["index"])
	order += 1

最后,依然采用我最顺手的方法,拼装成DataFrame的格式,保存到excel文件:

df = pd.DataFrame({
		"排名": order_list,
		"标题": title_list,
		"描述": desc_list,
		"标签": tags_list,
		"上映年份": year_list,
		"主演": actor_list,
		"弹幕": danmu_list,
		"霸榜": babang_list,
		"实时热度": index_list,
	})
if v_tag_name == "飙升榜":  # 如果是飙升榜,把excel标题中的"实时热度"改为"飙升幅度"
	df.rename(columns={"实时热度": "飙升幅度"}, inplace=True)
df.to_excel("爱奇艺电视剧_{}.xlsx".format(v_tag_name), index=False)

这里,需要注意一个小逻辑,飙升榜的"实时热度"需要rename为"飙升幅度",因为飙升榜跟其他榜单不一样!
飙升榜页面

三、查看结果

共爬取到10个榜单文件:
结果文件

随便打开一个文件,比如,热播榜:
热播榜

比如,都市榜:
都市榜

除了搞笑榜有40+条数据,其他榜单都是100条数据,对应100部电视剧。

四、视频演示

代码演示视频:https://www.bilibili.com/video/BV1fT4y1e7wd/

五、附完整源码

完整源码:【python爬虫实战】用python爬取《爱奇艺风云榜》电视剧十大榜单!2023.6发布


我是 @马哥python说 ,持续分享python源码干货中!

原文地址:https://www.cnblogs.com/mashukui/p/17465049.html