叮!你的校招提醒微信机器人已上线!

招聘季即将到来,如何实时的得知招聘信息呢?自然是爬虫+微信了。

这几日在票圈和各微信群看到大家疯狂刷“京东”、“腾讯”等秋招类的“广告”,我对这些营销方式存怀疑态度,觉得一定不是官方的!总感觉有恶意营销在里面。
有需求就有市场,为什么不自己写一个校招提醒机器人呢?简单的想了下,爬虫+微信模式应该是最好的搭配了。

使用方法

先说使用方法,再讲原理。
386754908630342029.jpg

  • 打开微信扫一扫,扫描上方二维码
  • 添加它为好友
  • 接受它发出的群聊邀请(自动邀请功能暂时取消,请告诉它要进哪个群,后面统一拉)
  • 每日更新招聘会信息(现阶段仅支持西电就业信息网招聘会信息)

效果

微信图片_20180613201454.jpg

这是一个西电求职交流群,大家有更好的招聘信息也可以甩到群里。

原理

原理主要分为两部分:爬虫+微信机器人。

爬虫

讲道理西电就业信息应该挺好爬的吧,网站虽然丑一点,但是内容才是最重要的。就用最简单的请求方式去获取网站内容,居然Forbidden了。
26475337410507141.png
那好吧,只能伪装浏览器了。

1
2
headers = {'User-Agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0'}
req = urllib.request.Request(url=url,headers=headers)

这样就ok。

完整的抓取网站信息代码:

1
2
3
4
5
6
7
8
9
10
def getPageContent(url):
headers = {'User-Agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0'}
req = urllib.request.Request(url=url,headers=headers)
try:
res = urllib.request.urlopen(req)
except urllib.error.URLError as e:
return e
page_content = res.read()
page_content=BeautifulSoup(page_content,"lxml")
return page_content

就业信息网长这样:
image.png
北校区招聘会信息的table长这样:
image.png
找到标签那就剥洋葱的爬呗:

1
2
3
4
5
6
7
8
9
def getJobInfo(page_content):
job_content = page_content.find("table", {"class": "zphTable"})
rows = job_content.findAll("tr")[1:]
job_info=[]
for row in rows:
for cell in row.findAll('td'):
info=cell.get_text()
job_info.append(info)
return job_info

南校区的信息结构和北校区一样,同样试用上面的程序。

对于爬虫的招聘会信息还需做处理,用于后面微信发送。
处理的代码:

1
2
3
4
5
6
7
8
9
10
11
12
def xdjob(jobinfo):
urlN = 'http://job.xidian.edu.cn/html/zpxx/bxqzph/'
urlS = 'http://job.xidian.edu.cn/html/zpxx/nxqzph/'
page_contentN=getPageContent(urlN)
page_contentS=getPageContent(urlS)
job_infoN=["【北校区招聘会信息】"]+getJobInfo(page_contentN)
job_infoS=["【南校区招聘会信息】"]+getJobInfo(page_contentS)
job_info = job_infoS+job_infoN
jobinfo='『本条由机器喵自动发出,是个机器人大家勿撩哦』'+"\n"
for i in job_info:
jobinfo=jobinfo+ "\n" +i
return jobinfo

至此,爬虫的工作已完成。

微信机器人

之前微信好友分析使用过itchat,真的是非常好的一个库。

这次要做的工作简单点,找到指定的群聊名,将爬取的就业信息发送即可。

1
2
3
4
5
6
7
8
9
10
11
def wx(jobinfo2):
itchat.auto_login(hotReload = True)# 可设置hotReload = True
i=itchat.get_chatrooms(update=True)
name = "西电求职交流群"
iRoom = itchat.search_chatrooms(name)
for room in iRoom:
if room['NickName'] == name:
userName = room['UserName']
break
itchat.send_msg(jobinfo2, userName)

具体的工作流程为:

  • 登录微信
  • 获取所有群聊名称
  • 匹配要发送信息的微信群
  • 发送指定信息

至此爬虫+微信机器人的工作均已完成。
可是总不能天天手动去运行程序吧,那我为什么不去看就业信息网站上的信息呢。
做程序员呢,最重要的就是一定要懒。
设置一个定时器呗,每天运行一次。基本上就能满足需求了。

