Python3爬取猎聘网的数据挖掘岗位,以获取数据挖掘所需的编程语言工具


  刚好在学python3,那就写个爬虫简单地看一下数据挖掘岗所需的编程语言工具。

  首先当然是获取数据,这里用的工具是python3的爬虫,请求库用的是requests,解析库是lxml。

  • 爬虫部分

  第一是设置User-Agent,简称UA,也就是参数headers。设置这个后,爬虫可以伪装成浏览器。有关自己浏览器的UA可以在这个网站里找到http://www.useragentstring.com/,浏览器打开后页面的第一行'User Agent String explained'就是你的UA了。

import requests
from lxml import etree
import pandas as pd
import numpy as np
pd.options.display.max_rows=20

headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0'
        }  

  第二是获取一页网页的信息,这里以函数的形式给出,函数的返回结果是一个数据框。

def get_one_page(url):
    text=requests.get(url,headers=headers).text 
    html=etree.HTML(text)
    page_info=pd.DataFrame({
    '岗位名称':html.xpath('//div[@class="job-info"]/h3/@title'),
    '条件待遇':html.xpath('//div[@class="job-info"]/p[@class="condition clearfix"]/@title'),
    '公司名称':html.xpath('//div[@class="company-info nohover"]/p[@class="company-name"]/a/@title'),
    '详情链接':html.xpath('//div[@class="job-info"]/h3/a/@href')})
    return page_info

为什么要有详情链接呢?因为我要的编程语言信息得通过点击岗位名称,进入另一个网页才会出现,所以这里把对应的详情链接也存起来。进入详情链接后该怎么提取信息呢?这里再定义一个函数,专门做这件事情。函数后面会给出来,先往下看。

  既然能获取一页的信息,接下来当然是把所有的页面信息提取出来,放到一个数据框中。

  首先要做的是构造网址。在猎聘网址(https://www.liepin.com/)的搜索框中输入‘数据挖掘’进行搜索,然后就能得到网址,然后手动翻页,观察网址的变化规律,据此规律构造网址进行迭代。

  在此例中,第一页的网址是

https://www.liepin.com/zhaopin/?compkind=&dqs=&pubTime=&pageSize=40&salary=&compTag=&sortFlag=°radeFlag=0&compIds=&subIndustry=&jobKind=&industries=&compscale=&key=%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98&siTag=LiAE77uh7ygbLjiB5afMYg%7EfA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp&d_ckId=312236bc15106e2aac00387aa1d59569&d_curPage=1&d_pageSize=40&d_headId=312236bc15106e2aac00387aa1d59569&curPage=0

  自己手动翻页,就会发现第二页的网址其实就是最后的Page=0改为Page=1了,知道这个规律后,构造网址就方便了。由于‘数据挖掘’岗只有10页,因此只需构造10个网址就行。

base_url='https://www.liepin.com/zhaopin/?compkind=&dqs=&pubTime=&pageSize=40&salary=&compTag=&sortFlag=°radeFlag=0&compIds=&subIndustry=&jobKind=&industries=&compscale=&key=%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98&siTag=LiAE77uh7ygbLjiB5afMYg%7EfA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp&d_ckId=312236bc15106e2aac00387aa1d59569&d_curPage=1&d_pageSize=40&d_headId=312236bc15106e2aac00387aa1d59569&curPage='
#base_url为基础网址
all_job
=pd.DataFrame() for i in range(10): url=base_url+str(i)#这里即在构造网址,通过for循环变化 pageDF=get_one_page(url) all_job=pd.concat([all_job,pageDF],axis=0)

  上面的all_job数据框并没有包含编程语言信息,但包含了能连接到那儿的详情链接,因此这里得从这些链接里提取信息。这里直接给出上面提到的函数。

def get_requements(url_sub):
    if url_sub.startswith('https://www.liepin.com')==False:
        url_sub='https://www.liepin.com'+url_sub
     #如果详情链接网址中没有https://www.liepin.com 这个头,我们就加上它,否则链接不完整,无法访问
text_sub
=requests.get(url_sub,headers=headers).text html_sub=etree.HTML(text_sub) requements=html_sub.xpath('//div[@class="content content-word"]/text()') return ''.join(requements).strip()#返回的是剔除换行符的职位信息

  万事俱备,最后爬就完事了。

all_job['职位描述']=all_job['详情链接'].apply(get_requements)
  • 提取信息部分
all_job['编程语言']=all_job['职位描述'].str.findall('[Cc]\+\+|[a-zA-Z]+')
all_job['编程语言小写']=all_job['编程语言'].apply(lambda x:[i.lower() for i in x])

这里先统计一下出现较多的编程工具,想法是把编程语言这一列的元素转换成序列,然后用value_counts()函数。

languages=[]
for i in range(len(all_job)):
    languages+=all_job['编程语言'].values[i]

langus=pd.Series(languages,index=range(len(languages))).str.lower()

有了这些后,这里就可以对出现次数较多的编程工具绘制一个条形图了,先放代码再放图。

pop_langus=langus.value_counts()
pop_langus[pop_langus>30].plot.barh()#这里认为超过30次的就算是比较受欢迎的编程工具了

  还是python受欢迎!

  其实这里还可以根据这些高频语言在单个岗位中是否同时出现来建立一个复杂网络进行可视化,这里暂且就先不做了。

  最后再比较一下python和r吧,算一下各自的条件概率。首先是获得二者在每个工作岗位中的出现情况,如果出现,我们就记为True,没出现就记为False,新建两列,分别记'python'和'r'。

all_job['python']=all_job['编程语言小写'].apply(lambda x:'python' in x)
all_job['r']=all_job['编程语言小写'].apply(lambda x:'r' in x)
pd.crosstab(all_job.python,all_job.r,margins=True)

  交叉表结果如下:

  算一下二者的条件概率:

  P(python|r)=P(python,r)/P(r)=102/105=0.9714

  P(r|python)=P(python,r)/P(python)=102/287=0.3554

  呃……,看来python也得继续学!