拉钩招聘信息爬取-能自行进行职位选择与页数选择

拉钩招聘信息爬虫

  • 分析:难点是其cookie会一直改变并且具有时效性,并且我们在职位的网站查看源代码是查找不到想要的职位数据的,要进行抓包分析。找出真正的原始网址。
  • 需求:保存的数据为csv文件
    直接上代码:
# -*- coding: utf-8 -*-
import requests
import re

"""

"""
"""
    需求1:获取一下信息
        'city': 城市
        'companyFullName': 公司名
        'companySize': 公司规模
        'education': 学历
        'positionName': 职位名称
        'salary': 薪资
        'workYear': 工作时间

    需求2:以逗号(,)分割信息内容,写入文件。要求文件名为 `拉钩职位信息.csv`。
    例如:
        上海,上海沸橙信息科技有限公司,150-500人,本科,python,8k-12k,不限
        """


# 构造请求头
class LGSpider:

    def __init__(self):
        self.url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
        self.url_real = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
        }
        self.headers_real = {
            'Host': 'www.lagou.com',
            'Origin': 'https://www.lagou.com',
            'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'

        }

    # 获取Cooike
    def get_cookie(self):
        """

        :return:  返回cookie 的jar值
        """
        cookie = requests.get(url=self.url, headers=self.headers, allow_redirects=False).cookies
        return cookie

    # 构建表单
    def data(self, first='false', kd='python', pn='1'):
        """

        :param first:
        :param kd: 关键字 爬取的职位 默认为爬取pyhton
        :param pn:  爬取的页数 默认爬取一页
        :return:
        """
        data_real = {
            'first': first,
            'pn': pn,
            'kd': kd,
        }
        return data_real

    # 请求原始网址
    def post_lg(self, real_data):

        print('*' * 50 + 'data:' + '*' * 50, real_data)
        response = requests.post(url=self.url_real, headers=self.headers_real, data=real_data,
                                 cookies=self.get_cookie())
        return response.json()

    # 数据解析
    def parsel_lg(self, real_data, position):
        """

        :param real_data: 构造的请求表单,详见main函数
        :param position: 为了保存的信息
        :return:
        """
        response_json = self.post_lg(real_data)
        lg_data_lis = response_json['content']['positionResult']['result']
        for da in lg_data_lis:
            lg_data = []
            lg_data.append(da['city'])
            lg_data.append(da['companyFullName'])
            lg_data.append(da['companySize'])
            lg_data.append(da['education'])
            lg_data.append(da['positionName'])
            lg_data.append(da['salary'])
            lg_data.append([da['workYear'][:-1]])
            lg_data_str = str(lg_data)
            lg_data_str_done = re.sub("\[|\]|\'", "", lg_data_str)
            print(lg_data_str_done)
            self.save_lg_data(lg_data_str_done, position)

    def write_head(self, position):
        with open(f'{position}拉钩.csv', mode='w', encoding='utf-8', newline='') as fp:
            fp.write("city,companyFullName,companySize,education,positionName,salary,workYear" + '\n')

    # 数据持久化 保存成csv格式
    def save_lg_data(self, lg_data_str_done, position):
        with open(f'{position}拉钩.csv', mode='a', encoding='utf-8', newline='') as fp:
            fp.writelines(lg_data_str_done + '\n')

    # 启动函数
    def main(self, page=5, kd='python'):
        self.write_head(kd)
        for page in range(page):
            real_data = self.data(pn=str(page), kd=kd)
            position = real_data.get('kd')
            self.parsel_lg(real_data, position)
            # position = real_data.get('kd')
            print(f"----正在爬取第{page}页的{position}职位的招聘信息-----")


if __name__ == '__main__':
    Spider = LGSpider()
    kd = input("你想爬取的职位:")
    pn = int(input("爬取的页数:"))
    Spider.main(kd=kd, page=pn)


github项目地址:https://github.com/Key-lei/lagouSpider

发布了21 篇原创文章 · 获赞 12 · 访问量 442

猜你喜欢

转载自blog.csdn.net/weixin_44984627/article/details/104785375