from selenium import webdriver
import time
import re
import pandas as pd
import os

 在爬取的过程中可能会有登陆弹窗,要先定义一个处理弹窗的函数

def close_windows():#如果有登录弹窗,就关闭try:time.sleep(0.5)if dr.find_element_by_class_name("jconfirm").find_element_by_class_name("closeIcon"):dr.find_element_by_class_name("jconfirm").find_element_by_class_name("closeIcon").click()except BaseException as e:print('close_windows,没有弹窗',e)

 第二部分就是爬取部分,这里爬取维度为11列,基本上包含了职位的大部分信息

def get_current_region_job(k_index):flag = 0# page_num_set=0#每区获取多少条数据,对30取整df_empty = pd.DataFrame(columns=['岗位', '地点', '薪资', '工作经验', '学历', '公司名称', '技能','工作福利','工作类型','融资情况','公司规模'])while (flag == 0):# while (page_num_set<151)&(flag == 0):#每次只能获取150条信息time.sleep(0.5)close_windows()job_list = dr.find_elements_by_class_name("job-primary")for job in job_list:#获取当前页的职位30条job_name = job.find_element_by_class_name("job-name").text# print(job_name)job_area = job.find_element_by_class_name("job-area").text# salary = job.find_element_by_class_name("red").get_attribute("textContent")  # 获取薪资salary_raw = job.find_element_by_class_name("red").get_attribute("textContent")  # 获取薪资salary_split = salary_raw.split('·')  # 根据·分割salary = salary_split[0]  # 只取薪资,去掉多少薪# if re.search(r'天', salary):#     continueexperience_education = job.find_element_by_class_name("job-limit").find_element_by_tag_name("p").get_attribute("innerHTML")# experience_education_raw = '1-3年<em class="vline"></em>本科'experience_education_raw = experience_educationsplit_str = re.search(r'[a-zA-Z =<>/"]{23}', experience_education_raw)  # 搜索分割字符串<em class="vline"></em># print(split_str)experience_education_replace = re.sub(r'[a-zA-Z =<>/"]{23}', ",", experience_education_raw)  # 分割字符串替换为逗号# print(experience_education_replace)experience_education_list = experience_education_replace.split(',')  # 根据逗号分割# print('experience_education_list:',experience_education_list)if len(experience_education_list)!=2:print('experience_education_list不是2个,跳过该数据',experience_education_list)breakexperience = experience_education_list[0]education = experience_education_list[1]# print(experience)# print(education)company_type = job.find_element_by_class_name("company-text").find_element_by_tag_name("p").get_attribute("innerHTML")company_type_size_row=company_typesplit_str_2=re.search(r'[a-zA-Z =<>/"]{23}', company_type_size_row)# print(split_str_2)# print("split2------------------------------------------------------")company_size_replace= re.sub(r'[a-zA-Z =<>/"]{23}', ",", company_type_size_row)# print(company_size_replace)company_size_list=company_size_replace.split(',')# print(company_size_list)if len(company_size_list) != 3:print('company_size_list不是3个,跳过该数据', company_size_list)breakcompany_direct_info = company_size_list[0].split(">")[1]company_salary_info = company_size_list[1].split(">")[1]company_size_info=company_size_list[2]company = job.find_element_by_class_name("company-text").find_element_by_class_name("name").textskill_list = job.find_element_by_class_name("tags").find_elements_by_class_name("tag-item")skill = []job_advantage=job.find_element_by_class_name("info-desc").textfor skill_i in skill_list:skill_i_text = skill_i.textif len(skill_i_text) == 0:continueskill.append(skill_i_text)# print(job_name)# print(skill)df_empty.loc[k_index, :] = [job_name, job_area, salary, experience, education, company, skill,job_advantage,company_direct_info,company_salary_info,company_size_info]print(df_empty.loc[k_index, :])k_index = k_index + 1# page_num_set=page_num_set+1print("已经读取数据{}条".format(k_index))close_windows()try:#点击下一页cur_page_num=dr.find_element_by_class_name("page").find_element_by_class_name("cur").text# print('cur_page_num',cur_page_num)#点击下一页element = dr.find_element_by_class_name("page").find_element_by_class_name("next")dr.execute_script("arguments[0].click();", element)time.sleep(1)# print('点击下一页')new_page_num=dr.find_element_by_class_name("page").find_element_by_class_name("cur").text# print('new_page_num',new_page_num)if cur_page_num==new_page_num:flag = 1breakexcept BaseException as e:print('点击下一页错误',e)breakprint(df_empty)if os.path.exists("ai数据.csv"):#存在追加,不存在创建df_empty.to_csv('ai数据.csv', mode='a', header=False, index=None, encoding='gb18030')else:df_empty.to_csv("ai数据.csv", index=False, encoding='gb18030')return k_index

 第三部分定义自动化爬取部分 这里按照全国14个热门城市爬取 若想爬取某个固定城市,需要把for循环去掉,去网站上找到对应城市编码,剪贴url即可

