背景介绍分析:
1.选手信息通过 Ajax 请求加载,不在 html 中,因此需要找到获取选手的接口。
2.该接口是一个 post 请求,需要携带参数发起请求。携带的参数包括了活动 id ,页数,每页加载选手数量,分组 id
3. 用户是可以点击选手的封面图跳转到选手详情页,选手详情页是选手的视频介绍。( iframe 中就是选手的视频)
4.因此要获取选手视频介绍,就需要拿到这个选手详情页的接口
5.选手详情页是一个 post 请求,携带了选手 id 和活动 id
6.heeaders 中对我们的请求头做了一些要求,比如活动id ,把必要的信息在请求的时候带上,不然会被反爬报错
开始写了:(为了保护该网站,网址等信息此处没写)
def jiandian():
headers = {
'activityid': '151882',
'cookie':'',
'User-Agent': '',
'origin': '',
'prefix': '',
'referer': ''
}
# 投票页链接
vote_url = " "
# 选手详情页地址
detail_url = ' '
# 投票页 post 请求需要携带的参数
vote_data = {
"ActivityId": 151882, "GroupId": 0, "PageIndex": 1, "PageSize": 30, "SearchKey": ""
}
# 发起请求
response = requests.post(url=vote_url,json=vote_data,headers=headers)
content = response.text
# 将获取内容转为字典
contenttodicy = json.loads(content)
# 得到选手列表
playerList = contenttodicy['Data']['List']
# 选手详情页的 headers
detail_headers = {
'activityid': '151882',
'cookie': '',
'User-Agent': ',
'prefix': '',
'referer':''
}
for player in playerList:
# 从选手字典中取出选手 id
playerId = player["Id"]
# 详情页 post 请求需要携带的参数
detail_data = {
"ActivityId": 151882, "Id": playerId
}
# 选手详情页发起请求
detail_response = requests.post(url=detail_url,json=detail_data,headers=detail_headers)
detail_content = detail_response.text
# 得到选手详情个人信息字典
detail_dict = json.loads(detail_content)
deal_player = detail_dict["Data"]
keys = ['Name','Intro','Cover','Detail']
# 取出选手名字、简介、封面、视频 保存到一个列表
# play_info = [deal_player.get(key) for key in keys]
# 取出选手名字、简介、封面、视频 保存到一个字典
play_info = dict([(key,deal_player[key]) for key in keys])
with open('player.json', 'a', encoding='utf-8') as fp:
fp.write(str(play_info)+',')
得到的结果如下:
本次没有对数据进行再次处理,例如需要在每个封面前加上地址,得到的视频需要把 iframe 给截取出来才能使用,最后使用 pandas 把数据写入表格。
感悟:得到数据是比较容易的,数据清理是最麻烦的