ruby 爬虫爬取拉钩网职位信息,产生词云报告

思路: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 methodwhen :getUnirest.get(url, headers:headers).bodywhen :postUnirest.post(url, headers:headers, parameters:parameters).bodyend
end# 获取页数
def get_page_num(url)html = query_url(:get, url).force_encoding('utf-8')html.scan(/<span class="span totalNum">(\d+)<\/span>/).first.first
end# 获取每页显示的所有职位的id
def get_positionsId(url, headers:{}, parameters:nil)response = query_url(:post, url, headers:headers, parameters:parameters)positions_id = Array.newresponse['content']['positionResult']['result'].each{|i| positions_id << i['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_hcounter2
end# 转换
def parse(hash)data = Array.newhash.each do |k,v|word = Hash.newword['name'] = kword['value'] = vdata << wordendJSON data
end# 持久化数据
def save_excel(hash)excel = WIN32OLE.new('Excel.Application')excel.visible = falseworkbook = 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]]endendexcel.DisplayAlerts = falseworkbook.saveas(File.dirname(__FILE__)+'\lagouspider.xls')workbook.saved = trueexcel.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}页"# 获取positionsidurl2 = 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 10end
endcount = word_count(skills)
save_excel(count)
@data = parse(count)

 

效果展示:

   

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

评论语义分析 分词 分类python_用python调用ICTCLAS50进行中文分词

直接上源码吧tokenizer类&#xff1a;#_*_encoding:utf-8_*_from ctypes import *class tokenizer:def __init__(self):self._stext[、,“,”,&#xff0c;,。,《,》,&#xff1a;,&#xff1b;,!,‘,’,?,&#xff1f;,&#xff01;,, ,] #枚举标点符号包括空格self._stopwor…

java对日期Date类进行加减运算、年份加减,月份加减

JAVA处理日期时间常用方法&#xff1a; 1.Java.util.Calendar Calendar 类是一个抽象类&#xff0c;它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法&#xff0c;并为操作日历字段&#xff08;例如获得下星期的日期&#xff09…

idle扩展插件_Python3.4学习笔记之 idle 清屏扩展插件用法分析

本文实例讲述了Python3.4 idle 清屏扩展插件用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;python idle 清屏问题的解决&#xff0c;使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?在stackoverflow看到这样两种答案&#xff1a;1.在shell中输入…

内存堆和栈的区别

原文链接&#xff1a;http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html -------------------------------------------------------------------------------- 在计算机领域&#xff0c;堆栈是一个不容忽视的概念&#xff0c;我们编写的C语言程序基本上都要用…

MYSQL安装和配置

Win10安装MySQL5.7.22 解压缩版&#xff08;手动配置 1.下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 直接点击下载项 下载后&#xff1a; 2.可以把解压的内容随便放到一个目录&#xff0c;我的是如下目录&#xff08;放到C盘的话&#xff0…

python删除过期文件_python删除过期文件的方法

本文实例讲述了python删除过期文件的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;# remove all jpeg image files of an expired modification date mtime# you could also use creation date (ctime) or last access date (atime)# os.stat(filename) returns …

【很久之前的一篇老文章】一位程序员工作10年总结的13个忠告

展望未来&#xff0c;总结过去10年的程序员生涯&#xff0c;给程序员小弟弟小妹妹们的一些总结性忠告。 走过的路&#xff0c;回忆起来是那么曲折&#xff0c;把自己的一些心得体会分享给程序员兄弟姐妹们&#xff0c;虽然时代在变化&#xff0c;但是很可能你也会走我已经做过的…

apply()与call()的区别

一直都没太明白apply()与call()的具体使用原理&#xff0c;今日闲来无事&#xff0c;决定好好研究一番。 JavaScript中的每一个Function对象都有一个apply()方法和一个call()方法&#xff0c;它们的语法分别为&#xff1a; /*apply()方法*/ function.apply(thisObj[, argArray]…

java代码执行了两次_Java中JComboBox的itemStateChanged事件执行两次的解释

