Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >019:Selenium操作Boss直聘进行一键职位投递

019:Selenium操作Boss直聘进行一键职位投递

作者头像
李玺
发布于 2021-11-22 10:57:40
发布于 2021-11-22 10:57:40
3.3K66
代码可运行
举报
文章被收录于专栏:爬虫逆向案例爬虫逆向案例
运行总次数:6
代码可运行

这里不是打广告,好的招聘平台有很多,Boss直聘是一个。 虽然Boss直聘上面可以跟 HR 直接沟通很实用,但是投递职位非常麻烦,需要一个一个的手动去点击,大多数沟通了还没有反应。 所以我今天就用 Selenium + Python 写了一个自动沟通的脚本。 写的时候发现,Boss直聘上面反 Selenium 措施也是很到位的。

下面我就介绍下代码实现的具体步骤吧。

首先模拟登陆:

Boss直聘官网:https://www.zhipin.com/ 我直接访问的登陆界面的url:https://login.zhipin.com/?ka=header-login

他这里打开直接是账号密码登陆,看起来倒是可以省些功夫。

我想用class_name直接获取input的时候,发现有三个手机号输入框,这里需要使用xpath来定位元素,

所以直接右键点击input这里,选择copy,点击copy中的copy-Xpath。

密码框也是一样。直接copy-Xpath

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[3]/span[2]/input').click()
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[3]/span[2]/input').send_keys('你手机号')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[4]/span/input').click()
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[4]/span/input').send_keys('你的密码')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[6]/button').click()
time.sleep(2)

接着就是这个令人头疼的滑块了。尽管这个滑块看起来十分简单。只需要拖动到最右边。

我刚开始就直接使用 ActionChains 来拖动鼠标,这里试了很久,每次拖动到最后都会报错,这里特别坑。

然后再pycharm里面报错:stale element reference: element is not attached to the page document

说明获取到的元素是在变化的 =、= 这里可以通过他固定的一个id来对应我们的xpath去匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# id = driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[5]/div[1]').get_attribute('data-nc-idx')
# print(id)
# time.sleep(0.5)
# huakuai = driver.find_element_by_xpath('//*[@id="nc_{}_n1z"]'.format(id))

然而搞了很久发现这里不仅仅是元素过期问题,我用手动拖动的时候也是会报错。

这样就应该是我们的 WebDriver 被Boss给检测出来了。

So,那我们要隐藏下自己的webdriver属性。 有几种方式都可以,比如添加mitmproxy代理等,这里我使用简单的把selenium改为开发者模式,就能防基于webdriver屏蔽了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
url = 'https://login.zhipin.com/?ka=header-login'
driver = webdriver.Chrome(executable_path=r'C:\Users\lenovo\Desktop\chromedriver_win32\chromedriver.exe',options=option)
driver.get(url)
2020/05/03更新: 网友发现之前的开发者模式不能用了,因为今年谷歌新版本取消了开发者模式对webdriver = flase的设置。 现在添加下面的js即可:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    driver = webdriver.Chrome(executable_path=r'C:\Users\lenovo\Desktop\chromedriver_win32\chromedriver.exe',options=option)

    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", 
                       { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ 
                         })
    driver.get(url)
但是在操作滑块的时候,还是很容易报错。 那咋办呢。。。 干脆就过滤掉这个滑块,反正我们的目标是来自动化投递简历,并不是一直登陆。

所以就有了标题中的一键操作这个概念,我们登陆时来手动拖动验证码。其他的就不需要操作了。(暂时先这样)

自动沟通:

登陆过后会自动挑战到默认地区的默认搜索界面: 这里没啥难度,直接发送关键词点击搜索。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[1]/div/form/div[1]/p/input').click()
driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[1]/div/form/div[1]/p/input').send_keys('爬虫')
driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[1]/div/form/button').click()
time.sleep(1)

然后记录下当前页面的url: liebiao_url = driver.current_url

