Boss直聘职位信息爬取+分析

本文介绍了一个使用Python实现的BOSS直聘职位信息爬虫,通过解析搜索页面和详细页面,抓取并分析了732条职位信息,包括公司名称、职位标题、薪资、经验要求等,并将数据存储到MySQL数据库中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BOSS直聘职位信息爬取分析

先上结果,本次抓取了732条职位的信息入库:
在这里插入图片描述
在这里插入图片描述

代码实现:

import requests
import json
from lxml import etree
from requests.exceptions import RequestException
from pymysql import *
class BossSpider():
    def get_html(self,url):
        try:
            headers = {
                'user-agent': 'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Mobile Safari/537.36'
            }
            response = requests.get(url=url, headers=headers)
            # 更改编码方式,否则会出现乱码的情况
            response.encoding = "utf-8"
            if response.status_code == 200:
                return response.text
            return None
        except RequestException:
            return None
    def parse_search_html(self,resp):
        base_url = 'https://www.zhipin.com'
        resp = json.loads(resp)
        resp_html = resp['html']
        if resp_html:
            resp_html = etree.HTML(resp_html)
            detail_url_href = resp_html.xpath('//li[@class="item"]/a/@href')
            detail_url_ka = resp_html.xpath('//li[@class="item"]/a/@ka')
            detail_url_datalid = resp_html.xpath(r'//li[@class="item"]/a/@data-lid')
            detail_url_href = [base_url+i for i in detail_url_href]
            detail_url_params = []
            for ka,lid in zip(detail_url_ka,detail_url_datalid):
                url_param = {}
                url_param['ka'] = ka
                url_param['lid'] = lid
                detail_url_params.append(url_param)
            detail_url = [self.get_full_url(href,params) for href,params in zip(detail_url_href,detail_url_params)]
            return detail_url
        else:
            return None

    def parse_detail_html(self, resp,job_json):
        resp_html = etree.HTML(resp)
        job_detail = resp_html.xpath('//div[@class="job-detail"]/div[@class="detail-content"]/div[1]/div//text()')
        job_detail = [i.replace('\n','').replace(' ','') for i in job_detail]
        job_detail = ''.join(job_detail)

        # import ipdb
        # ipdb.set_trace()

        company_name = resp_html.xpath('//div[@class="info-primary"]/div[@class="flex-box"]/div[@class="name"]/text()')[0]
        job_title = resp_html.xpath('//div[@id="main"]/div[@class="job-banner"]/h1[@class="name"]/text()')[0]
        job_salary = resp_html.xpath('//div[@id="main"]/div[@class="job-banner"]//span[@class="salary"]//text()')[0]
        job_vline = resp_html.xpath('//div[@id="main"]/div[@class="job-banner"]/p/text()')[2]
        job_years = resp_html.xpath('//div[@id="main"]/div[@class="job-banner"]/p/text()')[1]
        job_json['job_detail'] = job_detail
        job_json['company_name'] = company_name
        job_json['job_title'] = job_title
        job_json['job_salary'] = job_salary
        job_json['job_vline'] = job_vline
        job_json['job_years'] = job_years
        self.connect_mysql(job_json)
    def get_full_url(self,url, uri: dict) -> str:
        return url + '?' + '&'.join([str(key) + '=' + str(value) for key, value in uri.items()])
    def connect_mysql(self,job_json):
        try:
            job_list = [job_json['company_name'],job_json['job_title'],
                        job_json['job_salary'],job_json['job_vline'],
                        job_json['job_years'],job_json['job_detail'],job_json['keyword']]
            conn = connect(host = 'localhost',port = 3306,
                           user = 'root',passwd = '1996101',
                           db = 'spider',charset='utf8')
            cursor = conn.cursor()
            sql = 'insert into boss_job(company_name,job_title,job_salary,job_vline,job_years,job_detail,keyword) values(%s,%s,%s,%s,%s,%s,%s)'
            cursor.execute(sql,job_list)
            conn.commit()
            cursor.close()
            conn.close()
            print('一条信息录入....')
        except Exception as e:
            print(e)
    def spider(self,url,job_json):
        resp_search = self.get_html(url)
        detail_urls = self.parse_search_html(resp_search)
        if detail_urls:
            for detail_url in detail_urls:
                resp_detail = self.get_html(detail_url)
                if type(resp_detail) is str:
                    self.parse_detail_html(resp_detail,job_json)
