继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Python 爬虫——Python 岗位分析报告

慕姐8265434
关注TA
已关注
手记 1309
粉丝 222
获赞 1065

本文目标

  1. 获取 Ajax 请求,解析 JSON 中所需字段

  2. 数据保存到 Excel 中

  3. 数据保存到 MySQL, 方便分析

简单分析

五个城市 Python 岗位平均薪资水平


webp

五个城市平均薪资.png

Python 岗位要求学历分布


webp

岗位所需学历分布.png

Python 行业领域分布


webp

行业领域.png

Python 公司规模分布


webp

公司规模分布.png

查看页面结构

我们输入查询条件以 Python 为例,其他条件默认不选,点击查询,就能看到所有 Python 的岗位了,然后我们打开控制台,点击网络标签可以看到如下请求:


webp

页面结构.png

从响应结果来看,这个请求正是我们需要的内容。后面我们直接请求这个地址就好了。从图中可以看出 result 下面就是各个岗位信息。

到这里我们知道了从哪里请求数据,从哪里获取结果。但是 result 列表中只有第一页 15 条数据,其他页面数据怎么获取呢?

分析请求参数

我们点击参数选项卡,如下:


webp

参数.png


发现提交了三个表单数据,很明显看出来 kd 就是我们搜索的关键词,pn 就是当前页码。first 默认就行了,不用管它。剩下的事情就是构造请求,来下载 30 个页面的数据了。

构造请求,并解析数据

构造请求很简单,我们还是用 requests 库来搞定。首先我们构造出表单数据 data = {'first': 'true', 'pn': page, 'kd': lang_name} 之后用 requests 来请求url地址,解析得到的 Json 数据就算大功告成了。由于拉勾对爬虫限制比较严格,我们需要把浏览器中 headers 字段全部加上,而且把爬虫间隔调大一点,我后面设置的为 10-20s,然后就能正常获取数据了。

import requestsdef get_json(url, page, lang_name):
    headers = {        'Host': 'www.lagou.com',        'Connection': 'keep-alive',        'Content-Length': '23',        'Origin': 'https://www.lagou.com',        'X-Anit-Forge-Code': '0',        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0',        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',        'Accept': 'application/json, text/javascript, */*; q=0.01',        'X-Requested-With': 'XMLHttpRequest',        'X-Anit-Forge-Token': 'None',        'Referer': 'https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=',        'Accept-Encoding': 'gzip, deflate, br',        'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'
    }
    data = {'first': 'false', 'pn': page, 'kd': lang_name}
    json = requests.post(url, data, headers=headers).json()
    list_con = json['content']['positionResult']['result']
    info_list = []    for i in list_con:
        info = []
        info.append(i.get('companyShortName', '无'))
        info.append(i.get('companyFullName', '无'))
        info.append(i.get('industryField', '无'))
        info.append(i.get('companySize', '无'))
        info.append(i.get('salary', '无'))
        info.append(i.get('city', '无'))
        info.append(i.get('education', '无'))
        info_list.append(info)    return info_list

获取所有数据

了解了如何解析数据,剩下的就是连续请求所有页面了,我们构造一个函数来请求所有 30 页的数据。

def main():
    lang_name = 'python'
    wb = Workbook()
    conn = get_conn()    for i in ['北京', '上海', '广州', '深圳', '杭州']:
        page = 1
        ws1 = wb.active
        ws1.title = lang_name
        url = 'https://www.lagou.com/jobs/positionAjax.json?city={}&needAddtionalResult=false'.format(i)        while page < 31:
            info = get_json(url, page, lang_name)
            page += 1
            import time
            a = random.randint(10, 20)
            time.sleep(a)            for row in info:
                insert(conn, tuple(row))
                ws1.append(row)
    conn.close()
    wb.save('{}职位信息.xlsx'.format(lang_name))if __name__ == '__main__':
    main()

完整代码

import randomimport timeimport requestsfrom openpyxl import Workbookimport pymysql.cursorsdef get_conn():
    '''建立数据库连接'''
    conn = pymysql.connect(host='localhost',
                                user='root',
                                password='root',
                                db='python',
                                charset='utf8mb4',
                                cursorclass=pymysql.cursors.DictCursor)    return conndef insert(conn, info):
    '''数据写入数据库'''
    with conn.cursor() as cursor:
        sql = "INSERT INTO `python` (`shortname`, `fullname`, `industryfield`, `companySize`, `salary`, `city`, `education`) VALUES (%s, %s, %s, %s, %s, %s, %s)"
        cursor.execute(sql, info)
    conn.commit()def get_json(url, page, lang_name):
    '''返回当前页面的信息列表'''
    headers = {        'Host': 'www.lagou.com',        'Connection': 'keep-alive',        'Content-Length': '23',        'Origin': 'https://www.lagou.com',        'X-Anit-Forge-Code': '0',        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0',        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',        'Accept': 'application/json, text/javascript, */*; q=0.01',        'X-Requested-With': 'XMLHttpRequest',        'X-Anit-Forge-Token': 'None',        'Referer': 'https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=',        'Accept-Encoding': 'gzip, deflate, br',        'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7'
    }
    data = {'first': 'false', 'pn': page, 'kd': lang_name}
    json = requests.post(url, data, headers=headers).json()
    list_con = json['content']['positionResult']['result']
    info_list = []    for i in list_con:
        info = []
        info.append(i.get('companyShortName', '无'))  # 公司名
        info.append(i.get('companyFullName', '无'))
        info.append(i.get('industryField', '无'))   # 行业领域
        info.append(i.get('companySize', '无'))  # 公司规模
        info.append(i.get('salary', '无'))   # 薪资
        info.append(i.get('city', '无'))
        info.append(i.get('education', '无'))   # 学历
        info_list.append(info)    return info_list   # 返回列表def main():
    lang_name = 'python'
    wb = Workbook()  # 打开 excel 工作簿
    conn = get_conn()  # 建立数据库连接  不存数据库 注释此行
    for i in ['北京', '上海', '广州', '深圳', '杭州']:   # 五个城市
        page = 1
        ws1 = wb.active
        ws1.title = lang_name
        url = 'https://www.lagou.com/jobs/positionAjax.json?city={}&needAddtionalResult=false'.format(i)        while page < 31:   # 每个城市30页信息
            info = get_json(url, page, lang_name)
            page += 1
            time.sleep(random.randint(10, 20))            for row in info:
                insert(conn, tuple(row))  # 插入数据库,若不想存入 注释此行
                ws1.append(row)
    conn.close()  # 关闭数据库连接,不存数据库 注释此行
    wb.save('{}职位信息.xlsx'.format(lang_name))if __name__ == '__main__':
    main()



作者:李英杰同学
链接:https://www.jianshu.com/p/727c366b0b10


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP