Advertisement

爬取拉勾网进行数据分析

阅读量:

首先用scrapy框架来写爬虫。这个爬虫代码基本是参照这里这个博主写的,我只是添加了middlewaves的部分。其实关于爬虫还有很多不明白的地方,只是了解基本原理和scrapy框架,但毕竟不是爬虫工程师,有时间再慢慢补充吧。

数据获取

爬虫代码如下

Items:

复制代码
 import scrapy

    
 from scrapy.item import Item, Field
    
  
    
  
    
 class Lagou2Item(scrapy.Item):
    
     name = Field()
    
     location = Field()
    
     position = Field()
    
     exprience = Field()
    
     money = Field()

Middlewares:

复制代码
 import scrapy

    
 from scrapy import signals
    
 from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware
    
 import random
    
  
    
 class LagouwangSpiderMiddleware(object):
    
     def __init__(self, user_agent):
    
     self.user_agent = user_agent
    
     @classmethod
    
     def from_crawler(cls,crawler):
    
     return cls(
    
             user_agent = crawler.settings.get('MY_USER_AGENT')
    
         )
    
     def process_request(self, request, spider):
    
     agent = random.choice(self.user_agent)
    
     request.headers['User-Agent'] = agent

Pipelines:

复制代码
 from scrapy import signals

    
 import json
    
 import codecs
    
 from openpyxl import Workbook
    
 class LagouPipeline(object):
    
     def __init__(self):
    
     self.workbook = Workbook()
    
     self.ws = self.workbook.active
    
     self.ws.append(['公司名称', '工作地点', '职位名称', '经验要求', '薪资待遇'])  # 设置表头
    
     #self.file = codecs.open('lagouwang.json', 'w', encoding='utf-8')
    
     def process_item(self, item, spider):
    
     line = [item['name'], item['location'], item['position'], item['exprience'], item['money']]  # 把数据中每一项整理出来
    
     self.ws.append(line)
    
     self.workbook.save('lagouwang2.xlsx')  # 保存xlsx文件
    
     #line = json.dumps(dict(item), ensure_ascii=False) + "\n"
    
     #self.file.write(line)
    
     return item
    
     def spider_closed(self, spider):
    
     self.file.close()

Settings:

复制代码
 BOT_NAME = 'lagouwang'

    
  
    
 SPIDER_MODULES = ['lagouwang.spiders']
    
 NEWSPIDER_MODULE = 'lagouwang.spiders'
    
  
    
 ROBOTSTXT_OBEY = False
    
  
    
 DOWNLOAD_DELAY = 10
    
  
    
 DOWNLOADER_MIDDLEWARES = {
    
     'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
    
     'lagouwang.middlewares.LagouwangSpiderMiddleware': 400,
    
 }
    
  
    
 MY_USER_AGENT = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36']

爬虫本体:

