python使用bs4爬取boss直聘静态页面


Posted in Python onOctober 10, 2020

思路:

1、将需要查询城市列表,通过城市接口转换成相应的code码

2、遍历城市、职位生成url

3、通过url获取列表页面信息,遍历列表页面信息

4、再根据列表页面信息的job_link获取详情页面信息,将需要的信息以字典data的形式存在列表datas里

5、判断列表页面是否有下一页,重复步骤3、4;同时将列表datas一直传递下去

6、一个城市、职位url爬取完后,将列表datas接在列表datas_list后面,重复3、4、5

7、最后将列表datas_list的数据,遍历写在Excel里面

知识点:

1、将response内容以json形式输出,解析json并取值

2、soup 的select()和find_all()和find()方法使用

3、异常Exception的使用

4、wldt创建编辑Excel的使用

import requests, time, xlwt
from bs4 import BeautifulSoup

class MyJob():
  def __init__(self, mycity, myquery):
    self.city = mycity
    self.query = myquery
    self.list_url = "https://www.zhipin.com/job_detail/?query=%s&city=%s&industry=&position="%(self.query, self.city)
    self.datas = []
    self.header = {
      'authority': 'www.zhipin.com',
      'method': 'GET',
      'scheme': 'https',
      'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
      'accept-encoding': 'gzip, deflate, br',
      'accept-language': 'zh-CN,zh;q=0.9',
      'cache-control': 'max-age=0',
      'cookie': 'lastCity=101210100;uab_collina=154408714637849548916323;toUrl=/;c=1558272251;g=-;l=l=%2Fwww.zhipin.com%2Fuser%2Flogin.html&r=; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1555852331,1556985726,1558169427,1558272251; __a=40505844.1544087205.1558169426.1558272251.41.14.4.31; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1558272385',
      'referer': 'https://www.zhipin.com/?ka=header-logo',
      'upgrade-insecure-requests': '1',
      'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
    }

  #将城市转化为code码
  def get_city(self,city_list):
    city_url = "https://www.zhipin.com/wapi/zpCommon/data/city.json" #获取城市
    json = requests.get(city_url).json()
    zpData = json["zpData"]["cityList"]
    list = []
    for city in city_list :
      for data_sf in zpData:
        for data_dq in data_sf["subLevelModelList"]:
          if city == data_dq["name"]:
             list.append(data_dq["code"])
    return list

  #获取所有页内容
  def get_job_list(self, url, datas):
    print(url)
    html = requests.get(url, headers=self.header).text
    soup = BeautifulSoup(html, 'html.parser')
    jobs = soup.select(".job-primary")
    for job in jobs:
      data = {}
      # 招聘id
      data["job_id"] = job.find_all("div", attrs={"class": "info-primary"})[0].find("a").get("data-jobid")
      # 招聘链接
      data["job_link"] = "https://www.zhipin.com" + job.find_all("div", attrs={"class": "info-primary"})[0].find("a").get("href")
      # 招聘岗位
      data["job_name"] = job.find_all("div", attrs={"class": "info-primary"})[0].find("div", attrs={"class": "job-title"}).get_text()
      # 薪资
      data["job_red"] = job.find_all("div", attrs={"class": "info-primary"})[0].find("span", attrs={"class": "red"}).get_text()
      # 地址 #工作年限 #学历
      data["job_address"] = job.find_all("div", attrs={"class": "info-primary"})[0].find("p").get_text().split(" ")
      # 企业链接
      data["job_company_link"] = job.find_all("div", attrs={"class": "info-company"})[0].find("a").get("href")
      # 企业信息
      data["job_company"] = job.find_all("div", attrs={"class": "info-company"})[0].find("p").get_text().split(" ")
      # boss链接
      data["job_publis_link"] = job.find_all("div", attrs={"class": "info-publis"})[0].find("img").get("src")
      # boos信息
      data["job_publis"] = job.find_all("div", attrs={"class": "info-publis"})[0].find("h3").get_text().split(" ")
      time.sleep(5)
      self.get_job_detail(data) # 获取job详情页内容
      print(data)
      datas.append(data) # 将某条job添加到datas中,直到将当前页添加完

    try:
      next_url = soup.find("div", attrs={"class": "page"}).find("a", attrs={"class": "next"}).get("href")
      #if next_url[-1] =="3": # 第二页自动抛异常
      if next_url in "javascript:;": # 最后一页自动抛异常
        raise Exception()
    except Exception as e:
      print("最后一页了;%s" % e)
      return datas # 返回所有页内容
    else:
      time.sleep(5)
      next_url = "https://www.zhipin.com" + next_url
      self.get_job_list(next_url, datas)
      return datas # 返回所有页内容

  #获取详情页内容
  def get_job_detail(self, data):
    print(data["job_link"])
    html = requests.get(data["job_link"], headers=self.header).text
    soup = BeautifulSoup(html, 'html.parser')
    # 招聘公司
    data["detail_content_name"] = soup.find_all("div", attrs={"class": "detail-content"})[0].find("div", attrs={"class": "name"}).get_text()
    # 福利
    data["detail_primary_tags"] = soup.find_all("div", attrs={"class": "info-primary"})[0].find("div", attrs={"class": "job-tags"}).get_text().strip()
    # 招聘岗位
    data["detail_primary_name"] = soup.find_all("div", attrs={"class": "info-primary"})[0].find("h1").get_text()
    # 招聘状态
    data["detail_primary_status"] = soup.find_all("div", attrs={"class": "info-primary"})[0].find("div", attrs={"class": "job-status"}).get_text()
    # 薪资
    data["detail_primary_salary"] = soup.find_all("div", attrs={"class": "info-primary"})[0].find("span", attrs={"class": "salary"}).get_text()
    # 地址 #工作年限 #学历
    data["detail_primary_address"] = soup.find_all("div", attrs={"class": "info-primary"})[0].find("p").get_text()
    # 工作地址
    data["detail_content_address"] = soup.find_all("div", attrs={"class": "detail-content"})[0].find("div", attrs={"class": "location-address"}).get_text()
    # 职位描述
    data["detail_content_text"] = soup.find_all("div", attrs={"class": "detail-content"})[0].find("div", attrs={"class": "text"}).get_text().strip().replace(";", "\n")
    # boss名字
    data["detail_op_name"] = soup.find_all("div", attrs={"class": "detail-op"})[1].find("h2", attrs={"class": "name"}).get_text()
    # boss职位
    data["detail_op_job"] = soup.find_all("div", attrs={"class": "detail-op"})[1].find("p", attrs={"class": "gray"}).get_text().split("·")[0]
    # boss状态
    data["detail_op_status"] = soup.find_all("div", attrs={"class": "detail-op"})[1].find("p", attrs={"class": "gray"}).get_text().split("·")[1]

  #将获取的数据写入Excel
  def setExcel(self, datas_list):
    book = xlwt.Workbook(encoding='utf-8')
    table = book.add_sheet("boss软件测试")
    table.write(0, 0, "编号")
    table.write(0, 1, "招聘链接")
    table.write(0, 2, "招聘岗位")
    table.write(0, 3, "薪资")
    table.write(0, 4, "地址")
    table.write(0, 5, "企业链接")
    table.write(0, 6, "企业信息")
    table.write(0, 7, "boss链接")
    table.write(0, 8, "boss信息")
    table.write(0, 9, "detail详情")
    i = 1
    for data in datas_list:
      table.write(i, 0, data["job_id"])
      table.write(i, 1, data["job_link"])
      table.write(i, 2, data["job_name"])
      table.write(i, 3, data["job_red"])
      table.write(i, 4, data["job_address"])
      table.write(i, 5, data["job_company_link"])
      table.write(i, 6, data["job_company"])
      table.write(i, 7, data["job_publis_link"])
      table.write(i, 8, data["job_publis"])

      table.write(i, 10, data["detail_content_name"])
      table.write(i, 11, data["detail_primary_name"])
      table.write(i, 12, data["detail_primary_status"])
      table.write(i, 13, data["detail_primary_salary"])
      table.write(i, 14, data["detail_primary_address"])
      table.write(i, 15, data["detail_content_text"])
      table.write(i, 16, data["detail_op_name"])
      table.write(i, 17, data["detail_op_job"])
      table.write(i, 18, data["detail_op_status"])
      table.write(i, 19, data["detail_primary_tags"])
      table.write(i, 20, data["detail_content_address"])
      i += 1
    book.save(r'C:\%s_boss软件测试.xls' % time.strftime('%Y%m%d%H%M%S'))
    print("Excel保存成功")

