基于python的-使用正则爬取智联招聘网

#coding:utf-8
import re
from urllib import request,parse
# xlwt 操作excel表格
import xlwt
from random import choice

'''
https://sou.zhaopin.com/jobs/searchresult.ashx?kw=python&sm=0&p=1
https://sou.zhaopin.com/jobs/searchresult.ashx?jl=北京%2B上海%2B广州%2B深圳%2B杭州&kw=python&p=1
jl 工作地点
kw 搜索关键字
p  页码
'''
"""
    1.初始化函数
        kw搜索关键词,基础的url地址,请求头,用来记录html源代码属性,totai_page总页码
    2.start函数
        爬虫的启动函数
    3.get_html函数
        根据url地址,获取html源代码,转换为str类型,并赋值给self.html
    4.get_total函数
html源代码中,根据正则提取职位总个数,计算总页码,math.ceil()向上取整
    5.parse_info函数
        根据总页码,获取每一页的html源代码,根据正则提取职位信息,并对数据进行简单的清洗工作
        将数据存储表格中
    6.filter函数
        将正则匹配到的数据进行清洗,把多余的数据剔除
"""


# 智联招聘爬虫类
class ZLSpider(object):

    def __init__(self, kw, citys):
        data = {
            'jl': '+'.join(citys),
            'kw': kw,
        }
        # 记录搜索关键词
        self.kw = kw
        # 编码参数
        data = parse.urlencode(data)
        # 拼接完整地址
        self.url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?' + data
        # 请求头列表
        self.UserAgents = [
            'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',
            'Mozilla/5.0 (Windows NT 10; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0',
            'Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13'
        ]
        # 声明html属性 记录html源代码
        self.html = ''

        # 将数据中的特殊字符去除


    # 发送请求的函数
    def get_html(self, url):
        # 创建请求对象,随机取出请求头
        # parse.urlencode url进行编码
        req = request.Request(
            url,
            headers={
            'User-Agent': choice(self.UserAgents)
        })
        response = request.urlopen(req)
        self.html = response.read().decode('utf-8')

    def parse_total(self):
        # 解析职位总个数,计算总页数
        pattern = re.compile('<span.*?em>(.*?)</em>', re.S)
        rs = re.search(pattern, self.html)
        # 总职位数 转换整数
        total_zw = int(rs.group(1))
        # 计算总页数
        import math
        # ceil()向上取整
        total_page = math.ceil(total_zw/60)
        print('共有{}个职位信息,{}'.format(total_zw, total_page))


    # 解析每一页的职位信息
    def parse_info(self):
        workbook = xlwt.Workbook(encoding='utf-8')
        sheet = workbook.add_sheet('python职位表')
        sheet.write(0, 0, '职位名称')
        sheet.write(0, 1, '公司名称')
        sheet.write(0, 2, '最低月薪')
        sheet.write(0, 3, '最高月薪')
        sheet.write(0, 4, '工作地点')
        sheet.write(0, 5, '发布日期')
        # 向表格中写入数据时的行号
        count = 1
        for page in range(1,11):
            print('正在爬取第{},请稍后...'.format(page))
            # 拼接带页码的url地址
            url = self.url+'&p={}'.format(page)
            self.get_html(url)
            pattern = re.compile('<table.*?class="newlist.*?<td class="zwmc.*?<a.*?>(.*?)</a>.*?class="gsmc.*?<a.*?>(.*?)</a>.*?class="zwyx.*?>(.*?)</td>.*?class="gzdd.*?>(.*?)</td.*?class="gxsj.*?>(.*?)</td>',re.S)
            res = re.findall(pattern, self.html)
            for s in res:
                rs_list = self.filter_data(s)
                sheet.write(count, 0, rs_list[0])
                sheet.write(count, 1, rs_list[1])
                # 把职位月薪分成最低和最高
                if '-' in rs_list[2]:
                    max_money = rs_list[2].split('-')[1]
                    min_money = rs_list[2].split('-')[0]
                else:
                    max_money = min_money = '面议'
                sheet.write(count, 2, min_money)
                sheet.write(count, 3, max_money)
                sheet.write(count, 4, rs_list[3])
                sheet.write(count, 5, rs_list[4])
                count += 1
        workbook.save(self.kw+'智联职位信息.xls')


    def filter_data(self, info):
        # 元祖转换为列表
        rs_list = list(info)
        rs_list[0] = re.sub(re.compile('<.*?>|&nbsp;'), '', info[0])
        rs_list[1] = re.sub(re.compile('<.*?>'), '', info[1])
        rs_list[-1] = re.sub(re.compile('<.*?>|&nbsp;'), '', info[-1])
        return rs_list

    # 启动爬虫函数
    def start(self):
        self.get_html(self.url)
        self.parse_total()
        self.parse_info()

if __name__ == '__main__':

    kw = input('请输入要查询的职位名称:')
    citys = []
    while len(citys) < 5:
        city = input('请输入查询的城市,最多5(q结束):')
        if city == 'q':
            break
        citys.append(city)
    zl = ZLSpider(kw, citys)
    zl.start()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值