def main():# 打开浏览器# dr = webdriver.Firefox()global drdr = webdriver.Chrome()# dr = webdriver.Ie()# # 后台打开浏览器# option=webdriver.ChromeOptions()# option.add_argument('headless')# dr = webdriver.Chrome(chrome_options=option)# print("打开浏览器")# 将浏览器最大化显示dr.maximize_window()# 转到目标网址dr.get("https://www.zhipin.com/job_detail/?query=人工智能&city=100010000&industry=&position=")#全国# dr.get("https://www.zhipin.com/c101010100/?query=人工智能&ka=sel-city-101010100")#北京print("打开网址")time.sleep(5)k_index = 0#数据条数、DataFrame索引flag_hot_city=0for i in range(3,17,1):# print('第',i-2,'页')# try:# 获取城市close_windows()hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")close_windows()# hot_city_list[i].click()#防止弹窗,改为下面两句# element_hot_city_list_first = hot_city_list[i]dr.execute_script("arguments[0].click();", hot_city_list[i])# 输出城市名close_windows()hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")print('城市:{}'.format(i-2),hot_city_list[i].text)time.sleep(0.5)# 获取区县for j in range(1,50,1):# print('第', j , '个区域')# try:# close_windows()# hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")# 在这个for循环点一下城市,不然识别不到当前页面已经更新了close_windows()hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")close_windows()# hot_city_list[i].click()#防止弹窗,改为下面dr.execute_script("arguments[0].click();", hot_city_list[i])#输出区县名称close_windows()city_district = dr.find_element_by_class_name("condition-district").find_elements_by_tag_name("a")if len(city_district)==j:print('遍历完所有区县,没有不可点击的,跳转下一个城市')breakprint('区县:',j, city_district[j].text)# city_district_value=city_district[j].text#当前页面的区县值# 点击区县close_windows()city_district=  dr.find_element_by_class_name("condition-district").find_elements_by_tag_name("a")close_windows()# city_district[j].click()]#防止弹窗,改为下面两句# element_city_district = city_district[j]dr.execute_script("arguments[0].click();", city_district[j])#判断区县是不是点完了close_windows()hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")print('点击后这里应该是区县', hot_city_list[1].text)#如果是不限,说明点完了,跳出hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")print('如果点完了,这里应该是不限:',hot_city_list[1].text)hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")if hot_city_list[1].text == '不限':print('当前区县已经点完了,点击下一个城市')flag_hot_city=1breakclose_windows()k_index = get_current_region_job(k_index)#获取职位,爬取数据# 重新点回城市页面,再次获取区县。但此时多了区县,所以i+1close_windows()hot_city_list = dr.find_element_by_class_name("condition-city").find_elements_by_tag_name("a")close_windows()# hot_city_list[i+1].click()#防止弹窗,改为下面两句# element_hot_city_list_again = hot_city_list[i+1]dr.execute_script("arguments[0].click();", hot_city_list[i+1])# except BaseException as e:#     print('main的j循环-获取区县发生错误:', e)#     close_windows()time.sleep(0.5)# except BaseException as e:#     print('main的i循环发生错误:',e)#     close_windows()time.sleep(0.5)# 退出浏览器dr.quit()# p1.close()

最后调用main即可,爬取结果如下:

本文改编网上selenium爬取代码,增加了数据的维度,若有侵权,请联系我删除谢谢

