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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
python基础教程之循环介绍
Aug 29 Python
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
python3爬取淘宝信息代码分析
Feb 10 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
pytest中文文档之编写断言
Sep 12 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
Python 实现一个计时器
Jul 28 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
python爬虫 requests-html的使用
Nov 30 Python
Python datetime模块的使用示例
Feb 02 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 获取一个月第一天与最后一天的代码
2010/05/16 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
2015/06/09 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
JS前端加密算法示例
2016/12/22 Javascript
解决vue-cli中stylus无法使用的问题方法
2017/06/19 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
python多线程抓取天涯帖子内容示例
2014/04/03 Python
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
python matplotlib实现双Y轴的实例
2019/02/12 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
python:动态路由的Flask程序代码
2019/11/22 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
Python使用uuid库生成唯一标识ID
2020/02/12 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
用Python进行websocket接口测试
2020/10/16 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
导游词之澳门妈祖庙
2019/12/19 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
Python机器学习之决策树和随机森林
2021/07/15 Javascript
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android