复制代码
 import scrapy

    
 import os
    
 import re
    
 import codecs
    
 import json
    
 import sys
    
 from scrapy import Spider
    
 from scrapy.selector import Selector
    
 from lagouwang.items import Lagou2Item
    
 from scrapy.http import Request
    
 from scrapy.http import FormRequest
    
 from scrapy.utils.response import open_in_browser
    
  
    
  
    
  
    
 class LgSpider(scrapy.Spider):
    
     name = 'lg'
    
     #allowed_domains = ['www.lagou.com']
    
     start_urls = ['http://www.lagou.com/']
    
     custom_settings = {
    
     "DEFAULT_REQUEST_HEADERS": {
    
         'Accept': 'application/json, text/javascript, */*; q=0.01',
    
         'Accept-Encoding': 'gzip, deflate, br',
    
         'Accept-Language': 'zh-CN,zh;q=0.9',
    
         'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',            'Host': 'www.lagou.com',
    
         'Origin': 'https://www.lagou.com',
    
         'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?px=default&city=%E5%85%A8%E5%9B%BD',
    
         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
    
         'X-Anit-Forge-Code': '0',
    
         'X-Anit-Forge-Token': 'None',
    
         'X-Requested-With': 'XMLHttpRequest'
    
     },
    
     "ITEM_PIPELINES": {
    
         'lagouwang.pipelines.LagouPipeline': 300
    
     }
    
     }
    
     def start_requests(self):
    
     #修改city参数更换城市
    
     url = "https://www.lagou.com/jobs/positionAjax.json?px=default&needAddtionalResult=false&city=全国"
    
     requests = []
    
     for i in range(1, 60):
    
     #修改kd参数更换关键字
    
         formdata = {'first':'false', 'pn':str(i), 'kd':'数据分析'}
    
         request = FormRequest(url, callback=self.parse_model, formdata=formdata)
    
         requests.append(request)
    
         print(request)
    
     return requests
    
     def parse_model(self, response):
    
     print(response.body.decode())
    
     jsonBody = json.loads(response.body.decode())
    
     results = jsonBody['content']['positionResult']['result']
    
     items=[]
    
     for result in results:
    
         item = Lagou2Item()
    
         item['name'] = result['companyFullName']
    
         item['location'] = result['city']
    
         item['position'] = result['positionName']
    
         item['exprience'] = result['workYear']
    
         item['money'] = result['salary']
    
         items.append(item)
    
     return items

爬出来690条数据,格式是这样的:

数据清洗

可以看到薪资一栏给出的是一个区间,那么我们将其转化为平均值可能会更加易于分析。由于之后的数据可是话我打算用Tableau来做,而且需要处理的数据就这么一列,我就直接在Excel中处理了。

首先将“薪资待遇”一栏分列,然后将“-”替换掉,最后取两列之间的平均值,得到:

数据分析

将数据导入Tableau,看一下平均薪资的直方图:

可以看到是个很明显右偏的分布,绝大多数的薪资在10-15这个范围内。当然也有少数比较高的情况。比如一家叫小川在线的网络公司,给工作经验5-10年的人50k-100k的月薪。这是一家移动互联网公司,主打的是一款叫做“最右”的社交app,目前有95个招聘岗位,除了5-10年工作经验的数据专家以外,同时还招聘1-3年经验的初级数据分析和3-5年的中级数据分析师。

将工作经验载入数据后,可以看到,求职市场上主要的需求还是3-5年的中级分析师。而在低于20K薪水的区间内,1-3年经验的初级分析师需求量也不小。

看一下工作经验与薪资的对比情况。显而易见,工龄越长薪资水平越高。对于1-3年的工作经验,平均薪资大概为13.59K,3-5年为19.72K,5-10年为30.38K。 对比之前的小川公司,他给出的1-3年和3-5年的平均工资分别为22.5K和45K,看来是远高于市场水平。

接下来看一下工作岗位的分布:

600多组样本中,数据集中在26个城市之间,主要以南方沿海地区较多,如果想要从事数据分析工作,大西北就不要去了。

具体看一下每个城市的岗位数量:

可见,岗位主要集中于北上广深杭这些一线城市,尤其是北京,总共有326个招聘记录,占据了全部样本的47%。

接下来,可以看一下各地薪资水平。

筛选掉记录数少于10的城市(就剩这五个了……),可以看到北京的平均薪资依旧最高。

总结

从总体薪酬分布来看,数据分析师的薪资还是普遍较高的。大多集中在10K-25K之间,招聘市场对于工作经验1-3年和3-5年之间的需求比较大。

根据分析样本来看,北京在全国的招聘市场中占据了47%的份额,其平均工资也是最高,大概在19K左右。

此次分析的样本量和特征值太少值得反思,应该更多的在爬虫上下下功夫。此外,获取的数据类型也不够全面,比如还可以根据不同的薪资水平和岗位要求来进行分析,或者学历和薪资的对比分析。

因为数据比较简单所以选择了Excel+Tableau来做,如果比较复杂和杂乱的话恐怕还是用Python比较方便。

全部评论 (0)

还没有任何评论哟~