Python实战:从猎聘网获取职位信息并存入数据库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Python实战:从猎聘网获取职位信息并存入数据库

通过使用python从猎聘网获取职位信息并存入mysql数据库中。

标题:Python实战:从猎聘网获取职位信息并存入数据库

  1. 准备工作:

在开始之前,我们需要安装Python和相应的库(requests、pymysql)

  1. 获取数据:

首先,我们需要模拟HTTP请求,向猎聘网发送请求,获取职位信息。我们可以使用requests库来实现这一功能。具体的请求地址和参数可以通过浏览器的开发者工具来获取。


  1. 解析数据:

获取到的数据通常是JSON格式的,我们需要解析JSON数据,提取出我们需要的职位信息,例如职位名称、公司名称、工作地点、薪资待遇等。


  1. 存储数据:

接下来,我们将解析得到的职位信息存入MySQL数据库中。我们可以使用pymysql库来连接MySQL数据库,并执行SQL语句将数据插入到数据库表中。

分析猎聘网网页,发猎聘网是通过接口请求获取json数据进行渲染的,但是需要先做一个js反向操作。

下面我将逐行解释代码的功能和执行过程:

导入必要的库:

import time
import requests
import execjs
import pymysql

在这里,我们导入了用于处理时间、发送HTTP请求、执行JavaScript代码以及连接MySQL数据库的库。

设置数据库配置:

db_config = {
    'host': '127.0.0.1',
    'user': 'root',
    'password': '12345678',
    'database': 'work_data',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}

这里定义了连接数据库所需的参数,包括主机地址、用户名、密码、数据库名称、字符集等。

读取JavaScript代码:

def read_js_code():
    f = open('/Users/shareit/workspace/chart_show/demo.js', encoding='utf-8')
    txt = f.read()
    js_code = execjs.compile(txt)
    ckId = js_code.call('r', 32)
    return ckId

这个函数用于读取JavaScript代码,并执行JavaScript来生成一个参数(ckId),用于后续的HTTP请求。

发送HTTP请求获取数据:

def post_data():
    read_js_code()
    # 设置请求头信息
    headers = {...}
    # 遍历城市和行业列表发送请求
    for name in list:
        for i in range(1):
            # 构造请求数据
            data = {"data": {"mainSearchPcConditionForm":
                                 {"city": "410", "dq": "410", "pubTime": "", "currentPage": i, "pageSize": 40,
                                  "key": "大数据",
                                  "suggestTag": "", "workYearCode": "0$1", "compId": "", "compName": "", "compTag": "",
                                  "industry": name, "salary": "", "jobKind": "", "compScale": "", "compKind": "",
                                  "compStage": "",
                                  "eduLevel": ""},
                             "passThroughForm":
                                 {"scene": "page", "skId": "z33lm3jhwza7k1xjvcyn8lb8e9ghxx1b",
                                  "fkId": "z33lm3jhwza7k1xjvcyn8lb8e9ghxx1b",
                                  "ckId": read_js_code(),
                                  'sfrom': 'search_job_pc'}}}
            # 发送POST请求
            response = requests.post(url=url, json=data, headers=headers)
            time.sleep(2)  # 控制请求频率
            parse_data(response)

这个函数负责发送HTTP POST请求来获取猎聘网的职位信息数据。请求的URL、请求头、请求数据都在这里设置。

解析并处理数据:

def parse_data(response):
    try:
        jobCardList = response.json()['data']['data']['jobCardList']
        sync_data2db(jobCardList)
    except Exception as e:
        return

这个函数用于解析HTTP响应,提取其中的职位信息,并调用sync_data2db()函数将数据存入数据库中。

将数据同步到数据库:

def sync_data2db(jobCardList):
    connection = pymysql.connect(**db_config)
    try:
        with connection.cursor() as cursor:
            for job in jobCardList:
                # 构造插入数据库的SQL语句和参数
                insert_query = "INSERT INTO job_detail(job_title,location,salary_amount,work_experience,tags,company_name,industry,company_size) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"
                values = (job['job']['title'], job['job']['dq'].split("-")[0], process_salary(job['job']['salary']),
                                    job['job']['campusJobKind'] if 'campusJobKind' in job['job'] else '应届'
                                    , " ".join(job['job']['labels']), job['comp']['compName'], job['comp']['compIndustry'], job['comp']['compScale'])
                # 执行SQL语句
                cursor.execute(insert_query,values)
        connection.commit()  # 提交事务
    except Exception as e:
        print(e)
    finally:
        connection.close()  # 关闭数据库连接

这个函数负责将解析后的职位信息存入MySQL数据库中。首先建立数据库连接,然后遍历职位信息列表,构造插入数据库的SQL语句和参数,并执行插入操作。最后提交事务并关闭数据库连接。

主程序入口:

if __name__ == '__main__':
    post_data()

这个部分是整个程序的入口,调用post_data()函数开始执行爬取和数据存储的过程。

下面是完整代码

# -*- coding: utf-8 -*-
import time

import requests
import execjs

import pymysql

db_config = {
    'host': '127.0.0.1',
    'user': 'root',
    'password': '12345678',
    'database': 'work_data',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}


def read_js_code():
    f = open('/Users/shareit/workspace/chart_show/demo.js', encoding='utf-8')
    txt = f.read()
    js_code = execjs.compile(txt)
    ckId = js_code.call('r', 32)
    return ckId


