热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

技术日志:使用Ruby爬虫抓取拉勾网职位数据并生成词云分析报告

思路:1.获取拉勾网搜索到职位的页数  2.调用接口获取职位id  3.根据职位id访问页面,匹配出关键字   url访问采用unirest,由于拉钩反爬虫,短时间内频繁访

思路: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
end
end
# 获取页数
def get_page_num(url)
html
= query_url(:get, url).force_encoding(utf-8)
html.scan(
/class="span totalNum">(d+)/).first.first
end
# 获取每页显示的所有职位的id
def 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 <positionId]}
positions_id
end
# 匹配职位英文关键字
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
counter2
end
# 转换
def parse(hash)
data
= Array.new
hash.each do
|k,v|
word
= Hash.new
word[
name] = k
word[
value] = v
data
<< word
end
JSON data
end
# 持久化数据
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_i
puts
"存在 #{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
end
end
count
= word_count(skills)
save_excel(count)
@data
= parse(count)

 

效果展示:

技术分享图片   技术分享图片


推荐阅读
author-avatar
孜雪颖2000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有