selenium自动化爬取Boss直聘职位数据 按照热门城市相关推荐

  1. xhr请求python_python爬取boss直聘职位数据,并保存到本地

    基本环境配置 1.requests,用于模拟http/https请求 安装: pip install requests 2.beautifulsoup4,用于解析网页,得出我们想要的内容. 安装: p ...

  2. 使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)

    使用python爬取BOSS直聘岗位数据并做可视化 结果展示 首页 岗位信息 岗位详情 薪资表 学历需求 公司排名 岗位关键词 福利关键词 代码展示 爬虫代码 一.导入库 二.爬取数据 1.爬取数据代 ...

  3. Python爬虫:爬取“Boss直聘”招聘数据

    hello 大家好~ 又是元气满满的一天呢~ 既然元气满满,要不要搞点事情,譬如说,爬取"Boss直聘"(此处模仿歪果仁讲话更带感)的招聘数据~ 说走咱就走,说干咱就干~" ...

  4. python爬取boss直招_简易python爬虫爬取boss直聘职位,并写入excel

    1,默认城市是杭州,代码如下 #! -*-coding:utf-8 -*- from urllib import request, parse from bs4 import BeautifulSou ...

  5. boss直聘python_简易python爬虫爬取boss直聘职位,并写入excel

    #! -*-coding:utf-8 -*- from urllib import request, parse from bs4 import BeautifulSoup import dateti ...

  6. scrapy框架爬取Boss直聘,数据存入mysql

    自从上次用了scrapy爬取豆瓣电影后,发现scrapy除了入门相对request较难外,各方面都挺好的,速度很快,还有各个功能模块,以及django类似的各种中间件组成一个完善的系统框架,需要一点一 ...

  7. Python爬虫入门教程32:爬取boss直聘招聘数据并做可视化展示

    前言

  8. 【数据分析项目实战】Python爬取BOSS直聘岗位和数据分析

    说明:这是一个数据分析项目全流程(附带项目实例),本篇教程来源于网络,胖哥对此进行了完整的梳理,并把用到的数据+代码完全奉上.如需数据+完整代码可以直接到文章最后获取. 这里面的数据,我只爬取了部分, ...

  9. python爬虫-爬取boss直聘的职位信息

    爬取boss直聘的相应的职位信息: 一个同学今天想找工作,问我有什么好单位,关键我也不清楚,于是我去各大招聘网站搜索了下,有很多招聘信息,看的我眼花缭乱,刚看完的职位,忘记收藏又过去搜索,感觉太麻烦, ...

最新文章

  1. 解决linux ssh客户端SSH连接linux服务器很慢的问题
  2. Python 调用有道翻译api接口翻译外文网站的整篇西班牙文实战演示
  3. MAPREDUCE的实战案例
  4. tuxedo连接mysql_TUXEDO与INFORMIX数据库的互连
  5. wxWidgets:进程间通信
  6. C++ Primer Plus 笔记第十章
  7. 微擎框架小程序 入口
  8. android 系统 ---(1) 框架的代码组织介绍
  9. sqlplus下无法shutdown情况下不妨试试crsctl stop crs
  10. ELK温度监控--lmsensorsbeat
  11. 什么是一维表 什么是二维表
  12. matlab用图像,Matlab常用图像操作
  13. 【计算机网络】计算机网络总结
  14. n条线段可以组成多少种三角形
  15. Leetcode刷题java之3. 无重复字符的最长子串
  16. SGMII光模块知识百科
  17. 从零开始做远控 第五篇 屏幕监控
  18. 【干货篇】调用其他系统http接口超时了,如何处理,方案汇总
  19. i am freshman
  20. 个人移动设备(BYOD):中小企业应知道的五项移动设备威胁

热门文章

  1. (02)Cartographer源码无死角解析-(32) LocalTrajectoryBuilder2D::AddRangeData()→点云的体素滤波
  2. 最佳化三维建模与重构中的神经网络先验
  3. 计算机技术水平考核试卷带答案,中小学教师计算机技术水平考核试卷笔试题带答案...
  4. Android使用SoundPool播放音效实例详解
  5. ospf状态机-通俗易懂的小故事
  6. 远程删除用户手机照片?拼多多回应
  7. 阿里云-RPA-2-第一个PRA程序
  8. 吹塑机是什么?它的用途?
  9. jQuery获取(设置)自定义属性值
  10. Web服务小试——天气预报