爬取boss直聘目标职位信息

本文介绍了一款针对智联招聘网站的Python爬虫程序,该程序能够抓取指定关键词的职位信息,包括职位名称、薪资、公司名称、公司类型及职位详细描述,并将数据整理成Excel文件。通过解析网页源码,爬虫可以遍历多页搜索结果,获取大量职位信息。
import requests
from lxml import etree
import pandas as pd


class spider:
    def __init__(self, word, begin_page, end_page):
        self.word = word
        self.begin_page = begin_page
        self.end_page = end_page
        self.header = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1 Trident/5.0;"}

        self.url = "https://www.zhipin.com/job_detail/?query="
        self.number = 1
        self.df = pd.DataFrame(columns={'职位', '薪资', '公司', '公司类型', '职位信息'})

    def b_spider(self):
        print('---b_spider')
        for page in range(self.begin_page, self.end_page + 1):
            url = self.url + self.word + '&page=' + str(page)
            print(url)
            response = requests.get(url, headers=self.header)
            html = etree.HTML(response.text)
            company = html.xpath("//div[@class='company-text']/h3/a")
            # // div[ @class ='company-text'] / p / text()[1]
            company_type = html.xpath("//div[@class='company-text']/p/text()[1]")
            links = html.xpath("//div[@class='job-list']//a/@data-url")
            # https://www.zhipin.com/job_detail/c25728ffe1ba9c6e1Xd60tq9GFI~
            for i, link in enumerate(links):
                link = 'https://www.zhipin.com/job_detail/' + str(link)[30:-23]
                print(link)
                self.loadpage(link, company[i].text, company_type[i])
                self.number += 1
        self.df.to_excel("%s.xls" % (self.word), encoding='utf-8', index=False)
        print(self.number)

    def loadpage(self, link, company, company_type):
        print('---loadpage')
        # //div[@class='info-primary']//div[@class='name']/h1
        # //div[@class='info-primary']//div[@class='name']/span
        response = requests.get(link, headers=self.header)
        html = etree.HTML(response.text)
        title = html.xpath("//div[@class='info-primary']//div[@class='name']/h1")[0].text
        salary = html.xpath("//div[@class='info-primary']//div[@class='name']/span")[0].text
        # //div[@class='text']
        job_des = html.xpath("//div[@class='text']/text()")
        self.writepage(title, salary, company, company_type, job_des)

    def writepage(self, title, salary, company, company_type, job_des):
        print('---writepage')

        print(title)
        title = title.replace(' ', '')
        salary = salary.replace(' ', '')
        company = company.replace(' ', '')
        company_type = company_type.replace(' ', '')
        print(salary)
        t = []
        t.append(title)
        t.append(salary)
        t.append(company)
        t.append(company_type)
        s = ''
        for i in job_des:
            s = s + i.strip() + '\n'
        t.append(s)
        f = pd.DataFrame([t], columns={'职位', '薪资', '公司', '公司类型', '职位信息'})
        self.df = pd.concat([self.df, f])


if __name__ == '__main__':
    s = spider('图像处理', 1, 3)
    s.b_spider()

要通过API爬取Boss热门职位的数据,通常需要了解其API接口的具体参数和返回格式。以下是基于Python Scrapy框架以及可能涉及的技术栈来完成这一任务的详细说明。 ### 使用Scrapy框架构建虫 #### 定义Item类 首先,定义用于存储抓取数据的`Item`类。这一步骤已经在引用中有所提及[^1]: ```python import scrapy class BossZhipinItem(scrapy.Item): job_title = scrapy.Field() # 职位名称 company_name = scrapy.Field() # 公司名称 salary = scrapy.Field() # 薪资范围 city = scrapy.Field() # 工作城市 experience_required = scrapy.Field() # 经验要求 education_required = scrapy.Field() # 学历要求 tags = scrapy.Field() # 职位标签 ``` #### 设置Spider 接下来设置一个Spider类,指定起始URL并解析响应页面中的JSON数据。假设目标网站提供了RESTful风格的API,则可以接访问这些API端点获取所需信息。 ```python import json import scrapy class BossZhipinSpider(scrapy.Spider): name = "boss_zhipin" allowed_domains = ["zhipin.com"] def start_requests(self): url = 'https://www.zhipin.com/wapi/zpCommon/data/position.json' yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): data = json.loads(response.text) if 'data' in data and isinstance(data['data'], list): for entry in data['data']: item = BossZhipinItem() try: item['job_title'] = entry.get('name') item['company_name'] = entry.get('company').get('name') if entry.get('company') else None item['salary'] = entry.get('salary') item['city'] = entry.get('city').get('display') if entry.get('city') else None item['experience_required'] = entry.get('workYear') item['education_required'] = entry.get('degreeRequirement') item['tags'] = ', '.join(entry.get('tagList')) if entry.get('tagList') else '' yield item except Exception as e: self.logger.error(f"Parsing failed due to {e}") ``` 上述代码片段展示了如何利用Scrapy Spider从特定API提取字段,并将其填充至自定义Items对象中。 #### 处理动态加载的内容 如果遇到JavaScript渲染后的网页内容(即异步加载),可考虑采用Selenium或者Playwright等工具模拟浏览器行为以获得完整的HTML源码后再交给BeautifulSoup分析[^3]。 ### 结合Django后端服务管理数据 当收集到足够的职位信息之后,可以借助Django框架搭建后台管理系统以便于进一步管理和展示所采集的信息[^2]。具体来说就是建立相应的Model表示实体关系;编写View负责业务逻辑处理;配置Url路径匹配规则等等。 ### 注意事项 - **合法性审查**: 在实际开发前务必确认目标站点是否允许自动化程序访问及其相关条款条件。 - **频率控制**: 合适地调整请求间隔时间以免给服务器带来过大压力甚至被封禁IP地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值