1
2
3
4
5
6
def timer(n):
itchat.auto_login(hotReload=True) # 可设置hotReload = True
while True:
jobinfo=''
wx(xdjob(jobinfo))
time.sleep(n)

这样就行了,主程序运行timer(86400),每日更新一波。最后再部署到云服务器就好了。

最后

这点信息总感觉太少,还望大家多多提供点靠谱的招聘信息网站,有兴趣的也可以联系我,一起把这个功能丰富起来。
方便他人,方便自己。

V1.2

同学给的几点建议:

  • 去掉过期的招聘会信息
  • 增加交大、西工大的招聘会信息
  • 增加应届生招聘网站上的信息

我是从西电就业信息网直接爬取,网站上的信息并为做过期处理。
这样一想有没有可能从其他招聘网站上抓取第二手信息呢,他们应该做过处理。
果不其然,海投网!直接解决了第一第二点的建议。
上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def xdjob(jobinfo):
urlXD = 'https://xjh.haitou.cc/xa/uni-29'
urlXJ = 'https://xjh.haitou.cc/xa/uni-27'
urlGD = 'https://xjh.haitou.cc/xa/uni-28'
urlEnterprise='http://www.yingjiesheng.com/2019/'
page_contentN=getPageContent(urlXD)
page_contentS=getPageContent(urlXJ)
page_contentG = getPageContent(urlGD)
job_infoXD=["--------------------"+"\n"+"【西电招聘会信息】"]+getJobInfo(page_contentN)
job_infoXJ=["--------------------"+"\n"+"【西交招聘会信息】"]+getJobInfo(page_contentS)
job_infoGD = ["--------------------"+"\n"+"【瓜大招聘会信息】"] + getJobInfo(page_contentG)
job_info = job_infoXD+job_infoXJ+job_infoGD
jobinfo='『今日招聘信息,以下数据为机器喵自动获取,仅供参考。有任何问题请艾特我群主爸爸@肖洒』'+"\n"
for i in job_info:
jobinfo=jobinfo+ "\n" +i
jobinfo=jobinfo + "\n"+"--------------------"+"\n"+"【名企2019校园招聘进度表】" + getEnter(urlEnterprise)
return jobinfo

完美!
关于第三点,这个应届生的网站真心写的好乱。。不过不能扒的网站呢!
上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def getEnter(urlEnterprise):
page_content = getPageContent(urlEnterprise)
job_content = page_content.findAll("div", {"class": "s_clear tit floatl"})[2:]
job_info = []
for div in job_content:
url = div.a.attrs["href"]
if url[:4] == "http":
pass
else:
url = "http://www.yingjiesheng.com" + url
info = div.get_text() + "\n"+ url
job_info.append(info)
jobinfo = ""
for i in job_info:
jobinfo = jobinfo + "\n" + i
return jobinfo

最后现在的效果:
7213390981083791.jpg

V1.3

遇到的问题

西电这几日没有招聘会信息发布,所以西电部分的爬虫抛出异常。
已解决,修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def xdjob(jobinfo):
urlXD = 'https://xjh.haitou.cc/xa/uni-29'
urlXJ = 'https://xjh.haitou.cc/xa/uni-27'
urlGD = 'https://xjh.haitou.cc/xa/uni-28'
urlEnterprise='http://www.yingjiesheng.com/2019/'
try:
page_contentN=getPageContent(urlXD)
job_infoXD=["--------------------"+"\n"+"【西电招聘会信息】"]+getJobInfo(page_contentN)
except:
job_infoXD=["--------------------"+"\n"+"【西电今日无招聘会信息哦】"]
try:
page_contentS=getPageContent(urlXJ)
job_infoXJ=["--------------------"+"\n"+"【西交招聘会信息】"]+getJobInfo(page_contentS)
except:
job_infoXJ=["--------------------"+"\n"+"【西交今日无招聘会信息哦】"]
try:
page_contentG = getPageContent(urlGD)
job_infoGD = ["--------------------"+"\n"+"【瓜大招聘会信息】"] + getJobInfo(page_contentG)
except:
job_infoXJ=["--------------------"+"\n"+"【瓜大今日无招聘会信息哦】"]
job_info = job_infoXD+job_infoXJ+job_infoGD
jobinfo='『今日招聘信息,以下数据为机器喵自动获取,仅供参考。有任何问题请艾特我群主爸爸@肖洒』'+"\n"
for i in job_info:
jobinfo=jobinfo+ "\n" +i
# jobinfo=jobinfo + "\n"+"--------------------"+"\n"+"【名企2019校园招聘进度表】" + getEnter(urlEnterprise)
return jobinfo

