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

227 阅读3分钟

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

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

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

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

完整代码已经上传:gitee.com/ohhuo/crawl…

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~

结果excel

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

3.安装使用

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

最后是安装和使用方法:

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

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

刚刚小鱼爬了一下关于ROS的,最终结果发到鱼群了,有需要的可以加群交流哦~

鱼香ROS公众号图片.png