Comment analyser le site de recrutement de l'emploi avec des reptiles et des analyses

Récemment, de nombreux programmeurs ont commencé à chercher du travail, afin de comprendre le nombre actuel de postes dans chaque catégorie de la technologie, de la paie, les entreprises de recrutement, les responsabilités professionnelles et les exigences, je glissai un crochet de traction net quatre villes au nord des données de recrutement Guangzhou-Shenzhen, un total de 3w bande. Les positions comprennent: l' intelligence artificielle (IA), les grandes données, l' analyse de données, back-end (Java, C | C ++, PHP, Python), front-end, Android, iOS et test intégré. Maintenant , je vais être en deux parties, la première partie est une extraction de données; seconde partie de l' analyse des données. Pour répondre au code source dans le numéro de clé publique (voir la fin du texte)  après  peut être.

Saisie des données

Ici, je ne suis pas surpris par les pages web traditionnelles, analyser le code HTML de la façon dont les données ramper, mais avec crawl logiciel Charles enrouleurs APP a demandé une interface de données.

Probablement le processus est de commencer Charles -> connexion téléphonique agents Charles (à la fois dans le même réseau local) -> Ouvrir APP a demandé des données -> Observation paquet de coupe Charles, nous voulons trouver l'interface

Tout d'abord, trouver l'emploi Interface de recherche

/ V1 / entrée / positionsearch / searchPosition

Ceci est une demande POST, nous devons trouver l'en-tête et le corps de la demande, la tête et le corps plus critique comme suit

entête:

'XL-REQ-HEADER': « { "deviceType" 150, "userType": 0 " lgId": "11835BCC-8815-456A-A094-64FB2B9323EF_1585362240", "reqVersion": 73600 " appVersion":" 7,36 .0" , "UserToken": "xxx"} » 
'type de contenu': "application / json"

Où chaque champ UserToken est pas la même chose, vous devez déterminer leur propre capture

corps

{ "tagtype": "", "ISAD": "1", "showId": "", "quartier": "", "keywordSource": 0 "mot - clé": "数据开发", 
                "salaryUpper": 0 , "HITAG": "", "longitudeAndLatitude": "-1,000000, -1,000000", "pageno": 1, "trier": 0, 
                "pageSize": 15, "refreshHiTagList": Il est vrai que "lastShowCompanyId": 0, "nearByKilometers": "", "ville": "北京", 
                "businessZone": "", "shieldDeliveyCompany": Faux, "salaryLower": 0, "subwayLineName": "", 
                "subwayStation": ""  }

Parmi eux, nous avons juste besoin de se concentrer mot-clé, pageno, champ pageSize, ce qui représente ce que la recherche d'emploi, recherche les premières pages, combien de pages de recherche.

Avec cette information, nous serons en mesure de données de demande par le biais du programme dans différentes positions, et afin d'obtenir des emplois de plus amples informations, nous pouvons également trouver obtenir le mode d'interface page détails emploi est similaire, ne pas les répéter ici. Messages du code de demande suit comme