if __name__ == '__main__':
  city_list = MyJob("","").get_city(["杭州"])
  query_list = ["软件测试", "测试工程师"]
  datas_list = []
  for city in city_list:
    for query in query_list:
      myjob = MyJob(city, query)
      datas = myjob.get_job_list(myjob.list_url, myjob.datas)
      datas_list.extend(datas)
  myjob.setExcel(datas_list)

以上就是python使用bs4爬取boss直聘静态页面的详细内容,更多关于python 爬取boss直聘的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现获取序列中最小的几个元素
Sep 25 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
Python使用QRCode模块生成二维码实例详解
Jun 14 Python
解决python中 f.write写入中文出错的问题
Oct 31 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
Django更新models数据库结构步骤
Apr 01 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 Python
Python依赖包迁移到断网环境操作
Jul 13 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
python进行二次方程式计算的实例讲解
Dec 06 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 Python
通过案例解析python鸭子类型相关原理
Oct 10 #Python
通过实例解析python subprocess模块原理及用法
Oct 10 #Python
如何使用python自带IDLE的几种方法
Oct 10 #Python
Python的3种运行方式:命令行窗口、Python解释器、IDLE的实现
Oct 10 #Python
python如何利用Mitmproxy抓包
Oct 10 #Python
python批量生成条形码的示例
Oct 10 #Python
python如何对链表操作
Oct 10 #Python
You might like
php提示undefined index的几种解决方法
2012/05/21 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
PHP7新功能总结
2019/04/14 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
一个JavaScript继承的实现
2006/10/24 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
jQuery学习笔记(1)--用jQuery实现异步通信(用json传值)具体思路
2013/04/08 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
微信小程序实现订单倒计时
2020/11/01 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
Python实用日期时间处理方法汇总
2015/05/09 Python
Python安装第三方库的3种方法
2015/06/21 Python
Python实现包含min函数的栈
2016/04/29 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
python读写csv文件方法详细总结
2019/07/05 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
军训心得体会
2013/12/31 职场文书
领导党性分析材料
2014/02/15 职场文书
小学开学典礼主持词
2014/03/19 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
2015年班组长工作总结
2015/04/10 职场文书
领导干部失职检讨书
2015/05/05 职场文书
暖春观后感
2015/06/08 职场文书