招聘网站爬虫


import random
import time
import pandas as pd
import requests


def get_data():
    # 总数据列表
    all_position_list = []

    # 定义爬取页数  31就是爬取30页  ]右闭
    for page_num in range(1, 1000):

        # 请求地址  注意,F12开发者页面,智联校招搜索职位后,查看网络相应请求,复制请求地址
        url = 'https://xiaoyuan.zhaopin.com/api/sou?S_SOU_FULL_INDEX=Python&S_SOU_POSITION_SOURCE_TYPE=&pageIndex='+ str(page_num)+'&S_SOU_POSITION_TYPE=2&S_SOU_WORK_CITY=&S_SOU_JD_INDUSTRY_LEVEL=&S_SOU_COMPANY_TYPE=&S_SOU_REFRESH_DATE=&order=12&pageSize=30&_v=0.93234077&at=9a754b0d6789422fa44e38b3776034ce&rt=f4873458c5d847b3a8641d559eeb8903&x-zp-page-request-id=59bcfd4a642f400a949ba117b27ef9f2-1692946879414-672437&x-zp-client-id=bb66a9d7-544d-4d9e-b260-2b4b2db62d9f'        # 用户代理
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
            "Cookie": 'x-zp-client-id=bb66a9d7-544d-4d9e-b260-2b4b2db62d9f; sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkchannel=%7B%22prop%22%3A%7B%22_sa_channel_landing_url%22%3A%22https%3A%2F%2Flanding.zhaopin.com%2Fregister%3Fidentity%3Dc%26channel_name%3Dbaidu_sem_track%26callback_id%3DIQJ0tYqm%26_data_version%3D0.5.0%26channel_utm_content%3Dpp%26project%3Dzlclient%26channel_utm_medium%3Docpc%26tid%3Ds%26channel_link_type%3Dweb%26channel_utm_source%3DbaiduPC%26hash_key%3DuaKIYNjV6PvgIWUUAJ9n%26sat_cf%3D2%26channel_utm_campaign%3DPC_%25E7%2599%25BE%25E5%25BA%25A6%25E5%25A4%25A9%25E6%25B4%25A5%26channel_utm_term%3D664602%26_channel_track_key%3DF9g76MwM%26link_version%3D1%26channel_keyword_id%3D376411097724%26channel_ad_id%3D56798896253%26channel_account_id%3D2757477%26channel_keyword%3D%25E6%2599%25BA%25E8%2581%2594%25E6%258B%259B%25E8%2581%2598%2B%25E4%25B8%2589%25E4%25B8%2580%26channel_adgroup_id%3D5583552770%26channel_campaign_id%3D106693787%26sdclkid%3DAL2i15f_ArD6bO2pA5AN%26bd_vid%3D9771828784116840714%22%7D%7D; zp_passport_deepknow_sessionId=5f2c287bs64e52436d9808dec4f4ab9f93cf; at=9a754b0d6789422fa44e38b3776034ce; rt=f4873458c5d847b3a8641d559eeb8903; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221138121497%22%2C%22first_id%22%3A%2218a2abae489955-03fc471374605c4-26031f51-2073600-18a2abae48ac3d%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E4%BB%98%E8%B4%B9%E5%B9%BF%E5%91%8A%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fwww.baidu.com%2Fbaidu.php%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMThhMmFiYWU0ODk5NTUtMDNmYzQ3MTM3NDYwNWM0LTI2MDMxZjUxLTIwNzM2MDAtMThhMmFiYWU0OGFjM2QiLCIkaWRlbnRpdHlfbG9naW5faWQiOiIxMTM4MTIxNDk3In0%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%221138121497%22%7D%2C%22%24device_id%22%3A%2218a2abae489955-03fc471374605c4-26031f51-2073600-18a2abae48ac3d%22%7D; acw_tc=2760828716929340341703681ec412417ce84f74f9763dcc2d69e652752d31'
        }

        # 相关职位和当前页码
        data = {
            'S_SOU_FULL_INDEX': 'Python',
            'pageIndex': page_num
        }
        session = requests.Session()
        session.get(url=url, headers=headers)
        cookies = session.cookies
        res = requests.get(url=url, headers=headers, data=data, cookies=cookies)
        position_result = res.json()['data']['data']['list']
        if len(position_result) > 0:
            # 定义一个存放一页数据的列表
            position_list = []
            # for position in position_result:遍历position_result中的每一个元素,并将元素依次赋值给position变量
            for position in position_result:
                position_lite = []
                # 岗位名称
                # position_lite(定义的一个列表).append(position['name'](表示从position中获取键为name的值))--->append()是列表对象的方法,用于将获取到的值添加到列表末尾
                position_lite.append(position['name'])
                # 公司名称
                position_lite.append(position['companyName'])
                # 薪资
                position_lite.append(position['salary60'])
                # 城市
                position_lite.append(position['workCity'])
                # 公司规模
                position_lite.append(position['companySize'])
                # 企业类型
                position_lite.append(position['property'])
                # 学历
                position_lite.append(position['education'])
                # 岗位职责
                position_lite.append(position['jobSummary'])
                # 发布时间
                position_lite.append(position['publishTime'])
                # 详情页面
                position_lite.append(position['companyUrl'])

                # 添加进一页数据列表
                position_list.append(position_lite)

            print('page_num{}ye\n'.format(page_num, position_list))
            # {}占位符,用于给page_num展位,这里的position_list其实是没用到的
            # format的几种用法如下:
            # 例如:'Hello, {}! How are you, {}?'.format('Alice', 'Bob') 将输出 'Hello, Alice! How are you, Bob?'
            # 例如:'The sky is {color} and the grass is {color}'.format(color='blue') 将输出 'The sky is blue and the grass is blue'。
            # 例如:'The {0} is {color}.'.format('sky', color='blue') 将输出 'The sky is blue.'。
            # 例如:'The value is {:.2f}'.format(3.14159) 将输出 'The value is 3.14',将浮点数格式化为两位小数。
            # 总数据
            
            all_position_list += position_list

            # 转储CSV
            df = pd.DataFrame(data=all_position_list, columns=[
                '岗位名称', '公司名称', '薪资', '城市', '公司规模', '企业类型', '学历', '岗位职责', '发布时间', '详情页面'
            ])
            # pandas有两个核心数据结构DataFrame,Series
            # all_position_list作为数据源来初始化DataFrame对象,columns用来指定列表的列,在本代码中表示.csv的表头字段
            # 二维数据结构:DataFrame是一个二维的数据结构,数据以行和列的形式排列。每一列都有一个唯一的名称,用于标识该列的内容。
            # 灵活的列操作:DataFrame支持对列进行灵活的操作,例如选择特定列、重命名列、增加新列、删除列等。这使得数据的处理和转换变得非常方便。
            # 数据对齐:DataFrame会自动根据行和列的标签对数据进行对齐。这样,即使不同的DataFrame具有不同的行和列顺序,也可以根据标签进行数据对齐。
            # 数据查询和过滤:DataFrame提供了各种方法来查询和过滤数据,例如按条件筛选、根据列值排序、使用逻辑操作符进行布尔过滤等。
            # 数据统计和聚合:DataFrame提供了丰富的统计和聚合函数,例如求和、均值、中位数、最大值、最小值等,可以方便地对数据进行汇总和统计分析。
            # 缺失值处理:DataFrame提供了灵活的缺失值处理功能,可以检测和处理缺失值,例如填充缺失值、删除包含缺失值的行或列等。
            # 数据合并和连接:DataFrame支持多种方式的数据合并和连接操作,例如根据列或行的值进行合并、连接和拼接。
            # 数据读写:DataFrame可以方便地从各种数据源中读取数据,如文件(CSV、Excel)、数据库、Web API等,并可以将数据写入不同格式的文件
            # 注意存储文件名
            df.to_csv('D:/software/visCode/zhil/spider/Java.csv', mode='w', encoding='utf-8', index=False)
            # mode='w'表示打开文件模式,默认为写入模式,index指定是否将行索引保存到CSV文件。默认为True,表示将行索引作为一列保存,可以通过设置index=False来禁用行索引的保存
            # sleep防止封禁IP
            wait_seconds = random.random() * 10 + 3
            # random.random()这个方法用于生成0-1的浮点数,*10+3就是3-13的数
            print("deng{}s...".format(round(wait_seconds)))
            # round(wait_seconds)方法是将wait_secode取整
            time.sleep(wait_seconds)

            print("over")