V1.4

遇到的问题

由于itchat的问题,网页版微信并不能一直保持在线,导致定时发送服务总是因为掉线而抛出异常。
解决办法:itchat在移动端微信保持稳定登录的情况下,30分钟内是可以保证在线的。所以想到每30分钟发一次信息,保持登录的状态,每24小时给求职群里发一次招聘会信息。具体实现方法:

1
2
3
4
5
6
7
8
9
10
11
n=0
while True:
itchat.auto_login(hotReload=True) # 可设置hotReload = True
wx('TEST','别玩手机哦')
timer(1800)
n=n+1
print("循环到第:"+str(n)+"次,还剩"+str(48-n)+"次即可触发爬虫")
while n == 48 :
jobinfo=""
wx('西电求职交流群',xdjob(jobinfo))
n=0

V2.0

增加睿思的招聘信息

这几天已经用获得的招聘信息疯狂投递简历了。为了丰富招聘信息,根据之前的经验和代码,整合了下,抓取睿思校园招聘板块的信息,进行处理后进行微信发送。
睿思板块抓取的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def rs():
pageURL = set()
job_rs = '『睿思校园招聘信息,机器喵自动获取,仅供参考』'
for i in range(1, 2):
pages = 'http://rsbbs.xidian.edu.cn/forum.php?mod=forumdisplay&fid=554&page=' + str(i) + '&mobile=2'
if pages not in pageURL:
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': r'http://rsbbs.xidian.edu.cn',
'Connection': 'keep-alive'}
req = request.Request(pages, headers=headers)
html = request.urlopen(req)
bsObj = BeautifulSoup(html.read(), "lxml")
tiezi = bsObj.findAll("ul")
for tiaos in tiezi:
for tiao in tiaos.findAll('a'):
for person in tiao.findAll('span', attrs={'class': "by"}):
T = person.get_text().strip()
[s.extract() for s in tiao.findAll('span', attrs={'class': "by"})]
P = tiao.get_text().strip() + "﹝详细信息﹞:"
job_rs = job_rs + "\n" + str(P)
if 'href' in tiao.attrs:
try:
tiao_links = "http://rsbbs.xidian.edu.cn/" + tiao.attrs['href']
tiao_html = urlopen(tiao_links)
job_rs = job_rs + "\n" + str(tiao_links)
tiao_bsObj = BeautifulSoup(tiao_html.read(), "lxml")
content = tiao_bsObj.findAll("div", {"class": "message"})[0]
R = content.get_text().strip()
except (ValueError, IndexError) as e:
pass
pageURL.add(pages)
time.sleep(3) # 设置时间间隔为3秒
return job_rs

