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)

效果展示:

   

原文地址:https://www.cnblogs.com/wf0117/p/9218196.html

时间: 2024-10-25 12:06:25

ruby 爬虫爬取拉钩网职位信息,产生词云报告的相关文章

selelinum+PhantomJS 爬取拉钩网职位

使用selenium+PhantomJS爬取拉钩网职位信息,保存在csv文件至本地磁盘 拉钩网的职位页面,点击下一页,职位信息加载,但是浏览器的url的不变,说明数据不是发送get请求得到的. 我们不去寻找它的API.这里使用另一种方式:使用PhantomJS模拟浏览,通过单击页面获取下一页. 这里的PhantomJS是一个没有界面的浏览器. 1 from selenium import webdriver 2 import time 3 import random 4 5 from selen

21天打造分布式爬虫-Selenium爬取拉钩职位信息(六)

6.1.爬取第一页的职位信息 第一页职位信息 from selenium import webdriver from lxml import etree import re import time class LagouSpider(object): def __init__(self): self.driver = webdriver.Chrome() #python职位 self.url = 'https://www.lagou.com/jobs/list_python?labelWords

Python 爬取拉勾网python职位信息

今天的任务是爬取拉勾网的职位信息. 首先,我们进入拉勾网,然后在职位搜索栏搜索Python 的同时,打开控制面板F12,来查看网页构成. 在XHR里,可以清楚的看见Ajax请求,所以需要使用session模块来模拟浏览器的行为来操作. 源代码如下: import requests import json header = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Referer': 'https://www.la

通俗易懂的分析如何用Python实现一只小爬虫,爬取拉勾网的职位信息

源代码:https://github.com/nnngu/LagouSpider 效果预览 思路 1.首先我们打开拉勾网,并搜索"java",显示出来的职位信息就是我们的目标. 2.接下来我们需要确定,怎样将信息提取出来. 查看网页源代码,这时候发现,网页源代码里面找不到职位相关信息,这证明拉勾网关于职位的信息是异步加载的,这也是一种很常用的技术. 异步加载的信息,我们需要借助 chrome 浏览器的开发者工具进行分析,打开开发者工具的方法如下: 点击Nerwork进入网络分析界面,这

Node.js爬虫-爬取慕课网课程信息

第一次学习Node.js爬虫,所以这时一个简单的爬虫,Node.js的好处就是可以并发的执行 这个爬虫主要就是获取慕课网的课程信息,并把获得的信息存储到一个文件中,其中要用到cheerio库,它可以让我们方便的操作HTML,就像是用jQ一样 开始前,记得 npm install cheerio 为了能够并发的进行爬取,用到了Promise对象 //接受一个url爬取整个网页,返回一个Promise对象 function getPageAsync(url){ return new Promise(

拉钩网爬取所有python职位信息

最近在找工作,所以爬取了拉钩网的全部python职位,以便给自己提供一个方向.拉钩网的数据还是比较容易爬取的,得到json数据直接解析就行,废话不多说, 直接贴代码: 1 import json 2 import urllib 3 import urllib2 4 from openpyxl import load_workbook 5 filename = 'E:\excel\position_number_11_2.xlsx' 6 ws = load_workbook(filename=fi

爬虫---爬取拉钩信息网

今天不知道写点什么,想到金9银10了写一篇抓取拉勾网我们软件测试工程师的薪资~~ 爬取拉勾网职业信息 分析网站信息 1.打开拉勾网,输入我们想要查找的职位 2.通过抓包工具或者开发者工具查看请求数据 发现是请求地址:https://www.lagou.com/jobs/positionAjax.json?city=%E4%B8%8A%E6%B5%B7&needAddtionalResult=false 通过post形式请求的,请求参数也可以看到 4.分析页面数据 通过分析,数据已json的格式存

c# 爬虫爬取京东所有商品信息

在一个小项目中,需要用到京东的所有商品ID,因此就用c#写了个简单的爬虫. 在解析HTML中没有使用正则表达式,而是借助开源项目HtmlAgilityPack解析HTML. 一.下载网页HTML 首先我们写一个公共方法用来下载网页的HTML. 在写下载HTML方法之前,我们需要去查看京东网页请求头的相关信息,在发送请求时需要用到. public static string DownloadHtml(string url, Encoding encode) { string html = stri

使用nodejs爬取拉勾苏州和上海的.NET职位信息

最近开始找工作,本人苏州,面了几家都没有结果很是伤心.在拉勾上按照城市苏州关键字.NET来搜索一共才80来个职位,再用薪水一过滤,基本上没几个能投了.再加上最近苏州的房价蹭蹭的长,房贷压力也是非常大,所以有点想往上海去发展.闲来无聊写了个小爬虫,爬了下苏州跟上海的.NET职位的信息,然后简单对比了一下. 是的小弟擅长.NET,为啥用nodejs?因为前几天有家公司给了个机会可以转nodejs,所以我是用来练手的,不过后来也泡汤了,但是还是花两晚写完了.刚学,代码丑轻喷哈! 一:如何爬取拉勾的数据