爬取某招聘网站的信息

没做过招聘,我不清楚是否存在这种情况:公司不准备招人,但是却在招聘网站上挂了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")

 

posted @ 2016-06-13 16:14  dongdonggeorge  阅读(2081)  评论(0编辑  收藏  举报