小鱼一不小心把某招聘网站ROS类工作都爬了一遍,结果真香~

大家好,我是小鱼,今天给大家介绍一个小鱼之前写的小爬虫,可以爬取机器人公司的招聘信息。数据是来自51job的,希望自己不会被抓哈!

之所以做这个的原因是老帮让小鱼找找国内做ROS的机器人公司有哪些?这个要去哪里找,肯定是去招聘网站,那里信息最全。

一开始打算手动复制粘贴的找,结果发现跟ROS机器人相关的有几千家。

毫不犹豫,小鱼选择了爬虫,先百度,然后东拼西凑出来了一个代码

完整代码已经上传:https://gitee.com/ohhuo/crawler-51job

1.爬虫部分代码如下:

def get_data(req_url):
  # time.sleep(0.5)
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
    'Accept-Language': 'zh-Hans-CN, zh-Hans;q=0.5'
  }
  resp = requests.get(req_url, headers=headers)
  resp.encoding = 'gbk' # 不加会产生中文乱码
  if resp.status_code == 200:
    return resp.text
  else:
    return None


def parse_data(response):
  company_name=re.findall(r'"company_name":"(.*?)"',response)  # 公司名称
  job_name=re.findall(r'"job_title":"(.*?)"',response)   #工作名称
  salary=re.findall(r'"providesalary_text":"(.*?)"',response)  #薪水待遇月薪
  work_area=re.findall(r'"workarea_text":"(.*?)"',response)  #工作地点
  company_type=re.findall(r'"companytype_text":"(.*?)"',response)  #公司类型
  issuedate=re.findall(r'"issuedate":"(.*?)"',response)[:-1]  #信息发布时间
  job_fuli=re.findall(r'"jobwelf":"(.*?)"',response)  #福利
  companysize=re.findall(r'"companysize_text":"(.*?)"',response)  #公司规模
  company_hangye=re.findall(r'"companyind_text":"(.*?)"',response)  #公司行业
  company_url=re.findall(r'"job_href":"(.*?)"',response)  #公司行业

print("开始请求"+url+"公司列表信息....")
resp_html = get_data(url)
print("公司列表请求完成开始解析公司信息数据.....")
res_list = parse_data(resp_html)

爬完了之后只有职位信息,职位介绍公司介绍没有,去看一看介绍,手动继续爬~
完成公司信息和岗位信息~~~

def get_job_info(name, urls):
    jobs_infos = []
    company_infos = []
    i=0
    for url in urls:
        print("开始采集 "+name[i]+" 信息")
        url = str(url).replace("\/","/")
        response = get_data(url)
        if response==None or str(url).find("jobs.51job.com")==-1:
          print("采集完成 "+name[i]+" 信息失败")
          jobs_infos.append("")
          company_infos.append("")
        else:
          soup = BeautifulSoup(response, 'lxml')
          for d in soup.find_all("div", class_="tmsg inbox"):
              company_infos.append(d.get_text().strip())
          for d in soup.find_all("div", class_="bmsg job_msg inbox"):
              job_info = ""
              for p in d.find_all("p"):
                  job_info += p.get_text().strip()
              jobs_infos.append(job_info.replace("岗位职责",""))
          # time.sleep(0.2)
          print("采集完成 "+name[i]+" 信息")
        i += 1

    return company_infos,jobs_infos

有了公司信息和岗位信息,但是岗位合不合适又要判断,非常的麻烦~

2.关键词分类

想到了之前搞过NLP,搞个分词,做个关键词筛选没问题
这里要感谢一位同学的代码。链接给忘记了,就不贴了~

import numpy as np
import jieba
import jieba.posseg as pseg


class TextRank(object):

    def __init__(self, sentence, window, alpha, iternum,filepath="dicts/stop_dict.txt"):
        self.sentence = sentence
        self.window = window
        self.alpha = alpha
        self.edge_dict = {}  # 记录节点的边连接字典
        self.iternum = iternum  # 迭代次数
        self.stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]
        self.user_dict = [line.strip()[:line.find(" ")] for line in open("dicts/user_dict.txt", 'r', encoding='utf-8').readlines()]

    def cutSentence(self):
        jieba.load_userdict('dicts/user_dict.txt')
        tag_filter = ['n', 'eng']
        seg_result = pseg.cut(self.sentence)
        self.word_list = [s.word for s in seg_result if s.flag in tag_filter and s.word not in self.stopwords]

    def createNodes(self):
        tmp_list = []
        word_list_len = len(self.word_list)
        for index, word in enumerate(self.word_list):
            if word not in self.edge_dict.keys():
                tmp_list.append(word)
                tmp_set = set()
                left = index - self.window + 1 
                right = index + self.window  
                if left < 0: left = 0
                if right >= word_list_len: right = word_list_len
                for i in range(left, right):
                    if i == index:
                        continue
                    tmp_set.add(self.word_list[i])
                self.edge_dict[word] = tmp_set


    def createMatrix(self):
        self.matrix = np.zeros([len(set(self.word_list)), len(set(self.word_list))])
        self.word_index = {}  
        self.index_dict = {}  

        for i, v in enumerate(set(self.word_list)):
            self.word_index[v] = i
            self.index_dict[i] = v
        for key in self.edge_dict.keys():
            for w in self.edge_dict[key]:
                self.matrix[self.word_index[key]][self.word_index[w]] = 1
                self.matrix[self.word_index[w]][self.word_index[key]] = 1
        # 归一化
        for j in range(self.matrix.shape[1]):
            sum = 0
            for i in range(self.matrix.shape[0]):
                sum += self.matrix[i][j]
            for i in range(self.matrix.shape[0]):
                self.matrix[i][j] /= sum

    # 根据textrank公式计算权重
    def calPR(self):
        self.PR = np.ones([len(set(self.word_list)), 1])
        for i in range(self.iternum):
            self.PR = (1 - self.alpha) + self.alpha * np.dot(self.matrix, self.PR)

    # 输出词和相应的权重
    def printResult(self):
        word_pr = {}
        for i in range(len(self.PR)):
            word_pr[self.index_dict[i]] = self.PR[i][0]
        res = sorted(word_pr.items(), key=lambda x: x[1], reverse=True)
        names = []
        pre = []
        for (name,grade) in res:
            if len(name)>1:
                if name in self.user_dict:
                    pre.append(name)
                else:
                    names.append(name)
        return pre+names,len(pre)

 

def getKeysList(infos):
    result = []
    grade = []
    for info in infos:
        tr = TextRank(info, 3, 0.85, 700)
        tr.cutSentence()
        tr.createNodes()
        tr.createMatrix()
        tr.calPR()
        r,g  = tr.printResult()
        result.append(r)
        grade.append(g)

    return result,grade

截个图,由于使用单线程还是比较慢的,搞定的结果存在的目录下的execl里面~~~
在这里插入图片描述
生成的表格很nice,就是去重没做,用execl处理一下就好,so easy~
在这里插入图片描述

好了,就这样小鱼就完成了任务,一共五百多家公司,手动复制不知道啥时候~~

3.安装使用

大家也可以动手跑一下代码,根据自己的兴趣看看目前社会上招聘什么样子的职位,小鱼后面也会进行分析,给大家搞个报表出来~!

最后是安装和使用方法:

git clone https://gitee.com/ohhuo/crawler-51job.git
cd crawler-51job
python main.py 

运行时报缺少什么库就安装什么库~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值