项目介绍:该项目适合学习的时候使用,因为项目比较小,主要目的对猎聘当中的各个岗位的数据的获取和简单的分析,从多个方面分析岗位之间的关系以及薪资的差异。
采用的技术有:
python爬虫:
hadoop:hdfs存储数据
hive on spark : 进行数据分析
sqoop: 将分析的结果传输到关系型数据库当中
superset:进行数据的可视化
首先是将数据从猎聘官网当中获取:
爬取技术一栏当中的似是一个岗位对应的数据。
先获得各个岗位的url,进行跳转,在每个网页当获取有用的信息:比如:岗位,地址,薪资,公司规模,要求掌握的技术,学历要求和经验要求,最后,对这一页的数据爬取完之后,进行跳转,通过find-element-by-xpath(),来锁定到下一页的链接上,跳转到下一页再进行数据的爬取,如此往复,从而,得到所有的想要的数据。
话不多说,代码实现为:
from selenium import webdriver from selenium.webdriver.chrome.webdriver import Options from lxml import etree import os def share_brower(): chrome_options = Options() # chrome_options.add_argument('--headless') # 来判断浏览器的前后台运行,有图形化可以更好的展现她的活动 chrome_options.add_argument('--disable-gpu') path='C:Program Files (x86)GoogleChromeApplicationchrome.exe' chrome_options.binary_location = path brower = webdriver.Chrome(chrome_options=chrome_options) return brower def save(source, number, name1): tree = etree.HTML(source) position = tree.xpath('//ul/li//div[@]/div[1]/text()') addr = tree.xpath('//ul/li//div[@]/div[2]/span[2]/text()') salary = tree.xpath('//ul/li//div[@]/span/text()') company = tree.xpath('//ul/li//div[@]/span/text()') scale = tree.xpath( '//ul/li//div[@]/div[@]/span[last()]/text()') experience = tree.xpath('//ul/li//div[@]/span[1]/text()') xueli = tree.xpath('//ul/li//div[@]/span[2]/text()') keyword = tree.xpath('//ul/li//div[@]/span/text()') mi = min(len(position), len(addr), len(salary), len(company), len(scale), len(xueli), len(experience)) with open('./date/' + name1.strip() + "/" + str(number) + '.csv', 'w', encoding='utf-8') as fs: for l in range(mi): new = position[l] + ',' + addr[l] + ',' + salary[l] + ',' + company[l] + ',' + scale[l]+','+experience[l]+','+xueli[l]+'tn' fs.write(new) fs.close() with open('./keyword.txt', 'a', encoding='utf-8') as fs: ne = '' for i in keyword: ne = ne + i + ' ' fs.write(ne) fs.close() base_url = 'https://www.liepin.com' brower = share_brower() brower.get('https://www.liepin.com/it/') brower.implicitly_wait(3) page = brower.page_source tree = etree.HTML(page) name = tree.xpath('//ul[@]/li[1]//dd/a/text()') url = tree.xpath('//ul[@]/li[1]//dd/a/@href') for i in range(len(name)): if not os.path.exists('./date/'+name[i]): os.mkdir('./date/'+name[i]) #创建文件夹 brower.get(base_url+url[i]) brower.implicitly_wait(3) source = brower.page_source number = 1 save(source, number, name[i]) print(name[i]) try: for j in range(9): element = brower.find_element_by_xpath('//div[@]//li[last()]/a') element.click() save(brower.page_source, number, name[i]) number += 1 except RuntimeError: print("*"*30+"有错误,但是可以执行的哦!!") continue else: print("文件已经存在") os.rmdir('./date/'+name[i]) continue # # //ul[@]/li[1]//dd/a/text() 相关职业 # //ul[@]/li[1]//dd/a/@href 对应的连接 每个连接底下都有十个页面 、爬取当中的数据 # 数据的存放 总共有49个类别的技术岗位 分别放在49个问价夹底下,文件夹以对应的职业命名 底下十个文件,每个文件表示每一页的数据 # ,文件的命名方式以1-10.csv ,保存的时候中间以逗号隔开,保存当当前的路径底下,然后爬取成功之后同意上传到大数据集 # 群的本地文件夹下面 # //ul/li//div[@]/div[1]/text() 职位 # //ul/li//div[@]/div[2]/span[2]/text() 地址 # //ul/li//div[@]/span/text() 薪资 # //ul/li//div[@]/span/text() 企业 # //ul/li//div[@]/div[@] # /span[last()]/text() 公司规模 # //ul/li//div[@]/span[1]/text() 工作经验 # //ul/li//div[@]/span[2]/text() 招聘学历要求 # //ul/li//div[@]/span/text() //用正则将数据的后序删除掉,或者在hadoop当中处理 # //div[@]//li[last()] 下一页的标签 循环九次 brower.quit() # 最后退出
最后结果为:
每一层和里面的数据保存形式,都如上所述,后序通过简单的mapreduce实现数据的处理,上传至hdfs当中,下期继续。。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)