我是怎么抓取逆水寒大宋佳人漂亮的小姐姐的呢?70行代码解决问题

该博客介绍了如何使用Python进行网络爬虫,以获取网易大宋佳人活动的美颜和魔音赛道参赛者信息。通过分析请求URL,确定关键参数并构造请求,利用requests库获取数据,再用pandas处理和存储结果。最终将数据保存到Excel文件中,分别对应两个赛道的参赛者列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一年一度的大宋佳人活动又开始了,小姐姐们又开始了踊跃的报名,都有哪些漂亮的小姐姐呢?不放我们来爬一下看看

  • 注:本文仅用于python爬虫学习,请勿滥用数据,严禁侵犯个人隐私

基础分析

大宋佳人活动主页面:https://n.163.com/2021/dasongjiaren4/#/list

  • 打开页面向下翻,有三个赛道,美颜赛道,魔音赛道,萌宠赛道;今天我们主要来分析美颜和魔音赛道。萌宠赛道因为是今年新增加的,界面与美颜魔音不同,暂不分析。具体如下图所示【为保护隐私,图片适当打码】
    大宋佳人首页

  • 按下F12,切换到Network,刷新网页然后开始分析,很容易可以判断真正的数据请求链接为:https://nshssl.hi.163.com/file_mg/public/nsh/dasongjiaren202104/list/hot?callback=jQuery111305466870739796736_1619712866351&channel=1&page=1&_=1619712866355

  • 根据既往经验,以及返回的数据内容发现jQuery111305466870739796736_1619712866351的一大堆对我们的数据抓取其实是没用的,因此这部分参数去掉后,返回的数据就是json格式了,并且更容易处理

  • channel 是赛道信息,1是美颜,2是魔音,注意3不是萌宠,萌宠是新的界面,后续有时间再去分析

  • page明显是一个页码

  • 最后一个参数 _=1619712866355,这个明显是一个时间戳的毫秒形式

  • 我们暂时去除jquery那个参数后看一下数据返回信息;这是一个unicode编码
    原始返回

  • 我们继续解码后,结果为:
    解码信息
    这是一个标准的json数据,是我们想要的结果,更换参数page=2,就是第二页的信息,没有问题

  • 因此,我们已经拿到的核心的请求部分;同理修改channel,发现数据确实是是魔音赛道的,接下来开始写代码

代码模块确定

  • 使用requests库,从网页获取原始数据
  • 使用pandas转换并且依次合并后续数据
  • 考虑到为了方便的进入对于角色的详情界面,我在结果那里增加了一个参数 href,基本组成部分为 https://n.163.com/2021/dasongjiaren4/#/detail/ + id
  • 最后保存在Excel或者数据库中,本次演示保存在一个Excel文件中的两个表

准备工作

pip install requests
pip install pandas

代码编写

  • 代码还有很多优化的空间,如果要学习的话,请自行探索,可以与我私信交流
# !usr/bin/env python
# -*-coding:utf-8 -*-
import requests
import pandas
import time


class DaSongJiaRen:
    def __init__(self):
        self.url = 'https://nshssl.hi.163.com/file_mg/public/nsh/dasongjiaren202104/list/hot'
        self.head = []
        self.pages = 0
        self.data_meiyan = pandas.DataFrame()
        self.data_moyin = pandas.DataFrame()

    def get_html(self, channel, page):
        """
        获取源码
        :param channel: 频道信息,1为美颜赛道,2为魔音赛道
        :param page: 第几页
        :return:
        """
        # 最后这个时间戳可以不要
        url = self.url + f'?channel={channel}&page={page}&_={int(time.time()*1000)}'
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                                 'Chrome/90.0.4430.85 Safari/537.36'}
        r = requests.get(url, headers=headers)
        js = r.json()
        lis = js['data']['list']
        if not self.pages:
            self.pages = js['data']['pages']
            self.head = list(lis[0].keys()) + ['href']
        data = [list(each.values())for each in lis]
        data = [each+ [f'https://n.163.com/2021/dasongjiaren4/#/detail/{each[0]}'] for each in data]
        if channel == 1:
            if self.data_meiyan.empty:
                self.data_meiyan = pandas.DataFrame(data, columns=self.head)
            else:
                self.data_meiyan = pandas.concat([self.data_meiyan, pandas.DataFrame(data, columns=self.head)])
        else:
            if self.data_moyin.empty:
                self.data_moyin = pandas.DataFrame(data, columns=self.head)
            else:
                self.data_moyin = pandas.concat([self.data_moyin, pandas.DataFrame(data, columns=self.head)])
        print(f'完成{"美颜" if channel == 1 else "魔音"}赛道 第{page}页')

    def save_data(self):
        wr = pandas.io.excel.ExcelWriter('大宋佳人数据.xlsx')
        self.data_meiyan.to_excel(wr, index=False, sheet_name='美颜赛道')
        self.data_moyin.to_excel(wr, index=False, sheet_name='魔音赛道')
        wr.save()
        print('数据已保存')

    def main(self):
        page = 1
        while page == 1 or (self.pages and page <= self.pages):
            self.get_html(channel=1, page=page)
            page += 1
        print('美颜赛道信息获取完毕')
        page = 1
        self.pages = 0
        self.head = []
        while page == 1 or (self.pages and page <= self.pages):
            self.get_html(channel=2, page=page)
            page += 1
        print('魔音赛道信息获取完毕')
        self.save_data()


if __name__ == '__main__':
    dsjr = DaSongJiaRen()
    dsjr.main()

运行过程展示

代码运行输出

结果展示

Excel文件内容
结果展示

后记

本次数据爬取仅为了练习Python网抓,请勿将数据用于非法途径,请勿侵犯个人隐私信息。数据来自网易雷火,抓取的时候,适当考虑一下延时,避免对服务器造成影响

备注

如有其他疑问,请私信我。觉得写的不错的话,来个一键三连,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方_流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值