if __name__ == '__main__':
    keywords = ['数据']
    MAX_PAGE = 20
    for keyword in keywords:
        for page_num in range(MAX_PAGE):
            url = f'https://www.zhipin.com/mobile/jobs.json?page={page_num+1}&city=101210100&query={keyword}'
            job_json = {'keyword':keyword}
            boss_spider = BossSpider()
            boss_spider.spider(url,job_json)
### Python爬虫 Boss信息数据分析毕业论文示例 以下是关于如何利用Python编写爬虫程序来获取Boss上的招信息并进行数据分析的一个完整思路和代码框架: #### 一、需求分析 在实际开发过程中,需要明确目标数据范围以及后续的数据处理方向。根据已有参考资料[^1],可以得知主要关注以下几个方面: - 不同岗位的薪资水平分布; - 学历要求及其对应关系; - 各地区域内的行业需求差异。 这些维度能够帮助我们构建一个多角度的研究视角,进而完成一篇高质量的毕业论文。 #### 二、技术选型 为了高效地抓取网页内容并与数据库交互存储大量结构化信息,在此推荐采用如下工具链组合方案: - **Scrapy** 或 Selenium 配合 Requests 库用于模拟浏览器行为访问动态加载页面。 - MySQL 数据库存储解析后的JSON对象形式的结果集。 - Pandas 和 Matplotlib/Numpy 进行初步探索性和描述性的统计图表绘制工作流程说明见参考资料[^3]. #### 三、核心功能模块设计 ##### (1) 网络请求部分 定义一个通用函数发送GET/POST 请求到指定URL地址,并返回响应体作为字符串类型变量供下一步操作使用前需设置合适的headers参数伪装成真实用户的HTTP头文件样例如下所示: ```python import requests def fetch_page(url, params=None): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' ' AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/92.0.4515.131 Safari/537.36' } response = requests.get(url=url, headers=headers, params=params) if response.status_code == 200: return response.text else: raise Exception(f"Failed to load page {url}, status code:{response.status_code}") ``` ##### (2) HTML 解析提取有效字段 借助BeautifulSoup或者lxml库定位标签节点属性值读取出感兴趣的部分比如职位名称公司名月薪区间等工作地点等关键要素示范片段展示于下方: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html_content,'html.parser') job_listings = soup.find_all('div', class_='info-primary') jobs_data = [] for job in job_listings: title = job.a['title'] salary = job.span.string.strip() company_name = job.parent.next_sibling.div.hover_card.p.text.split('\n')[1].strip() jobs_data.append({ "Title": title, "Salary": salary, "Company Name":company_name}) ``` ##### (3) 数据持久化保存至本地磁盘或远程服务器端MySQL实例当中去 创建表单语句模板举例: ```sql CREATE TABLE IF NOT EXISTS `boss_zhipin_jobs` ( id INT AUTO_INCREMENT PRIMARY KEY , Title VARCHAR(255), Salary VARCHAR(50), CompanyName VARCHAR(255), CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); ``` 接着批量插入记录方法演示: ```python insert_sql = """INSERT INTO boss_zhipin_jobs (`Title`, `Salary`,`CompanyName`) VALUES (%s,%s,%s);""" cursor.executemany(insert_sql,jobs_data) conn.commit() ``` 最后记得关闭连接释放资源结束整个事务过程. #### 四、结果呈现方式建议 除了传统的Excel表格之外还可以尝试制作更加观生动的地图热力图柱状对比图等形式让读者更容易理解结论要点详情可参阅文献[^2] ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

精神抖擞王大鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值