博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ruby 爬虫爬取拉钩网职位信息,产生词云报告
阅读量:5910 次
发布时间:2019-06-19

本文共 3002 字,大约阅读时间需要 10 分钟。

思路:1.获取拉勾网搜索到职位的页数

  

2.调用接口获取职位id

  

3.根据职位id访问页面,匹配出关键字

  

 

url访问采用unirest,由于拉钩反爬虫,短时间内频繁访问会被限制访问,所以没有采用多线程,而且每个页面访问时间间隔设定为10s,通过nokogiri解析页面,正则匹配只获取技能要求中的英文单词,可能存在数据不准确的情况

数据持久化到excel中,采用ruby erb生成word_cloud报告

爬虫代码:

require 'unirest'require 'uri'require 'nokogiri'require 'json'require 'win32ole'@position = '测试开发工程师'@city = '杭州'# 页面访问def query_url(method, url, headers:{}, parameters:nil)  case method    when :get      Unirest.get(url, headers:headers).body    when :post      Unirest.post(url, headers:headers, parameters:parameters).body  endend# 获取页数def get_page_num(url)  html = query_url(:get, url).force_encoding('utf-8')  html.scan(/(\d+)<\/span>/).first.firstend# 获取每页显示的所有职位的iddef get_positionsId(url, headers:{}, parameters:nil)  response = query_url(:post, url, headers:headers, parameters:parameters)  positions_id = Array.new  response['content']['positionResult']['result'].each{|i| positions_id << i['positionId']}  positions_idend# 匹配职位英文关键字def get_skills(url)  puts "loading url: #{url}"  html = query_url(:get, url).force_encoding('utf-8')  doc = Nokogiri::HTML(html)  data = doc.css('dd.job_bt')  data.text.scan(/[a-zA-Z]+/)end# 计算词频def word_count(arr)  arr.map!(&:downcase)  arr.select!{
|i| i.length>1} counter = Hash.new(0) arr.each { |k| counter[k]+=1 } # 过滤num=1的数据 counter.select!{|_,v| v > 1} counter2 = counter.sort_by{|_,v| -v}.to_h counter2end# 转换def parse(hash) data = Array.new hash.each do |k,v| word = Hash.new word['name'] = k word['value'] = v data << word end JSON dataend# 持久化数据def save_excel(hash) excel = WIN32OLE.new('Excel.Application') excel.visible = false workbook = excel.Workbooks.Add() worksheet = workbook.Worksheets(1) # puts hash.size (1..hash.size+1).each do |i| if i == 1 # puts "A#{i}:B#{i}" worksheet.Range("A#{i}:B#{i}").value = ['关键词', '频次'] else # puts i # puts hash.keys[i-2], hash.values[i-2] worksheet.Range("A#{i}:B#{i}").value = [hash.keys[i-2], hash.values[i-2]] end end excel.DisplayAlerts = false workbook.saveas(File.dirname(__FILE__)+'\lagouspider.xls') workbook.saved = true excel.ActiveWorkbook.Close(1) excel.Quit()end# 获取页数url = URI.encode("https://www.lagou.com/jobs/list_#@position?city=#@city&cl=false&fromSearch=true&labelWords=&suginput=")num = get_page_num(url).to_iputs "存在 #{num} 个信息分页"skills = Array.new(1..num).each do |i| puts "定位在第#{i}页" # 获取positionsid url2 = URI.encode("https://www.lagou.com/jobs/positionAjax.json?city=#@city&needAddtionalResult=false") headers = {Referer:url, 'User-Agent':i%2==1?'Mozilla/5.0':'Chrome/67.0.3396.87'} parameters = {first:(i==1), pn:i, kd:@position} positions_id = get_positionsId(url2, headers:headers, parameters:parameters) positions_id.each do |id| # 访问具体职位页面,提取英文技能关键字 url3 = "https://www.lagou.com/jobs/#{id}.html" skills.concat get_skills(url3) sleep 10 endendcount = word_count(skills)save_excel(count)@data = parse(count)

 

效果展示:

   

转载于:https://www.cnblogs.com/wf0117/p/9218196.html

你可能感兴趣的文章
Clojure世界:利用HouseMD诊断clojure
查看>>
《HTML5实战》——第2章 创建表单:输入小部件、数据绑定以及数据验证
查看>>
Hadoop创始人Doug Cutting谈未来大数据的技术
查看>>
《Android游戏开发详解》一2.10 使用对象
查看>>
《重构:改善既有代码的设计》—第1章1.2节重构的第一步
查看>>
Firefox OS 模拟器
查看>>
十分钟搞清字符集和字符编码
查看>>
互联网企业安全高级指南3.3 如何推动安全策略
查看>>
《Nmap渗透测试指南》—第7章7.9节系统漏洞扫描
查看>>
xmemcached 0.60 优化过程
查看>>
《Linux防火墙(第4版)》——第1章 数据包过滤防火墙的预备知识 1.1OSI网络模型...
查看>>
《编译与反编译技术实战 》一 第1章 实践的环境与工具
查看>>
Nginx在Window下的使用笔记
查看>>
Columnar Storage
查看>>
跟着实例学习ZooKeeper的用法: Leader选举
查看>>
《Python核心编程(第3版)》——2.8 练习
查看>>
Redis开发与运维. 3.9 本章重点回顾
查看>>
《嵌入式C编程:PIC单片机和C编程技术与应用》一1.11 兼容性
查看>>
《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——2.16 创建索引...
查看>>
log4j一些配置说明
查看>>