大家好,我是小鱼,今天给大家介绍一个小鱼之前写的小爬虫,可以爬取机器人公司的招聘信息。数据是来自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 = 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
运行时报缺少什么库就安装什么库~