这里我先操作鼠标移入我们要沟通的那一项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ActionChains(driver).move_to_element(driver.find_element_by_xpath('//*
[@id="main"]/div/div[3]/ul/li[{}]/div/div[3]'.format(i))).perform()      # i 在外面给的循环,完整代码贴到最后
	time.sleep(0.5)

然后获取详情页的url:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
xiangqing_url =  driver.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/h3/a'.format(i)).get_attribute('href')
print(xiangqing_url)
driver.get(xiangqing_url)
time.sleep(1)

点击详情页中的与我沟通:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[3]/div[1]/a').click()
time.sleep(1)

返回之前的列表页:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
driver.back()
time.sleep(1)
driver.back()
time.sleep(1)
if driver.current_url != liebiao_url:
   driver.get(liebiao_url)

有时候会出现下来这个玩意,再back两次就会错了。所以我们要判断下,如果出现这个,只back一次就好了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 if 'https://www.zhipin.com/job_detail' in str(driver.current_url):
     driver.back()
     time.sleep(1.5)
 else:
     time.sleep(1.5)
     driver.back()
     time.sleep(2)
     driver.back()
     time.sleep(2)

测试结果:

大功告成了,可以一边看别的一边等回复了!如果需要知道自己投递了多少和跟什么职位打招呼了,可以在详情页获取下元素,来获取详细的信息,这个就不多说了。

完整代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
# driver = Chrome(options=option)
url = 'https://login.zhipin.com/?ka=header-login'
driver = webdriver.Chrome(executable_path=r'C:\Users\lenovo\Desktop\chromedriver_win32\chromedriver.exe',options=option)

driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", 
                   { "source": """ Object.defineProperty(navigator, 'webdriver', { get: () => undefined }) """ 
                     })
driver.get(url)

def huakuai():
# id = driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[5]/div[1]').get_attribute('data-nc-idx')
# print(id)
# time.sleep(0.5)
# huakuai = driver.find_element_by_xpath('//*[@id="nc_{}_n1z"]'.format(id))
# action = ActionChains(driver)
# action.click_and_hold(huakuai).perform()
# time.sleep(1)
# for i in range(12):
#     action.move_by_offset(i, 0).perform()
# action.release().perform()
# action.release(on_element=huakuai).perform()
    pass
time.sleep(5)

driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[3]/span[2]/input').click()
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[3]/span[2]/input').send_keys('13401108846')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[4]/span/input').click()
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[4]/span/input').send_keys('ying5338619')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="wrap"]/div[2]/div[1]/div[2]/div/form/div[6]/button').click()
time.sleep(2)

driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[1]/div/form/div[1]/p/input').click()
driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[1]/div/form/div[1]/p/input').send_keys('爬虫')
driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[1]/div/form/button').click()
time.sleep(1)
liebiao_url = driver.current_url+'&page={}'
time.sleep(1)
for j in range(1,10):
    liebiao_url=liebiao_url.format(j)
    print(liebiao_url)
    driver.get(liebiao_url)
    time.sleep(1)
    print(driver.current_url)
    print("==========================")
    # print("列表链接",liebiao_url)
    # try:
    for i in range(1,30):
        if j==1:
            ActionChains(driver).move_to_element(driver.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[3]'.format(i))).perform()
            time.sleep(0.5)
            xiangqing_url = driver.find_element_by_xpath('//*[@id="main"]/div/div[3]/ul/li[{}]/div/div[1]/h3/a'.format(i)).get_attribute('href')
            # print(xiangqing_url)
        else:
            ActionChains(driver).move_to_element(
                driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[3]'.format(i))).perform()
            time.sleep(0.5)
            xiangqing_url = driver.find_element_by_xpath('//*[@id="main"]/div/div[2]/ul/li[{}]/div/div[1]/h3/a'.format(i)).get_attribute('href')

        driver.get(xiangqing_url)
        time.sleep(1)
        driver.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[3]/div[1]/a').click()
        time.sleep(0.5)
        print(driver.current_url)
        if 'https://www.zhipin.com/job_detail' in str(driver.current_url):
            driver.back()
            time.sleep(1.5)
        else:
            time.sleep(1.5)
            driver.back()
            time.sleep(2)
            driver.back()
            time.sleep(2)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
6 条评论
热度
最新
非技术人员看了一下午,也没研究明白……不会使用。
非技术人员看了一下午,也没研究明白……不会使用。
55点赞举报
不好意思,逻辑是自动化工具模拟投递,代码应该需要更新了
不好意思,逻辑是自动化工具模拟投递,代码应该需要更新了
回复回复点赞举报
就在此刻,我还在看你写的这篇文章,下载了“pycharm、Python、chromedriver”这几个工具,弄懂了“Selenium ”是干啥的,但具体操作还是卡壳的,如你所说大概是需要更新,那我就暂且不看了,谢谢你
就在此刻,我还在看你写的这篇文章,下载了“pycharm、Python、chromedriver”这几个工具,弄懂了“Selenium ”是干啥的,但具体操作还是卡壳的,如你所说大概是需要更新,那我就暂且不看了,谢谢你
回复回复点赞举报
查看全部5条回复
推荐阅读
编辑精选文章
换一批
[Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、鼠标操作)
Selenium是一款用于测试Web应用程序的经典工具,它直接运行在浏览器中,仿佛真正的用户在操作浏览器一样,主要用于网站自动化测试、网站模拟登陆、自动操作键盘和鼠标、测试浏览器兼容性、测试网站功能等,同时也可以用来制作简易的网络爬虫。
Eastmount
2021/12/02
5.2K0
[Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、鼠标操作)
selenium-携程酒店评论
最近好像对这方面需求比较高,总有人问我爬过携程没,我寻思着拿selenium也没太大难度吧,晚上就做了个demo。
李玺
2021/11/22
8240
selenium-携程酒店评论
selenium自动化测试报告_selenium自动化测试断言
注意:driver.close() ,当前关闭的是主窗口,只有完成页面切换才可以关闭当前新的页面
全栈程序员站长
2022/11/15
2.6K0
selenium自动化测试报告_selenium自动化测试断言
Python爬虫利器Selenium从入门到进阶
selenium是最广泛使用的开源Web UI自动化测试套件之一,它所支持的语言包括C++、Java、Perl、PHP、Python和Ruby,在数据抓取方面也是一把利器,能够解决大部分网页的反爬措施,当然它也并非是万能的,一个比较明显的一点就在于是它速度比较慢,如果每天数据采集的量并不是很高,倒是可以使用这个框架。
用户6888863
2021/12/10
1.8K0
Python爬虫利器Selenium从入门到进阶
(二)selenium的实际运用
上一篇我们已经知道怎么简单使用selenium了,那么我们就从这篇博客来动手爬取网站吧。
全栈程序员站长
2021/05/19
6650
Python爬虫(二十一)_Selenium与PhantomJS
本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。 Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的页面,甚至页面截屏,或
用户1174963
2018/01/17
2.8K0
Python爬虫(二十一)_Selenium与PhantomJS
Python Selenium库的使用「建议收藏」
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
全栈程序员站长
2022/07/29
4.5K0
Python Selenium库的使用「建议收藏」
python爬虫入门(五)Selenium模拟用户操作
爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争... 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库。 这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(xxx.xxx.xxx.xxx)这个用户,并且 user-agent 还是 Python-urllib/2.7 ,基于这两点判断非人类后直接在服务器上封杀。
zhang_derek
2018/04/11
2.6K0
python爬虫入门(五)Selenium模拟用户操作
用Selenium来爬取数据?真挺简单的!
于是Selenium就应运而生了,它可以算的上是自动化测试框架中的佼佼者,因为它解决了大多数用来爬取页面的模块的一个永远的痛,那就是Ajax异步加载 。今天将给大家详解如何用Selenium爬取数据,并最后附上一个真实的案例。
快学Python
2021/08/09
4.9K0
爬虫最终杀手锏 — PhantomJS 详解(附案例)
Selenium: 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 Phantomjs 的工具代替真实的浏览器。
全栈程序员站长
2022/09/06
2.4K0
七、Selenium与phantomJS----------动态页面模拟点击、网站模拟登录 每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) 每天一个小实例2(模拟网站登录)我用的是
每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) 1 from selenium import webdriver 2 from bs4 import BeautifulSoup 3 4 # 调用环境变量指定的PhantomJS浏览器创建浏览器对象 5 driver = webdriver.PhantomJS() 6 7 #访问的网址,我这里是登录的boss直聘 8 driver.get('https://www.zhipin.com/') 9 10 #模拟在搜索框输入
酱紫安
2018/04/16
2.4K0
七、Selenium与phantomJS----------动态页面模拟点击、网站模拟登录
		每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) 每天一个小实例2(模拟网站登录)我用的是
