​失踪人口回归了!由于一直在爬虫,遇到的坑比较多,先大致汇报下

1、获取全国所有企业

2、通过企查查补充企业信息

3、爬虫boss直聘获取公司及职位信息

本次先说爬虫boss直聘

目的:

获取指定城市下的指定行业的招聘公司及招聘职位信息

一、试错阶段

尝试使用了requests,selenium,pyppeteer,发现都不能正常访问boss直聘,厉害了我的老板!

于是只能采用puppeteer,因第一次使用puppeteer,也是第一次使用nodejs,代码规范和操作可能多有不妥之处,请您见谅。

二、爬虫注意点

1、公司名称重名问题(去重问题):

搜索Python搜到了公司A,Java也搜到了公司A,那么我只需要从一个入口进来,就会将该公司下的所有职位获取,即获取了Python,就不用获取Java的

考虑到公司名称相同,地点不同的原因,就是两个公司招聘信息,

公司A,在北京招聘名称为公司A,在上海招聘也叫公司A

这里通过记录公司详情的URL进行记录。

本来是想通过redis进行记录去重,发现redis是回调函数,不满足需求,mysql也是,智能才去记录到文件的形式。

2、页面跳转问题

意图通过对页面的点击操作,进行一步步获取信息,但是在实践过程中发现,跳转后页面会一直处于加载的卡死状态。

最后选择了通过一步步获取url,单纯加载url的形式进行获取信息。

三、获取城市code

https://www.zhipin.com/job_detail/?query=Python&city=101010100&industry=&position=

1、通过访问boss直聘的url,发现城市是通过citycode定位的

