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 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(/<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.new
response['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_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)
效果展示:
ruby 爬虫爬取拉钩网职位信息,产生词云报告的更多相关文章
- selelinum+PhantomJS 爬取拉钩网职位
使用selenium+PhantomJS爬取拉钩网职位信息,保存在csv文件至本地磁盘 拉钩网的职位页面,点击下一页,职位信息加载,但是浏览器的url的不变,说明数据不是发送get请求得到的. 我们不 ...
- 21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)
6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time c ...
- Python3 Scrapy + Selenium + 阿布云爬取拉钩网学习笔记
1 需求分析 想要一个能爬取拉钩网职位详情页的爬虫,来获取详情页内的公司名称.职位名称.薪资待遇.学历要求.岗位需求等信息.该爬虫能够通过配置搜索职位关键字和搜索城市来爬取不同城市的不同职位详情信息, ...
- 爬取拉钩网上所有的python职位
# 2.爬取拉钩网上的所有python职位. from urllib import request,parse import json,random def user_agent(page): #浏览 ...
- 通俗易懂的分析如何用Python实现一只小爬虫,爬取拉勾网的职位信息
源代码:https://github.com/nnngu/LagouSpider 效果预览 思路 1.首先我们打开拉勾网,并搜索"java",显示出来的职位信息就是我们的目标. 2 ...
- 使用request爬取拉钩网信息
通过cookies信息爬取 分析header和cookies 通过subtext粘贴处理header和cookies信息 处理后,方便粘贴到代码中 爬取拉钩信息代码 import requests c ...
- Node.js爬虫-爬取慕课网课程信息
第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让 ...
- 拉钩网爬取所有python职位信息
最近在找工作,所以爬取了拉钩网的全部python职位,以便给自己提供一个方向.拉钩网的数据还是比较容易爬取的,得到json数据直接解析就行,废话不多说, 直接贴代码: import json impo ...
- python爬虫实战之爬取智联职位信息和博客文章信息
1.python爬取招聘信息 简单爬取智联招聘职位信息 # !/usr/bin/env python # -*-coding:utf-8-*- """ @Author ...
随机推荐
- Razor模板引擎 (RazorEngine)
Razor模板引擎不仅在ASP.NET MVC中内置了Razor模板引擎,还有一个开源的RazorEngine, 这样以来我们可以在非ASP.NET MVC项目中使用Razor引擎,甚至在控制台,Wi ...
- Mac终端下 连接 ubuntu 16.04 ssh root@*.*.*.* permission denied 问题解决方案
默认 Ubuntu 不开启 ssh 服务 (1)检查是否开启SSH服务 命令:ps -e|grep ssh 查看SSH服务是否开启,或者通过命令:service sshd status 可以查看某 ...
- Doing Research Needs Efforts
What is research? From YouTube Video or baiduyun Links What does not? spend many hours before you ...
- 关于Java中的反射的一个简单使用
把以前在其他地方的技术文章重新整理一遍, 方便自己回忆, 也方便他人借鉴. 刚工作的时候发过这么一段代码: package cn.com.hanbinit.test; import java.lang ...
- 记一种c++字符串格式化方法
std::string str_fmt(const char * _Format, ...) { std::string _str; va_list marker = NULL; va_start(m ...
- 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- 单表60亿记录等大数据场景的MySQL优化和运维之道 | 高可用架构
015-08-09 杨尚刚 高可用架构 此文是根据杨尚刚在[QCON高可用架构群]中,针对MySQL在单表海量记录等场景下,业界广泛关注的MySQL问题的经验分享整理而成,转发请注明出处. 杨尚刚,美 ...
- VC++ MFC工程中中如何将一个工程的资源(如对话框)复制到另外一个工程
问题的提出:在工程1中用到的资源,在工程2中已有现成的.即工程1中要用到的对话框和工程2的完全相同,而工程2中对该对话框的布局已设计好.控件变量都绑定好了.但由于该对话框的控件特别多,如果在工程1中再 ...
- Git--将服务器代码更新到本地
1. git status(查看本地分支文件信息,确保更新时不产生冲突) 2. git checkout -- [file name] (若文件有修改,可以还原到最初状态; 若文件需要更新到服务器上, ...
- Mark一下在模仿团购App搭建页面时犯的低级错误
1.关于Xib拖线错误 2.下面这个错误的根源其实是代码提示时直接敲下了回车,没看仔细,导致后来找了好久才发现该错误,郁闷啊!