今天做项目&#xff0c;用到了JComboBox&#xff0c;即下拉列表框。为了在被选中的项发生改变时获得被选中的项&#xff0c;所以使用的ItemStateChanged事件&#xff0c;可是问题就来了&#xff0c;每次触发该事件&#xff0c;它都执行两次&#xff0c;屡试不爽。一开始以为是代…

python连接mongo_使用简单的Python连接访问MongoDB

继续来聊MongoDB。MongoDB作为了一个数据库产品软件&#xff0c;除了服务器Server端进程(mongod)外&#xff0c;还提供了比较丰富的访问连接接口。我们最常用的就是两个类型&#xff0c;一个是原生mongo shell&#xff0c;另一个就是应用程序语言访问接口。1、从Mongo Shell到应…

spring与mybatis三种整合方法

原文链接&#xff1a;http://www.cnblogs.com/wangmingshun/p/5674633.html ------------------------------------------------------------------------------------------------- 1、采用MapperScannerConfigurer&#xff0c;它将会查找类路径下的映射器并自动将它们创建成…

js常用的2中排序方法:冒泡排序和快速排序

冒泡排序&#xff1a;例如9 4 5 6 8 3 2 7 10 1 首先&#xff1a;9和4比较 4放前 4 9 5 6 8 3 2 7 10 1 4和5比较 4不动 4 9 5 6 8 3 2 7 10 1 4和6比较 4不动 4 9 5 6 8 3 2 7 10 1 4和3比较 3放前 3 9 5 6 8 4 2 7 10 1 3和2比较 2放前 2 9 5 6 8…

java 注册页面正则式_Java使用正则表达式对注册页面进行验证功能实现

本文给大家介绍java使用正则表达式对注册页面进行验证的代码&#xff0c;代码如下所示&#xff1a;package regex;import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class registered {public static void main(String[] args)…

python 编程效率_如何有效提升数据分析效率?五大Python技巧

如何有效提升数据分析效率&#xff1f;相信这是所有数据分析工作者都想解决的问题。本文整理了五大python技巧&#xff0c;分别是Pandas Profiling&#xff1b;使用 Cufflinks 和 Plotly 绘制 Pandas 数据&#xff1b;IPython 魔术命令&#xff1b;Jupyter 中的格式编排&#x…

please select a vaild python interpret

当 JetBrains PyCharm 2017.1.3 x64 遇到 please select a vaild python interpret 错误时&#xff1a; 进入PyCharm setting 选项&#xff0c;搜索 interpret

Grafana分析Nginx日志

配置Groub by -Terms时报错&#xff0c;提示需要设置fielddatatrue&#xff0c;报错内容大概如下&#xff1a; "Fielddata is disabled on text fields by default ... " 解决方法如下&#xff1a; https://www.elastic.co/guide/en/elasticsearch/reference/curren…

php curl json post请求_php post请求发送json对象数据参数

网页中发送请求时&#xff0c;大部分情况都参数以键值组合发送数据的&#xff0c;而一些第三方如java开发的接口中需要发送post请求&#xff0c;请求参数为json类型。既然要发送json数据&#xff0c;首页我们需要在请求头中定义数据类型为json&#xff0c;告诉服务器客服端发送…

python删除链表中的最小元素_LintCode Python 入门级题目 删除链表元素、整数列表排序...

删除链表元素&#xff1a;循环列表head&#xff0c;判断当前指针pre.next的val是否等于val&#xff0c;如果是&#xff0c;当前pre重指向pre.next.next&#xff0c;直至pre.next Null# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.va…

IDEA 更换主题

1、下载主题文件 百度或者谷歌 IDEA themes 网址有可能会变化。目前是 http://color-themes.com 选择自己喜欢的颜色&#xff0c;下载。 2、导入主题文件 File----Import Setting 导入下载的jar文件&#xff0c;一路确认&#xff0c;idea会自动重启。 3、选择主题 点击…

【CentOS 7笔记】cp、mv、文档查看方式

2019独角兽企业重金招聘Python工程师标准>>> 一. copy 常用cp -r/R #拷贝目录&#xff0c;递归 cp -i #覆盖时会提示&#xff0c;默认项 cp -p #保留源目录或源文件的属性 cp -b #源文目与目的文目建立链接&#xff0c;链接 cp -f #强制覆盖 cp -v …