def post_data():
    read_js_code()
    url = "https://api-c.liepin.com/api/com.liepin.searchfront4c.pc-search-job"
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Sec-Ch-Ua-Platform': 'macOS',
        'Content-Length': '398',
        'Content-Type': 'application/json;charset=UTF-8;',
        'Host': 'api-c.liepin.com',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
        'Origin': 'https://www.liepin.com',
        'Referer': 'https://www.liepin.com/',
        'Sec-Ch-Ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
        'Sec-Ch-Ua-Mobile': '?0',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'X-Client-Type': 'web',
        'X-Fscp-Bi-Stat': '{"location": "https://www.liepin.com/zhaopin"}',
        'X-Fscp-Fe-Version': '',
        'X-Fscp-Std-Info': '{"client_id": "40108"}',
        'X-Fscp-Trace-Id': '52262313-e6ca-4cfd-bb67-41b4a32b8bb5',
        'X-Fscp-Version': '1.1',
        'X-Requested-With': 'XMLHttpRequest',
    }

    list = ["H01$H0001", "H01$H0002","H01$H0003", "H01$H0004", "H01$H0005","H01$H0006", "H01$H0007", "H01$H0008","H01$H0009", "H01$H00010", "H02$H0018", "H02$H0019", "H03$H0022",
            "H03$H0023", "H03$H0024", "H03$H0025", "H04$H0030", "H04$H0031",
            "H04$H0032", "H05$H05", "H06$H06", "H07$H07", "H08$H08"]
    list = ["H01","H02","H03","H04","H05","H06","H07","H08","H09","H10","H01$H0001", "H01$H0002","H01$H0003", "H01$H0004", "H01$H0005","H01$H0006", "H01$H0007", "H01$H0008","H01$H0009", "H01$H00010"]
    for name in list:
        print("-------{}---------".format(name))
        for i in range(1):
            print("------------第{}页-----------".format(i))
            data = {"data": {"mainSearchPcConditionForm":
                                 {"city": "410", "dq": "410", "pubTime": "", "currentPage": i, "pageSize": 40,
                                  "key": "大数据",
                                  "suggestTag": "", "workYearCode": "0$1", "compId": "", "compName": "", "compTag": "",
                                  "industry": name, "salary": "", "jobKind": "", "compScale": "", "compKind": "",
                                  "compStage": "",
                                  "eduLevel": ""},
                             "passThroughForm":
                                 {"scene": "page", "skId": "z33lm3jhwza7k1xjvcyn8lb8e9ghxx1b",
                                  "fkId": "z33lm3jhwza7k1xjvcyn8lb8e9ghxx1b",
                                  "ckId": read_js_code(),
                                  'sfrom': 'search_job_pc'}}}
            response = requests.post(url=url, json=data, headers=headers)
            time.sleep(2)
            parse_data(response)


def process_salary(salary):
    if '薪资面议' == salary:
        return 0
    salary = salary.split("k")[0]
    if '-' in salary:
        low, high = salary.split('-')
        low = float(low) * 1000  # 将 'k' 替换为实际的单位
        return low
    else:
        return float(salary) * 1000

def parse_data(response):
    try:
        jobCardList = response.json()['data']['data']['jobCardList']
        sync_data2db(jobCardList)
    except Exception as e:
        return


def sync_data2db(jobCardList):
    connection = pymysql.connect(**db_config)
    try:
        with connection.cursor() as cursor:
            for job in jobCardList:
                print(job)
                insert_query = "INSERT INTO job_detail(job_title,location,salary_amount,work_experience,tags,company_name,industry,company_size) VALUES (%s,%s,%s,%s,%s,%s,%s,%s)"
                values = (job['job']['title'], job['job']['dq'].split("-")[0], process_salary(job['job']['salary']),
                                    job['job']['campusJobKind'] if 'campusJobKind' in job['job'] else '应届'
                                    , " ".join(job['job']['labels']), job['comp']['compName'], job['comp']['compIndustry'], job['comp']['compScale'])
                print(values)
                # cursor.execute(insert_query,values)
        connection.commit()
    except Exception as e:
        print(e)
    finally:
        connection.close()

if __name__ == '__main__':
    post_data()

以下是程序运行结果


相关文章
|
2月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
241 77
|
4月前
|
数据库 Python
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
|
4月前
|
存储 运维 监控
百万指标,秒级查询,零宕机——时序数据库 TDengine 在 AIOps 中的硬核实战
本篇文章详细讲述了七云团队在运维平台中如何利用 TDengine 解决海量时序数据存储与查询的实际业务需求。内容涵盖了从数据库选型、方案落地到业务挑战及解决办法的完整过程,特别是分享了升级 TDengine 3.x 时的实战经验,给到有需要的小伙伴参考阅读。
129 1
|
5月前
|
关系型数据库 数据库 数据安全/隐私保护
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
|
6月前
|
存储 缓存 监控
71.7万/秒到1.4万/秒!数据库查询优化实战
在现代计算机系统中,程序的局部性原理是优化性能的关键。通过利用时间局部性和空间局部性,可以显著提升数据访问效率,减少高开销的操作如内存访问和网络 I/O。本文将探讨如何利用空间局部性原理,在实际案例中减少数据库查询量,并通过详细的监控和优化措施确保系统的稳定性和高效性。
71.7万/秒到1.4万/秒!数据库查询优化实战
|
4月前
|
SQL 关系型数据库 数据库连接
|
7月前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
842 15
|
8月前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
155 4
|
8月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
1021 1

推荐镜像

更多