需求故事: 又是一年一度的金三银四招聘季,拉勾上的简历邀请投递信息实在是看不过来了;于是决定利用强大的Python分析一下这些数据。 注:纯手打,如有错误欢迎评论区交流! 转载请注明出处:https://blog.csdn.net/testleaf/article/details/123311157 多谢!!!
一、导入需要使用的库
import time
from selenium import webdriver
import openpyxl
import wordcloud
说明: 1、time.sleep(x) :可以控制程序休眠的时间(秒); 2、time.strftime("%Y-%m-%d %H-%M-%S", time.localtime()) :可以获取到当前的日期和时间数据; 3、selenium :控制浏览器的一些自动操作; 4、openpyxl :控制excel的读取和写入; 5、wordcloud :根据字符串生成词云图片;
二、打开拉勾简历邀约界面
1、启动Chrome浏览器,最大化浏览器,并打开拉勾网站
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.lagou.com/')
2、切换城市为广州,并点击登录按钮
driver.find_element_by_xpath('//a[@data-city="广州"]').click()
driver.find_element_by_xpath('//a[@class="login"]').click()
3、切换登录方式为密码登录,输入常用手机号/邮箱、密码,勾选同意用户协议及隐私政策,点击登录:
driver.find_element_by_xpath('//div[@class="change-login-type" and @data-lg-tj-no="0006"]').click()
driver.find_element_by_xpath('//input[@placeholder="请输入常用手机号/邮箱"]').send_keys("XXXXXXXXXXX")
driver.find_element_by_xpath('//input[@placeholder="请输入密码"]').send_keys("XXXXXX")
driver.find_element_by_xpath('//div[@class="login-checked"]/img[@class="no-checked"]').click()
driver.find_element_by_xpath('//div[@class="login-btn login-password sense_login_password btn-green"]').click()
4、图片识别验证
此处休眠10秒左右,供手动验证;
time.sleep(10)
手动验证完毕,点击确认,就登录成功了;
5、点击小铃铛,点击查看全部消息,跳转至简历邀约汇总界面
driver.find_element_by_xpath('//a[@class="msg_group"]').click()
driver.find_element_by_xpath('//div[@class="sc-dlnjwi dJXsSm"]/span').click()
6、简历投递邀约实在是太多了😂😂,不过进行自动化之前得先把消息都搞成已读的;不然不好抓取 7、跳转到这个简历邀约页面,最好休息2秒吧,然后将页面滑动到最底端
time.sleep(2)
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
8、初始化邀请列表为空; 大概构思是把每一份简历邀约信息封装成一个小列表invitelistitem ,然后再把所有小列表invitelistitem 依次存到一个大列表invitelist ,算是一个二维列表了; 每一份简历邀约信息里面有很多字段了,都需要存起来的;
invitelist = []
三、抓取拉勾简历邀约界面数据
while not ('disabled' in driver.find_element_by_xpath('//li[@title="下一页"]').get_attribute('innerHTML')):
results = driver.find_elements_by_xpath('//div[@class="invites_item__24wcs"]')
for resultindex in range(1, len(results) + 1):
positionresult = driver.find_element_by_xpath(
'(//div[@class="position_header__1tSHC"])[' + str(resultindex) + ']')
position = positionresult.find_elements_by_xpath('span')[0].text
region = positionresult.find_elements_by_xpath('span')[1].text
years = positionresult.find_elements_by_xpath('span')[2].text
education = positionresult.find_elements_by_xpath('span')[3].text
company = driver.find_element_by_xpath('(//div[@class="company_name__1hiA6"])[' + str(resultindex) + ']').text
salary = driver.find_element_by_xpath('(//div[@class="position_salary__1Eg6u"])[' + str(resultindex) + ']').text
companyresult = driver.find_element_by_xpath(
'(//div[@class="company_detail__V0K9v"])[' + str(resultindex) + ']')
companytype = companyresult.find_elements_by_xpath('span')[0].text
companysize = companyresult.find_elements_by_xpath('span')[1].text
companyindustry = ''
companyindustryresults = driver.find_element_by_xpath(
'(//div[@class="position_labels__21Kg3"])[' + str(resultindex) + ']').find_elements_by_xpath('span')
for companyindustryresult in companyindustryresults:
companyindustry = companyindustry + companyindustryresult.text + '、'
companyindustry = companyindustry[:-1]
welfare = driver.find_element_by_xpath(
'(//div[@class="position_describe__2eLo1"])[' + str(resultindex) + ']').text
hr = driver.find_element_by_xpath('(//div[@class="hr_name__1k6Jk"])[' + str(resultindex) + ']').text
words = driver.find_element_by_xpath('(//div[@class="inviteContent__zYYpl"])[' + str(resultindex) + ']').text[
1:-1]
datetime = driver.find_element_by_xpath('(//span[@class="handle_date__2TPhU"])[' + str(resultindex) + ']').text
invitelistitem = [datetime, position, salary, region, years, education, company, companytype, companysize,
companyindustry, welfare, hr, words]
invitelist.append(invitelistitem)
driver.find_element_by_xpath('//li[@title="下一页"]').click()
time.sleep(2)
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
说明:
1、这里采用了一个while循环,让selenium可以一直点击“下一页”按钮,直到该按钮无法继续点击才结束; 观察HTML代码可以发现“下一页”按钮可点击时和不可点击时的区别: 可点击:
不可点击: 可以看到,“下一页”按钮不可点击时,其HTML代码里面多了一个“disabled ”, 于是,这里使用'disabled' in driver.find_element_by_xpath('//li[@title="下一页"]').get_attribute('innerHTML') 进行判断,直到下一页按钮的HTML代码里面有了“disabled ”就不再继续点击了;
2、各字段数据抓取并存放到指定列表: 这里很简单了,先通过xpath获取到当前页面总共的简历邀约数量len(results) ,然后利用for循环和range进行遍历,通过xpath及text获取到每一个元素的值,紧接着按照一定的顺序存放到小列表invitelistitem ,for的一次循环结束,就把小列表invitelistitem 添加进大列表invitelist ; 把当前页面的数据处理完就点击“下一页”按钮,进入下一页,然后休息2秒,滑动到最底部,进行下一次的for的循环的数据处理操作; 最后就得到了一个汇总的二维数据列表invitelist ;
四、存放数据到excel
1、关闭浏览器驱动
driver.quit()
2、创建excel,并移除默认Sheet页,创建本次Sheet页
wb = openpyxl.Workbook()
wb.remove(wb["Sheet"])
result_datetime = time.strftime("%Y-%m-%d %H-%M-%S", time.localtime())
result_sh = wb.create_sheet(result_datetime+'-拉勾简历邀约抓取')
3、写入列头,这个顺序按照刚才往小列表invitelistitem 里面添加数据的顺序
result_title = ['序号','沟通时间','职位','薪资','地区','工作年限','学历','公司名称','融资阶段','规模','行业','福利','联系人','消息']
for i in range(len(result_title)):
result_sh.cell(row=1, column=i+1, value=result_title[i])
4、将二维列表invitelist 的数据加上序号并全部写入Sheet,每一行都是一个小列表invitelistitem 的数据
a = 2
for i in invitelist:
b = 2
result_sh.cell(row=a, column=1, value=a-1)
for j in i:
result_sh.cell(row=a, column=b, value=invitelist[a-2][b-2])
b += 1
a += 1
5、保存excel
wb.save(filename=result_datetime+'-拉勾简历邀约抓取'+'.xlsx')
6、这样子就可以在本地的excel文件里面查看到抓取的数据了,记得Ctrl+A全选数据,然后调整至最适合的列宽
五、制作词云图
1、初始化一个空的集合companynameSet
companynameSet = set()
2、把刚才二维列表invitelist 里面的公司名称数据进行提取,并剔除一切可能出现的符号、空格,只保留英文、中文,因为wordcloud 会把所有符号、空格当成分割符,最后存入集合companynameSet 进行去重
for i in range(len(invitelist)):
companynameSet.add(invitelist[i][6].replace(' ','').replace('(','').replace('.','').replace(')','').replace('?','').replace('-',''))
3、制作大小为3840*2160的词云图; 这里注意一下,要指定中文字体,不然中文就显示不出来了,然后利用空格把公司名称集合companynameSet 里面的元素拼接成一条长长的字符串,最后生成词云图片
w=wordcloud.WordCloud(width=3840,height=2160,font_path=r"C:\Windows\Fonts\msyh.ttc")
w.generate(" ".join(companynameSet))
w.to_file(result_datetime+"-公司分析.png")
|