初识爬虫 - 腾讯招聘

本文介绍了如何使用Python爬虫从腾讯招聘网站抓取岗位名称、分类、职责和要求。通过分析网页结构,找到Ajax请求中的JSON数据,提取所需信息,并最终将数据保存为TXT文件。
摘要由CSDN通过智能技术生成

对于腾讯招聘这样的一个界面:

以及点进去对岗位的进一步介绍:

我们需要爬取的是内容是每个岗位的名称、岗位分类、工作职责及工作要求,大约爬取一百个吧,将爬取到的数据保存到 txt 文件中。下面是正文:

首先看爬取的要求及网页界面我们知道,单靠表面那个网页不行,没有 “工作要求” 数据,而 “工作要求” 这一项的数据在深一层的网页中,或者说深一层的网页中已经包含了全部所要爬取的内容,但很显然,深一层的网页是跟表面那个网页有联系的,所以需要我们找到两者之间的关系;另外在外层网页中,我们需要爬取到一百个岗位,也就是十页,那么还要找到页数之间又是怎么样的联系。

ok,简述一下就是:我们需要爬取十页,也就是一百个岗位的信息,而每个岗位的信息需要在其对应的网页中获取,所以要找到外层及内层网页间的联系,最后保存成 txt 文件。网页链接:腾讯招聘 。

我们对于一个网页,如果爬取数据的话一般会先想到去审查元素,然后使用 xpath 去定位到目标结点,而这个,我们也能使用这个方法找到目标内容:

 

显然目标内容都找到了,如果用 xpath 方法也就能都爬取下来,但问题是,前面说到二者网页之间是有联系的,这个联系不难发现:

我们每点一个岗位去查看岗位详情的时候,岗位详情的网址中唯一变化的就是 postId ,如果我们能够找到外层网页中存放的 postId 信息,那我们就能把两者联系起来。在前面审查网页元素后,发现网页元素中是不包含 postId 这一项的,因为我们在网页的表面都没有看到 postId 任何信息,所以审查元素后也不会有什么发现,二者是相对应的。这说明我们可能找的地方不对,那么下面我们去找一下 Ajax 请求中有没有我们想要的内容,招聘网页一般来说是需要时不时更新的,所以数据放到 Ajax 中也很有可能:

在这里我们发现 XHR 下就只有两个文件,我们都看一下,第一个显然不对,response 中的信息跟左边网页我们想要的内容就没联系,接下来看第二个:

这里面的内容和左边是相对应着,况且里面还记录着 postId 的信息,这次看来就是找对了,另外这些信息的保存是以 json 格式保存的,读取的时候也会更加方便。在此之外,还有一个新收获,看下 Header :

这出现了跟页码有可能联系的地方,至于是不是,我们验证下。复制该链接,在新窗口打开:

这不就是刚才我们查看的 response 中的信息嘛,那如果我们把那个 pageIndex 的值改为2,出现的是第二页的数据的话,就说明这个 URL 就是我们真正有用的那个。经改过后的验证,确实是正确的页码,那到此我们对网页的分析就算完成了,页码之间的联系找到了,岗位及岗位详情两个网页的联系也找到了,下面开始写代码:

先拿到十页的岗位信息:

import  requests

# url = 'https://careers.tencent.com/search.html?keyword=python'

# 一百个岗位/十页的岗位数据
for i in range(1,11):       # i 表示页码,用于 url 中
    url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1592002112026&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex={}&pageSize=10&language=zh-cn&area=cn'.format(i)
    response = requests.get(url=url)
    # print(response.text)

    pass

经输出后确认信息无误,但为了看着比较方便,我们可以将数据保存成 json 文件,然后再转码一下(Ctrl + Alt + L ):

    with open('腾讯招聘.json','a',encoding='utf-8') as fp:   #由于是在循环中,所以保存文件数据是用 a ,表示向文件中追加数据
        fp.write(response)

然后转码后的 json 文件如下:

是不是看起来方便很多,这就是 json 格式数据的好处,很方便查看和读取。那么下面就是该提取数据了,前面我们分析到,外层岗位网页中有工作职称,分类以及工作职责,但没有工作要求,工作要求在岗位详情网页里面,而岗位详情里面是全包含了工作职称,分类,职业及工作要求这些的,也就是说工作职称,分类及职责这三类信息,既可以用外层(岗位)网页的信息,也可以用深层(岗位详情)网页的信息,两者是一样的,我这里是先用的岗位,然后工作要求另用的岗位详情。

先获取下每个岗位的 名称,分类及职责 ,顺便可以再记录下岗位的 ID:

    content = response.json()       #先转换一下数据格式
    data_list = content['Data']

    for item in data_list['Posts']:     #读取每页中的岗位信息,一个 item 表示一个岗位信息
        # 岗位名称
        title = item['RecruitPostName']

        # 岗位分类
        BGName = item['BGName']

        # 工作职责
        Responsibility = item['Responsibility']

        # 岗位详情 ID
        id = item['RecruitPostId']

对于岗位详情网页,我们也用它的 Ajax 请求数据:

注意:这里看的是第一个文件,其他的处理和前面一样,就不再说了,直接用:

        # 将上面获取的 id 传入新的 url 参数中
        NewURL = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1592017994519&postId={}&language=zh-cn'.format(id)
        NewResponse = requests.get(url=NewURL)

        NewContent = NewResponse.json()
        NewDatas = NewContent['Data']

        # 工作要求
        Requirement = NewDatas['Requirement']

        Info = "岗位名称: " + title + "岗位分类: " + BGName + "工作职责: " + Responsibility + "工作要求: " + Requirement + '\n\n'
        print(Info)

 

关于岗位详情的数据,就别保存成 json 文件看了,因为太多了,可以直接复制链接在网页中看,只需要关注一下那个工作要求的就行。到现在内容都已经获取完成了,最后保存成 txt 文件就行,注意还是要用追加的形式,下面是完整代码:

import  requests

# url = 'https://careers.tencent.com/search.html?keyword=python'

# 一百个岗位/十页的岗位数据
for i in range(1,11):       # i 表示页码,用于 url 中
    url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1592002112026&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex={}&pageSize=10&language=zh-cn&area=cn'.format(i)
    response = requests.get(url=url)
    # print(response.text)

    # with open('腾讯招聘.json','a',encoding='utf-8') as fp:   #由于是在循环中,所以保存文件数据是用 a ,表示向文件中追加数据
    #     fp.write(response)

    content = response.json()       #先转换一下数据格式
    data_list = content['Data']

    for item in data_list['Posts']:     #读取每页中的岗位信息,一个 item 表示一个岗位信息
        # 岗位名称
        title = item['RecruitPostName']

        # 岗位分类
        BGName = item['BGName']

        # 工作职责
        Responsibility = item['Responsibility']

        # 岗位详情 ID
        id = item['RecruitPostId']

        # 将上面获取的 id 传入新的 url 参数中
        NewURL = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=1592017994519&postId={}&language=zh-cn'.format(id)
        NewResponse = requests.get(url=NewURL)

        NewContent = NewResponse.json()
        NewDatas = NewContent['Data']

        # 工作要求
        Requirement = NewDatas['Requirement']

        Info = "岗位名称: " + title + '\n'+ "岗位分类: " + BGName +'\n'+ "工作职责: " + Responsibility +'\n'+ "工作要求: " + Requirement + '\n\n'
        print(Info)

        with open('腾讯招聘.txt','a',encoding='utf-8') as fp:
            fp.write(Info)

        pass

    pass

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值