得到的信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
『睿思校园招聘信息,机器喵自动获取,仅供参考』
阿里巴巴数据技术及产品部-校园交流﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951547&extra=page%3D1&mobile=2
阿里-菜鸟2018年网络测试开发工程师部门直招﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951510&extra=page%3D1&mobile=2
(散金币)百度搜索公司SRE团队2019年校招提前批﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951473&extra=page%3D1&mobile=2
错投男儿胎,找个家教兼职都这么难(都要求女生)﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951464&extra=page%3D1&mobile=2
阿里巴巴菜鸟 测试开发工程师 内推招聘﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951463&extra=page%3D1&mobile=2
乐馨托管招聘作业辅导老师一名﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951461&extra=page%3D1&mobile=2
[散金币] 西安葡萄城信息技术有限公司2019校园招聘﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951451&extra=page%3D1&mobile=2
西安诺瓦科技2019届提前批校招开始啦,与独角兽一起开疆拓土~~~~~﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951338&extra=page%3D1&mobile=2
平安租赁招实习生啦﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951331&extra=page%3D1&mobile=2
新校区附近寻找初中家教找初中家教﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951299&extra=page%3D1&mobile=2
拼多多技术校招内推﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951283&extra=page%3D1&mobile=2
百度招实习生﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951276&extra=page%3D1&mobile=2
【散金币】西安闻泰电子科技有限公司人力资源2018校园招聘﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951258&extra=page%3D1&mobile=2
拼多多2019届 校招开始啦!﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951250&extra=page%3D1&mobile=2
乐馨托管招作业辅导老师一名﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951246&extra=page%3D1&mobile=2
【找家教】给高一的两个孩子找家教﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951235&extra=page%3D1&mobile=2
「商务运营实习」「网联」「央行、阿里、腾讯、京东入股企业」「北京」﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951189&extra=page%3D1&mobile=2
老校区附近想找份家教工作,初高中数学理综均可﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951184&extra=page%3D1&mobile=2
招女生家教﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951181&extra=page%3D1&mobile=2
招募一名会微信小程序的同学开发一个公众号,报酬丰厚﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951140&extra=page%3D1&mobile=2
【金币】【招兼职老师】短期老师﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951096&extra=page%3D1&mobile=2
【散金币】+家教咯,初三英语、数学、物理、化学﹝详细信息﹞:
http://rsbbs.xidian.edu.cn/forum.php?mod=viewthread&tid=951023&extra=page%3D1&mobile=2

遇到的问题

之前循环时间,然后触发程序有些鸡肋。进行了新的改动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while True:
# itchat.auto_login(hotReload=True) # 可设置hotReload = True
jobinfo = ""
time_now = time.strftime('%H%M',time.localtime(time.time()))
if int(time_now) == 1000:
wx('西电招聘信息发布群1', xdjob(jobinfo))
time.sleep(30)
wx('西电招聘信息发布群1', rs())
time.sleep(30)
wx('西电招聘信息发布群2', xdjob(jobinfo))
time.sleep(30)
wx('西电招聘信息发布群2', rs())
time.sleep(30)
elif int(time_now) % 10 == 0:
wx('TEST', time_now)
time.sleep(60)
else:
timer(60)

采用检测本地时间来进行触发。Itchat有个问题不好处理,会时长掉线,查过很多资料好像并不能很好的解决这个问题。所以,为了保证网页版微信的登录状态,每隔十分钟会给一个TEST群里发送信息。这个方法可以保证一段时间的登录状态。但是还是会一段时间后LOG OUT。现在的原因还未能知晓,此bug需要后面解决。

V2.1

是什么驱动要一直去写代码,有一大部分是强迫症!!!
上面招聘信息的链接也太长了吧,在微信里看起来好烦。
所以,缩短的网址,看这里。Python3五行代码实现缩短网址功能
实现的效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
『睿思校园招聘信息,机器喵自动获取,仅供参考』
客服﹝详细信息﹞:
http://tinyurl.com/y77mdy7q
阿里巴巴数据技术及产品部-校园交流﹝详细信息﹞:
http://tinyurl.com/y7vmoaqr
阿里-菜鸟2018年网络测试开发工程师部门直招﹝详细信息﹞:
http://tinyurl.com/yc9xe4eu
(散金币)百度搜索公司SRE团队2019年校招提前批﹝详细信息﹞:
http://tinyurl.com/y753gupt
错投男儿胎,找个家教兼职都这么难(都要求女生)﹝详细信息﹞:
http://tinyurl.com/y7fdybjh
阿里巴巴菜鸟 测试开发工程师 内推招聘﹝详细信息﹞:
http://tinyurl.com/ybwj6dq8
乐馨托管招聘作业辅导老师一名﹝详细信息﹞:
http://tinyurl.com/y73cuhfv
[散金币] 西安葡萄城信息技术有限公司2019校园招聘﹝详细信息﹞:
http://tinyurl.com/y8w43yap
西安诺瓦科技2019届提前批校招开始啦,与独角兽一起开疆拓土~~~~~﹝详细信息﹞:
http://tinyurl.com/y85atskf
平安租赁招实习生啦﹝详细信息﹞:
http://tinyurl.com/y77fak6z
新校区附近寻找初中家教找初中家教﹝详细信息﹞:
http://tinyurl.com/ya9lxcvw
拼多多技术校招内推﹝详细信息﹞:
http://tinyurl.com/ya2plpp7
百度招实习生﹝详细信息﹞:
http://tinyurl.com/y9bpe4z2
【散金币】西安闻泰电子科技有限公司人力资源2018校园招聘﹝详细信息﹞:
http://tinyurl.com/ybgurcyz
拼多多2019届 校招开始啦!﹝详细信息﹞:
http://tinyurl.com/y94ypr6b
乐馨托管招作业辅导老师一名﹝详细信息﹞:
http://tinyurl.com/yc67fjvp
【找家教】给高一的两个孩子找家教﹝详细信息﹞:
http://tinyurl.com/yc9lldzl
「商务运营实习」「网联」「央行、阿里、腾讯、京东入股企业」「北京」﹝详细信息﹞:
http://tinyurl.com/ycvh4qdc
老校区附近想找份家教工作,初高中数学理综均可﹝详细信息﹞:
http://tinyurl.com/y9tbfxkv
招女生家教﹝详细信息﹞:
http://tinyurl.com/y7u63n68
招募一名会微信小程序的同学开发一个公众号,报酬丰厚﹝详细信息﹞:
http://tinyurl.com/y9c6zwkz
【金币】【招兼职老师】短期老师﹝详细信息﹞:
http://tinyurl.com/ybo7araq

