python爬取拉勾网的职位信息

本文介绍了如何使用Python爬取拉勾网的Python职位信息。在分析网页时发现拉勾网使用Ajax技术加载数据,通过观察网络请求,找到含有职位信息的positionAjax对象。提取数据时注意到需要POST请求,并使用cookie维持会话。最终成功爬取前10页职位并保存为CSV文件。
摘要由CSDN通过智能技术生成

爬取的网址为
https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=
使用pycharm+anaconda
使用到的库:requests+time+json+pandas

网页分析:
当我们进入拉勾网,输入python搜索,查看源码时,发现居然没有这些职位的信息,而且翻页的时候发现网址也没有变化,这个时候就可以怀疑拉勾网使用的了Ajax技术。Ajax也叫做异步的JavaScript和XML,这不是一门语言,而是利用JavaScript在保证页面不被刷新,页面链接不改变的情况下与服务器交换数据,并更新部分网页的技术。比如我们刷微博的时候,不断往下翻可以看到内容在不断的更新,但是网址链接没有变化,这就是使用了Ajax技术。
打开网页的检查功能,点进Network,类型选择XHR,发现了一个positionAjax对象,打开它然后进入它的Response,可以发现我们要提取的职位信息就在这里面。而且翻页的时候,会多出一个positionAjax对象,将其进行对比,发现在headers的Form Data中,pn会变化,第一页时pn = 1,第二页时,pn = 2,以此类推。
在这里插入图片描述
为了让response中的信息更加的明显,可以打开https://www.json.cn/,将内容复制进去。发现我们要提取的信息在content\positionResult\result中。
在这里插入图片描述
爬取思路:
首先,访问拉勾网的首页,然后再从中寻找到Ajax的位置,将其解析成json类型,直接用索引的方式进行信息提取。这里,我构造一个for循环,通过Form Data的数据,提取了前10页的内容。

编写代码:
需要注意点是
1、这里的positionAjax对象中的访问方式为POST方式,所以requests请求时要使用POST请求;
2、使用了会话维持的函数,保证访问连续;
3、一开始我并没有使用cookie参数,但是访问没两次就报错,然后搜了一下,看到有人说刷新几次cookie里面的内容会发生改变。所以在访问Ajax前,先提取网址的cookie参数,这样就不会报错了。

import requests
import time
import json
import pandas as pd
def parse_page():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3',
        'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
        'Accept': 'application/json, text/javascript, */*; q=0.01'
    }
    url_start = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
    url_parse = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
    for x in range(1, 10):
        data = {
            ' first': 'true',
            'pn': str(x),
            'kd': 'python'
        }
        s = requests.Session()  #会话维持
        s.get(url_start, headers=headers, timeout=3)
        cookie = s.cookies
        res = requests.post(url_parse, headers=headers, cookies=cookie, data=data, timeout=3)
        time.sleep(5)
        res.encoding = res.apparent_encoding #apparent_endoding可以根据网页内容分析出编码方式,比encoding更加准确
        result = json.loads(res.text)
        info = result["content"]["positionResult"]["result"]
        for i in info:
            companyId_list.append(i['companyId'])
            postname_list.append(i['positionName'])
            workyear_list.append(i['workYear'])
            companysize_list.append(i['companySize'])
            city_list.append(i['city'])
            salary_lsit.append(i['salary'])
    end_res = pd.DataFrame({
        "公司代号": companyId_list,
        "职位名称": postname_list,
        "工作年限": workyear_list,
        "公司规模": companysize_list,
        "城市": city_list,
        "薪水": salary_lsit
    })
    end_res.to_csv("lagou10.csv")
if __name__ == '__main__':
    companyId_list = []
    postname_list = []
    workyear_list = []
    companysize_list = []
    city_list = []
    salary_lsit = []
    parse_page()

最后,直接用索引的方式提取出一些信息,保存为scv文件。用excel打开csv如果出现乱码,就按照我上一篇文章方法去做,最后得到的结果如下:
在这里插入图片描述
总结一下:本次爬取主要是学习了对使用Ajax技术的网址进行爬取,但看了一些资料说很多网站使用的Ajax很复杂,需要学习使用selenium进行爬取,这也是我后面学习的重点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值