def get_data (auto): 
        pour la ville en self.cities_conf: 
            pour une place dans self.positions_conf: 

                self.position_search_body [ 'mot - clé'] = Position 
                self.position_search_body [ 'ville'] = ville 

                pageno = 1 
                has_more = 1 
                tout has_more: 
                    essayer : 
                        self.position_search_body [ 'pageno'] = pageno 
                        url = 'https://gate.lagou.com/v1/entry/positionsearch/searchPosition' 
                        res = requests.post (url, data = json.dumps (self.position_search_body) , headers = self.headers) 
                        print ( '成功爬取% s市-% s职位的第% d页!数据» % (ville, la position, pageno)) 
                        item = { 'ville': ville, 'pType': position}
                        Imprimer (res.json ()) 
                        positionCardVos = res.json () [ 'Contenu'] [ ''] positionCardVos 
                        self._parse_record (positionCardVos, article) 

                        pageno est pas 1 = +. 
                        SI ou positionCardVos EST Aucun len (positionCardVos) <15: 
                            has_more 0 = 

                        la time.sleep (random.random () * 5.) 
                    l'exception exception AS E: 
                        MSG = « lien d'accès échoue, nouvelle tentative est! Exception: S% « % E 
                        impression (MSG) 
                        le time.sleep ((+ random.random 1 ()) * 10).

 

变量 position 代表不同的职位,这里请求的时候会加随机停留时间,目的为了防止请求过于平凡。我们抓去别人的数据应该注意这一点,不能恶意爬别人的数据。应该模拟得更像普通人一样去请求数据,如果请求过于频繁导致别人服务出现问题那真实罪大恶极。

_parse_record 方法是解析请求的数据,并存入mongo。首先解析数据没什么好说的,就是解析json而已。简单说下为什么存入mongo,第一,解析的json数据,mongo存储就是用json格式,读取和写入非常方便;第二,mongo不用提前设计表Schema,对我们这种临时性和不确定性的分析带来方便;第三,mongo可以存储海量的数据;第四,mongo会缓存热点数据,我们在后续分析时候读取会非常快。

_parse_record 方法代码如下,为了避免啰嗦,我只保留部分字段的解析,其他的代码可以下载详细代码来看

def _parse_record(self, data, item):
        if data:
            for position in data:
                item['pId'] = position.get('positionId')
                item['_id'] = '%s_%s_%d' % (item['city'], item['pType'], item['pId'])
          # ... 省略

                try:
                    position_detail_res = requests.get(self.position_detail_url % item['pId']
                                                       , timeout=20, headers=self.headers)  # 请求详情页的数据
                    position_content = position_detail_res.json()['content']
                    item['pAdvantage'] = position_content.get('positionAdvantage')
            # ...省略
            
            time.sleep(random.random() * 2)
          except Exception as e: 
            msg = '抓去职位%d详情页失败, Exception: %s' % (item['pId'], e) 
            print(msg) 
            self.db['positions'].update_one({'_id': item['_id']}, {'$set': item}, upsert=True) 
            msg = '成功保存数据:{}!'.format(item) 
            print(msg)

 

可以看到方法中还请求了职位详情数据来丰富每一条数据的维度。  

数据分析

抓取数据后下面就是分析了,主要用pandas进行统计和画图。由于代码是用jupyter写的,这里不方便贴,所以我直接贴结论,感兴趣的朋友可以自行查看详细代码。

1、哪个城市目前招聘的岗位多

可以看到,目前北京招聘的岗位最多,其次是上海和深圳,广州是最少的。

2、每个城市各岗位的需求量

北上广深4个城市目前招聘较多的岗位主要是后端-Java、前端、AI和测试。

3、各岗位的平均薪资情况

AI岗位的薪资最高,平均每个月30k以上;其次是大数据岗位,平均每个月26k左右,iOS的平均薪资比Android稍微高一些。另外,目前的前端岗位平均薪资偏低。

4、几年工作经验比较吃香

 

以北京招聘数据为例,目前招聘的各岗位都是以3-5年工作经验为主,1-3年经验的需求量不大。所以,这里也要提醒职场新人,不要轻易跳槽。

其他城市的分布情况与北京类似,这里就不贴图了。

5、什么学历比较吃香

 

以北京为例,目前招聘的岗位除了AI需要不少的硕士甚至博士外,其他岗位以本科学历为主。

其他城市分布与北京类似。

6、什么规模公司对岗位需求大

                                                                             北京

 

                                                                               广州

可以看到,北京招聘的企业主要是2000人以上规模的大公司,上海和深圳的分布与北京类似。而广州在AI、前端和后端-Java几个岗位的招聘主要以50-1000人的中等规模公司为主。

7、HR什么时间段更活跃

以北京为例,各岗位的HR大部分在下午活跃,所以大家可以将简历的投递时间选在下午。

其他城市分布与北京类似。

8、岗位的职责和要求

限于篇幅,我只跑了AI、后端-Java和前端这3个岗位的数据,以词云的形式展现

希望这次分析能对你有用,欢迎公众号「渡码」,回复关键字“职位”即可获取本次分析的源码。

 

Je suppose que tu aimes

Origine www.cnblogs.com/duma/p/12609489.html
conseillé
Classement