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.pswp.cn/news/538411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538411.shtml
英文地址,請注明出處:http://en.pswp.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 …