// 城市与城市编码的转换
function main(city, job){// 汉字 转 拼音// var pinyin = require('fast-pinyin');// var output = pinyin(city);// var firstChar = output[0][0]// console.log("城市:" + output[0][0]);const originData = require('./city.json');let city_code = nullif (city == "全国"){ city_code = "100010000";}elsefor (var province_info of originData){ var subLevelModelList = province_info["subLevelModelList"]for (var city_info of subLevelModelList){ if (city_info["name"] == city)city_code = city_info["code"];}}console.log("找到城市代码:" + city_code);get_company(city_code, job)}

city.json:记录的是城市与城市code的对应关系,文件来自boss直聘请求文件

四、获取所有企业

通过搜索访问,获取该地区该关键词的所有企业名称

var next_page;
async function get_company(city_code, key_words){console.log('crawler start to visit the target address');/* 爬虫的目标链接地址: boss*/var url = `https://www.zhipin.com/c${city_code}/?query=${key_words}&page=1&ka=page-1`;/* dumpio 是否将浏览器进程stdout和stderr导入到process.stdout和process.stderr中 */const browser = await puppeteer.launch({// headless:false,args: ['--no-sandbox'],dumpio: false,// args:['--proxy-server=http://47.98.154.206:3008']});const page = await browser.newPage();await page.evaluateOnNewDocument(() => {Object.defineProperty(navigator, 'webdriver', {get: () => undefined,});});// 该地区 该类别的所有公司var company_info = []while (url != null && url.length > 20){await page.goto(url, {waitUntil: 'networkidle2'});await sleep(0);const result = await page.evaluate(() => {let data = []; let elements = document.querySelectorAll('#main > div > div.job-list > ul > li'); //获取所有的li for (var element of elements){ // 循环 let title = element.querySelector('div > div.info-primary > div.info-company > div > h3 > a').innerHTML; let url = element.querySelector('div > div.info-primary > div.info-company > div > h3 > a').href; //抓取链接(href)属性 data.push({title, url}); // 存入数组}return data;});for (var temp of result){ // 循环 company_info.push(temp); // 存入数组}//下一页let next_page;if (result.length < 30) next_page = null;elsevar element_next_page = await page.$("#main > div > div.job-list > div.page > a.next");if (element_next_page)next_page = await page.$eval('#main > div > div.job-list > div.page > a.next', ele=>ele.href);elsenext_page = nullurl = next_page}//  page.close();// 获取搜索到的所有企业信息// 数组去重let new_company_info = deduplication(company_info)

五、公司的招聘信息

通过获取所有公司详情后,同时也获取了该公司的所有招聘信息

注意:招聘职位可能为(0),但下面会推荐相应职位,推荐的是不可取的

  company_all_job = company_url_value.replace("gongsi", "gongsir")company_all_job = company_all_job.split("?")[0] + "?ka=company-jobs"var company_job_urls = []while ( company_all_job != null && company_all_job.length > 19){await page2.goto(company_all_job, {waitUntil: 'networkidle2'});await sleep(0);job_count = await page2.$eval('#main > div.company-banner > div > div.company-tab > a.cur', ele=>ele.innerText);if (job_count.includes("(0)")){console.log("在招职位为0")company_all_job = null}else{const jobs_urls = await page2.evaluate(() => {let data = []; let elements = document.querySelectorAll('div.job-list >ul >li'); //获取所有的li for (var element of elements){ // 循环 let url = element.querySelector('a').href; //抓取链接(href)属性 data.push(url); // 存入数组}return data;});for (var temp of jobs_urls){ // 循环 company_job_urls.push(temp); // 存入数组}//下一页let next_job;var job_next_page = null;job_next_page = await page2.$("#main > div.job-box.company-job > div.inner.home-inner > div.job-list > div > a.next");if (job_next_page)next_job = await page2.$eval('#main > div.job-box.company-job > div.inner.home-inner > div.job-list > div > a.next', ele=>ele.href);elsenext_job = nullcompany_all_job = next_job}}console.log("职位信息:\n", company_job_urls)console.log("职位信息个数:\n", company_job_urls.length)page2.close()```

六、获取岗位信息及入库

拿到具体岗位连接后,通过访问就可以直接获取岗位信息,代码就不附加了

信息入库采用的是mysql,在入库的时候,同样做了职位的url查重处理,如果已存在则不再存储,避免重复存储。

最后发现并不能获取所有相应信息,因为职位搜索只显示前10页,公司招聘职位只显示前30页。如有童鞋有解决办法,望留言讨论。

上面是获取公司信息和职位信息,但公司信息简单,关键信息没有。

下一篇更新:无账号无限制获取企查查信息

最新puppeteer爬虫boss直聘招聘公司及职位信息相关推荐

  1. python爬取boss直聘招聘信息_Python爬虫实战-抓取boss直聘招聘信息

    Python Python开发 Python语言 Python爬虫实战-抓取boss直聘招聘信息 实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Pyth ...

  2. goquery爬虫Boss直聘信息

    title: goquery爬虫Boss直聘信息 tags: go,goquery author: Clown95 背景 Hello小伙伴们,在之前的文章中,我们对go的爬虫库goquery进行了简单 ...

  3. 基于‘BOSS直聘招聘信息’分析企业到底需要什么样的PHPer

    基于'BOSS直聘招聘信息'分析企业到底需要什么样的PHPer 前两篇文章都没看,好意思直接看结果? Python爬虫框架Scrapy实战 - 抓取BOSS直聘招聘信息 Pyhton爬虫实战 - 抓取 ...

  4. python爬取招聘信息_python 爬取boss直聘招聘信息实现

    原标题:python 爬取boss直聘招聘信息实现 1.一些公共方法的准备 获取数据库链接: importpymysql ''' 遇到不懂的问题?Python学习交流群:821460695满足你的需求 ...

  5. python爬取boss直聘招聘信息_Python 爬取boss直聘招聘信息!

    原标题:Python 爬取boss直聘招聘信息! 1.一些公共方法的准备 获取数据库链接: importpymysql ''' 遇到不懂的问题?Python学习交流群:821460695满足你的需求, ...

  6. python爬虫招聘-Python爬虫实战-抓取boss直聘招聘信息

    实战内容:爬取boss直聘的岗位信息,存储在数据库,最后通过可视化展示出来 PS注意:很多人学Python过程中会遇到各种烦恼问题,没有人帮答疑容易放弃.为此小编建了个Python全栈免费答疑.裙 : ...

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

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

  8. python爬取boss直聘招聘信息_Python笔记-爬取Boss直聘的招聘信息

    2018-05-09笔记: 最近迷上了爬虫,爬取招聘信息,存在MongoDB上 代码思路和上一篇爬取酷狗TOP500差不多,但是在使用CSS选择器的时候,有两组信息是连在一起,所以使用正则来获取 本来 ...

  9. python爬取boss直聘招聘信息_python学习之路-爬取boss直聘的岗位信息

    背景 想了解从事python相关岗位需要具备什么技能,于是就想从招聘网站上的职位需求入手,把信息获取下来后,生成词云,这样就能很直观的看出来哪些技能是python相关岗位需要具备的了. 技术概览 sc ...

最新文章

  1. ping 不通 华为三层交换机vlan_华为交换机常用的三种vlan划分方法,一文了解清楚vlan...
  2. python点的作用-Python中*和**的作用(课堂小结)
  3. 疯了吧!面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?
  4. python字符串截取_Python-变量-No3
  5. linux安装crontab软件包,Linux 服务器 Crontab 的安装及使用
  6. JavaWeb学习笔记-kuangshen
  7. Python批量提取docx格式Word文档中所有文本框内的文本
  8. linux怎么重新编译c文件,linux编译c文件
  9. java lang ClassNotFoundException org apache jsp index jsp解决
  10. 对称正定矩阵的Cholesky分解
  11. ERP管理web后台_数字化、智能化工厂管理系统原型、erp生产管理、仓库管理、采购管理、设备能源管理、计划管理、数字化工厂erp管理系统、生产计划、采购计划、用料请领、产品bom、工序管理、车间设备
  12. 数独解法-变形数独(第三讲:数独进阶方法(摒除))
  13. hive Unexpected column vector type LIST
  14. 一个农村孩子的大城市梦想之深入江湖!
  15. FI财务会计全局设置
  16. 微信小程序授权文件放到域名根目录下
  17. python猴子分桃_猴子分桃 - Ryan in C++ - 博客园
  18. 打破数据围墙 加速金融创新
  19. 推荐 6 个前后端分离项目
  20. 鳄鱼笔记(三) --> bug小屋<--[c# 报错The type initializer for ‘Gdip‘ threw an exception]

热门文章

  1. eCryptfs v0.1 Design Document
  2. python之类的静态方法
  3. 恶补数据结构与算法2--数组
  4. 期货是期权的衍生品(期权期货和其他衍生品)
  5. buuctf misc USB
  6. webp批量转换成jpg的方法
  7. 局域网断网攻击 (arp攻击)
  8. 手机科学计算机xy怎么用,手机科学计算器怎么用? 如何使用科学计算器
  9. Python | Bootstrap采样实现
  10. 计算机毕业设计ssm扶贫助农系统v7tq9系统+程序+源码+lw+远程部署