V2.2 7.22

遇到的问题

不能保持登录的问题。
我是傻子,大傻子。为什么不能分清if 和 switch的功能!!!

我把测试保持登录的if 放到最前面就好了啊!!

V3.0

增加了西电就业信息网的信息发布。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
今日西电就业信息网信息
[机器喵自动获取,仅供参考]
有问题请艾特群主@肖洒
更多有意思的小玩意
https://x-nicolo.github.io/
--------------------
2019吉利全球校园招聘秋招校园大使招募﹝详细信息﹞:
http://tinyurl.com/y9snhhlw
北京银通智博科技有限公司﹝详细信息﹞:
http://tinyurl.com/yb79rxgd
作业帮教育科技(北京)有限公司﹝详细信息﹞:
http://tinyurl.com/ybxefd9l
西安华线石油科技有限公司﹝详细信息﹞:
http://tinyurl.com/y9rs7rhx
大连探索者科技有限公司﹝详细信息﹞:
http://tinyurl.com/y7ew69lq
网易云音乐校园招聘﹝详细信息﹞:
http://tinyurl.com/yb4nuuyg
深圳零壹空间电子有限公司﹝详细信息﹞:
http://tinyurl.com/y8b464pp
文职招考,战略支援部队某部邀你到古城西安来﹝详细信息﹞:
http://tinyurl.com/y8wwmhkg
北京翔仪恒昌科技有限公司﹝详细信息﹞:
http://tinyurl.com/ybjo2mmf
保定市冀能电力自动化设备有限公司﹝详细信息﹞:
http://tinyurl.com/yanj2rzg

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def xdjobs():
job_rs = '🔴就业信息网最新10条信息'+"\n"+'[机器喵自动获取,仅供参考]'+"\n"+'有问题请艾特群主@肖洒'+"\n"+'更多有意思的小玩意'+"\n"+'👉https://x-nicolo.github.io/'+"\n"+"--------------------"+"\n"
url = 'http://job.xidian.edu.cn/html/zpxx/jobs/'
headers = {'User-Agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0'}
req = urllib.request.Request(url=url,headers=headers)
res = urllib.request.urlopen(req)
page_content = res.read()
page_content=BeautifulSoup(page_content,"lxml")
job_content = page_content.find("div", {"class": "content"})
rows = job_content.findAll("span")
job_info=[]
for row in rows:
for cell in row.findAll('a'):
info=cell.get_text()
P = cell.get_text().strip() + "﹝详细信息﹞:"
job_rs = job_rs + "\n" + str(P)
tiao_links = "http://job.xidian.edu.cn" + cell.attrs['href']
job_rs = job_rs + "\n" +str(make_tiny(tiao_links))
return job_rs
谢谢你请我吃糖果!