Selenium元素定位
find_element_by_id() find_element_by_name() find_element_by_class_name() find_element_by_tag_name() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_xpath() find_element_by_css_selector() 在这里将对各种元素定位方式统一使用百度首页进行示例,详细操作步骤有以下内容: 1.打开浏览器,进入百度首页(www.baidu.com); 2.百度页面输入关键字 www.testclass.cn 进行搜索; 3.关闭浏览器; 首先,通过前端工具(火狐浏览器的Firebug)或者直接按F12进入开发者模式查看具体前端代码:
Altumn
2019/10/21
1.2K0
Selenium元素定位
selenium使用
请注意,本文编写于 1727 天前,最后修改于 996 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
1.5K0
selenium使用
python selenium定位元素
查找元素: find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector 查找多个元素: find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector
用户5760343
2022/05/13
1.8K0
爬虫杀手锏-PhantomJS(附案列网站模拟登录豆瓣网)
Selenium: 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。
一墨编程学习
2018/12/14
1.4K0
actionchains 的用法_actions怎么才能使用
from selenium.webdriver.common.action_chains import ActionChains
全栈程序员站长
2022/08/03
9940
selenium模拟国航滑块验证码
临时起意,看到了中国国际航空公司的官网,想试着采集下航班信息,发现官网是有不少难度的,操作也比较麻烦。
李玺
2021/11/22
1.3K0
selenium模拟国航滑块验证码
FreeBuf官网发布《简易Python Selenium爬虫实现歌曲免费下载》
主要思路就是爬取播放页里的播放源文件的url,程序可以读取用户输入并返回歌单,,,因为在线网站包含大量js,requests就显得很无奈,又懒得手动解析js,于是寄出selenium大杀器。 selnium是一款很强大的浏览器自动化测试框架,直接运行在浏览器端,模拟用户操作,目前selenium支持包括IE,Firefox,Chrome等主流浏览器及PhantomJS之类的无头浏览器,selenium+phantomjs也是现在很火的一个爬虫框架。 代码不长,做的有些简陋,以后可以加个GUI
奶糖味的代言
2018/04/11
1.4K0
FreeBuf官网发布《简易Python Selenium爬虫实现歌曲免费下载》
Python-selenium进阶操作
drag_and_drop(element,target) 把某个元素从一个位置拖拽到目标地址
py3study
2020/01/07
8690
自动化-Selenium 3-常用API(Python版)
ActionChains类提供的鼠标事件常用方法(perform()执行所有ActionChains中存储的行为):
wangmcn
2022/07/22
1.5K0
自动化-Selenium 3-常用API(Python版)
推荐阅读
相关推荐
[Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、鼠标操作)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验