Python3 + xpath + excel 实现对boss直聘网的爬取

一、项目简介

1.内容:抓取boss直聘网上广州地区的 python 相关工作的招聘信息,并且将招聘信息循环保存在excel表中

2.目标网站:https://www.zhipin.com/c101280100/?query=python&page=

3.使用软件:pycharm

4.使用版本:python3.7

5.涉及的python类库:requests、xlwt、lxml

二、具体思路

1.安装、导入相关的类库

import requests  #请求网页
import xlwt       #excel操作
from lxml import etree #xpath

2.确定网页,确定请求头,解决反爬机制。

#获取页面
def getPage():
    #请求头处理
    header = {
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) "
                     "AppleWebKit/537.36 (KHTML, like Gecko) "
                     "Chrome/63.0.3239.132 Safari/537.36"
    }
    #定义一个列表存放所有的html信息
    responses = []
    #循环抓取7页的html代码
    for page in range(1,8):
        url = "https://www.zhipin.com/c101280100/?query=python&page=" + str(page)
        response = requests.get(url,headers = header).text
        responses.append(response)
        print("第"+str(page)+"页读取保存成功")
    return str(responses)

3.解析网页,处理爬取到的数据。

#解释函数:运用xpath处理html
def parse(text):
    html = etree.HTML(text)  # 初始化 标准化
    #岗位
    jobs = html.xpath('//div[@class="job-title"]/text()')
    #地点
    place = html.xpath('//div[@class="info-primary"]/p/text()[1]')
    #工作经验
    workyear = html.xpath('//div[@class="info-primary"]/p/text()[2]')
    #学历要求
    xueli = html.xpath('//div[@class="info-primary"]/p/text()[3]')
    #工资
    salary = html.xpath('//div[@class="info-primary"]//span[@class="red"]/text()')
    #招聘企业
    company = html.xpath('//div[@class="company-text"]//a/text()')

    # zip() 打包为元组的列表  加上 list 才能转化为元组的列表
    jobs_data = list(zip(jobs,place,workyear,xueli,salary,company))
    # 第一行加上列名
    jobs_data.insert(0, ("岗位","地点","工作经验", "学历要求","薪资", "招聘企业"))
    # 调用保存为excel的函数
    save_to_excel("python", "python", jobs_data)

4.保存数据

#保存为excel文件
def save_to_excel(filename,sheet_name,data):

    f = xlwt.Workbook(encoding='utf-8')  #创建一个Workbook 设置编码
    # 第二参数表示是否可以覆盖单元格 其实是 Workbook实例化的一个参数,默认值为False
    sheet = f.add_sheet(sheet_name,cell_overwrite_ok=True)

    # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
    # 同时列出数据和数据下标,一般用在 for 循环当中。

    for row,row_data in enumerate(data):  #处理行
        for column,column_data in enumerate(row_data): #处理列
            sheet.write(row,column,str(column_data))
    f.save(filename + ".xls")

三、代码生成

#!/usr/bin/env python
#-*- coding:utf-8 -*-
#author : Only  time:2019/7/21 1020

"""
需求分析
1. 确定网址
2. 请求数据
3. 保存数据
"""
import requests
import xlwt
from lxml import etree #xpath

#获取页面
def getPage():
    #请求头处理
    header = {
        "user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) "
                     "AppleWebKit/537.36 (KHTML, like Gecko) "
                     "Chrome/63.0.3239.132 Safari/537.36"
    }
    #定义一个列表存放所有的html信息
    responses = []
    #循环抓取7页的html代码
    for page in range(1,8):
        url = "https://www.zhipin.com/c101280100/?query=python&page=" + str(page)
        response = requests.get(url,headers = header).text
        responses.append(response)
        print("第"+str(page)+"页读取保存成功")
    return str(responses)

#解释函数
def parse(text):
    html = etree.HTML(text)  # 初始化 标准化
    #岗位
    jobs = html.xpath('//div[@class="job-title"]/text()')
    #地点
    place = html.xpath('//div[@class="info-primary"]/p/text()[1]')
    #工作经验
    workyear = html.xpath('//div[@class="info-primary"]/p/text()[2]')
    #学历要求
    xueli = html.xpath('//div[@class="info-primary"]/p/text()[3]')
    #工资
    salary = html.xpath('//div[@class="info-primary"]//span[@class="red"]/text()')
    #招聘企业
    company = html.xpath('//div[@class="company-text"]//a/text()')

    # zip() 打包为元组的列表  加上 list 才能转化为元组的列表
    jobs_data = list(zip(jobs,place,workyear,xueli,salary,company))
    # 第一行加上列名
    jobs_data.insert(0, ("岗位","地点","工作经验", "学历要求","薪资", "招聘企业"))
    # 调用保存为excel的函数
    save_to_excel("python", "python", jobs_data)


#保存为excel文件
def save_to_excel(filename,sheet_name,data):
    f = xlwt.Workbook(encoding='utf-8')  #创建一个Workbook 设置编码
    # 第二参数表示是否可以覆盖单元格 其实是 Workbook实例化的一个参数,默认值为False
    sheet = f.add_sheet(sheet_name,cell_overwrite_ok=True)

    # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
    # 同时列出数据和数据下标,一般用在 for 循环当中。

    for row,row_data in enumerate(data):  #处理行
        for column,column_data in enumerate(row_data): #处理列
            sheet.write(row,column,str(column_data))
    f.save(filename + ".xls")


#主函数
if __name__ == '__main__':
    parse(getPage())

四、代码运行结果如下   一共抓取了186条广州Python招聘信息

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~此处省略一百条招聘数据~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

结论:工作经验  决定  薪资

发布了22 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43930694/article/details/96650281