爬取某招聘网站的信息
没做过招聘,我不清楚是否存在这种情况:公司不准备招人,但是却在招聘网站上挂了N个岗位,给人一种正在招聘的假象。。。为了避免这种情况,我写了一个脚本,统计某一关键词的岗位数量和具体岗位信息,然后每天随机运行一下该脚本,如果数量增加,说明有新岗位出现,这家公司“真的”在招聘!
脚本有几个注意点:1. 编码有些特殊;2. 51job每页只展现50条搜索记录,所以涉及到翻页。
#!/usr/bin/env python # coding: utf-8 import requests import re import csv import datetime import sys # 51job使用gbk编码 reload(sys) sys.setdefaultencoding('gbk') head = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" } time = datetime.datetime.now() current = time.strftime('%Y-%m-%d %H_%M_%S') # 网站每页只能展示50条记录, 所以要获取页数; 这里得到的页数比正常的多2页,因为后续函数用到range处理起来特殊点 def getPage(keyword): url = "http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea=080200%%2C00&funtype=0000&industrytype=00&" \ "keyword=%s&keywordtype=2&lang=c&stype=2&postchannel=0000&fromType=1&confirmdate=9" % keyword r = requests.get(url, headers=head) r.encoding = r.apparent_encoding content = r.text regexp_count = ur"共(.*?)条职位" pattern_count = re.compile(regexp_count, re.M) result_count = re.findall(pattern_count, content) page_count = int(result_count[0]) / 50 + 2 return result_count, page_count # return ([u'128'], 4) # 获取职位数,职位名称,公司名称 def getJobByKeyword(keyword): result_details = [] for p in range(1,getPage(keyword)[1]): # 此处第一行有两个连续的百分号,我理解第一个起到转义的作用 url = "http://search.51job.com/jobsearch/search_result.php?fromJs=1&jobarea=080200%%2C00&funtype=0000&industrytype=00&" \ "keyword=%s&keywordtype=2&" \ "curr_page=%d&lang=c&stype=2&postchannel=0000&fromType=1&confirmdate=9" % ( keyword, p ) r = requests.get(url, headers=head) # r.encoding = ISO-8859-1, 好奇怪的编码,查了资料加了下面这行确保结果不会出现乱码 r.encoding = r.apparent_encoding content = r.text regexp_details = r'<span>\s+<a target="_blank" title="(.*?)" href="(.*?)".*?title="(.*?)"' pattern_details = re.compile(regexp_details, re.S) result_details.append(re.findall(pattern_details, content)) return result_details # [ [(u'岗位名称1', u'公司名称1, url1), ..., (u'岗位名称50', u'公司名称50', url50)], [], [], ... ] # 将职位名称,公司名称输出到文件 def exportAsCsv(keyword): print keyword + u"岗位数:" + getPage(keyword)[0][0] csvfile = file(current + "_" + keyword + ".csv", 'ab') writer = csv.writer(csvfile) for item1 in getJobByKeyword(keyword): for item2 in item1: writer.writerow([item2[2], item2[0], item2[1]]) exportAsCsv("microsoft")