# 主函数  程序入口
if __name__ == "__main__":
    get_data()
#     module1.py:

# python
# def hello_world():
#     print("Hello, World!")

# # 调用函数
# hello_world()
# module2.py:

# python
# import module1

# # 导入module1并调用函数
# module1.hello_world()
# 在这种情况下,当我们运行 module2.py 时,不仅会执行 module1.hello_world(),而且还会执行 hello_world()。这可能会导致重复的输出,因为hello_world()被两个模块调用了。

# 使用 if __name__ == "__main__": 的情况:
# module1.py:

# python
# def hello_world():
#     print("Hello, World!")

# if __name__ == "__main__":
#     # 调用函数
#     hello_world()
# module2.py:

# import module1

# # 导入module1并调用函数
# module1.hello_world()
# 在这种情况下,只有当我们直接执行 module1.py 时,hello_world() 才会被调用执行。而在其他模块导入 module1.py 并调用 module1.hello_world() 时,hello_world() 函数不会被执行。这样就避免了重复的输出,并确保了代码的正确性。

薪薪之火可以燎原,也许就是自己的一点光照亮了别人的夜晚,少熬夜秃驴!

招聘网站爬虫_第1张图片

更多资源------>黑凤梨 (zhangwujistudy) - Gitee.com

你可能感兴趣的:(数据分析,爬虫,python)