爬取在行平台数据(1)——动态加载页面分析

谈及动态加载页面,最先想到的一种情形是这样的——“加载更多”:
在这里插入图片描述
面对这种动态加载的页面,要想获得更多的数据,往往需要借助开发者工具进行辅助分析。回归正题,本文依次介绍爬取对象、分析爬取内容。

爬取对象——在行

在行这个平台很多人可能不太熟悉,但是近些年知识付费的井喷式发展很多人应该深有体会,国内从最早的知乎平台,到前些年昙花一现的芬达、得到,每一款产品的运营都是一次新模式的尝试。

与上述专注线上问答模式的平台不同,在行主打的是线下约见的模式——即用户可以在网站上寻找“合自己口味”的行家并向其发出线下见面的邀约,相较于线上问答平台,在行的运营显然更加困难,不过独树一帜的模式也为知识付费带来了更多的可能。

对在行的简单介绍就是这样,下面进入正题。

1.首先浏览一下网站,确定要获取哪些数据。

URL:https://www.zaih.com/falcon/

打开URL,进入网站首页,如下:
在这里插入图片描述
可以看到,平台对行家的分类主要为职场发展、行业经验、互联网+、心理等九个大类;若将鼠标悬停至各个大类element时,每个大类下又分为多个小类别,如下图:
在这里插入图片描述
(分得太细了,我们还是依据大类分析行家数据吧),以职场发展为例,点击进入:
在这里插入图片描述
每页有15名行家的简单信息(包括姓名、所在城市、职业、热门话题、约聊价格和已约见人数),点击各个行家后可以进入其主页,上面有更详细的数据,我们选择第二位叫葛嵩的行家,打开其主页:
在这里插入图片描述
主页内容丰富,除了之前页面上出现的简单信息,还有当前行家的约见情况(评分、响应率)、行家自述、用户评价数据等。

2.如何获取所需数据?

那么,为了批量获取每位行家的各项详细数据,我们需要进入每位行家的主页,因此需要获得行家的URL。如何获得呢?我们首先想到,由于我们是从职场发展页跳转到各个行家主页,所以有可能职场发展页上使用了标签<a>设置了链接的各个属性,我们或许能够找到<a>的属性href,直接获取URL;或者细心的朋友应该已经发现,每一位行家都对应着一个ID,这是构造行家主页URL的核心,如葛嵩的ID就为2bi9xi1yzxl,如果能找到行家ID,我们也能够自行构造URL。为了验证想法,回到职场发展页,打开开发者工具F12

我们从Elements中找到行家葛嵩,如下图:
在这里插入图片描述
可以发现,在对应的<section>下,并没有我们所需要的element,看来不能那么轻松地解决这个问题。

不过,既然页面能够实现跳转,那么会有两种情况(第一,行家的URL被页面动态加载出来;第二,页面动态加载行家ID,js文件再利用ID生成URL)。因此,我们可以打开Network筛选Xhr,查找页面动态加载的内容,如下图:
在这里插入图片描述
我们选中当前页面加载出来的文件,在Preview中发现了我们需要的内容——被命名为uid的数据(即为我们需要的行家ID)。

那么我们尝试获取一下当前页面所有行家的ID。在加载文件的Headers中,可以得到Request URL和Method。如下图:
在这里插入图片描述
利用该URL模拟向服务器发出请求,得到Response文件。该文件是json格式的,所以需要.json()方法转换。代码如下:

import requests


def get_mentor_uid(page_url):
    mentor_uid = set()
    html = requests.get(page_url).json()
    hj_num = len(html)
    for i in range(hj_num):
        get_uid = html[i]['uid']
        mentor_uid.add(get_uid)

    return mentor_uid

换一页试一试,打开第二页,如下图:
在这里插入图片描述
页面同样加载出来了15个行家的信息。职业发展下共有173页的行家数据,为了获取所有行家的ID,我们需要构造173个Request URL。这个很容易,随意打开几个新的页面可以发现每页Request URL的格式,如下:

# 第1页:https://www.zaih.com/falcon/mentor_api/v1/tags/397/mentors?page=1&sort=&per_page=15
# 第2页:https://www.zaih.com/falcon/mentor_api/v1/tags/397/mentors?page=2&sort=&per_page=15
# 第173页:https://www.zaih.com/falcon/mentor_api/v1/tags/397/mentors?page=173&sort=&per_page=15

仅仅是page值的变化,因此,可以容易地构造Request URL,代码如下:

def const_page_url():
    # 以职场发展部分为例,共173页
    url_list = []
    url_part_1 = r'https://www.zaih.com/falcon/mentor_api/v1/tags/397/mentors?page='
    url_part_2 = r'&sort=&per_page=15'
    for i in range(173):
        joint = url_part_1 + str(i+1) + url_part_2
        url_list.append(joint)

    return url_list

3.完整的代码

打开一个文本存储所有行家的ID,这对进一步获取行家详细数据很重要。

import requests


def get_mentor_uid(page_url):
    mentor_uid = set()
    html = requests.get(page_url).json()
    hj_num = len(html)
    for i in range(hj_num):
        get_uid = html[i]['uid']
        mentor_uid.add(get_uid)

    return mentor_uid


def const_page_url():
    # 以职场发展部分为例,共173页
    url_list = []
    url_part_1 = r'https://www.zaih.com/falcon/mentor_api/v1/tags/397/mentors?page='
    url_part_2 = r'&sort=&per_page=15'
    for i in range(173):
        joint = url_part_1 + str(i+1) + url_part_2
        url_list.append(joint)

    return url_list


if __name__ == '__main__':
    url = const_page_url()
    hj_uid = set()
    for item in url:
        uid = get_mentor_uid(item)
        hj_uid = hj_uid.union(uid)

    # 准备一个文本记录所有的uid
    f = open(r'/data/mentor_uid_397.txt', 'w', encoding='utf-8')
    for item in hj_uid:
        # print(item)
        f.write(item)
        f.write('\n')
    f.close()

运行之后,可以打开文件看一下。
在这里插入图片描述
这样就得到了所有行家的ID,初步工作的演示(以职业发展为例)姑且就这样完成了。后面会更新爬取行家主页的内容。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值