让大蛇(Python)帮你找工作 之增强版
前一段时间用Python写了个简单的网络爬虫,可以从某个求职网站上根据预先设置的条件一次性的爬取所有的职位信息,最近对该程序进行了一下完善,主要包括如下内容
(1)可以对爬取的结果再进行筛选
例如,你开始预设的条件是“java高级软件工程师”,会列出很多java相关的职位,但是如果你只想看看ibm,hp,huawei这几家公司的职位信息,很多职位网站是不支持的。目前这只小虫子可以通过 FAV_COMPANY列表来赛选
(2)增加了职位的详细信息页面的URL
目前 列出了 职位名称,公司名称,详细信息URL
(3)增加了Email的功能
可以预先设置相关的邮箱配置,然后将搜索到的结果发送到邮箱,如果你有兴趣,可以再通过timer的方式,定期的对某个网站进行职位爬取,如果有合适的就发送到自己的邮箱,这样就不用天天登录网站进行查询了
下面是相关的代码,希望可以给你带来帮助,如果什么不足,欢迎反馈
'''
(1)FAV_COMPANY:列出了有兴趣的公司名称,如果为空将会列出所有的公司
(2)可以将结果发送到制定的邮箱
''' import urllib.request
import re
import smtplib
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText #计数器
PAGE_NUMBER = 1
TOTAL_JOB_COUNT = 0;
#搜索内容以及打印的配置
FAV_COMPANY = []
#FAV_COMPANY = ['IBM', 'HP', '华为', '腾讯']
JOB_NAME_TITLE = "职位名称:"
COM_NAME_TITLE = "公司名称:"
DETAIL_TITLE = "明细页面:"
NEED_SEND_EMAIL=True
#邮件的相关配置
FROM_EMAIL_ADDRESS = "test@126.com"
TO_EMAIL_ADDRESS = "test@gmail.com"
CC_EMAIL_ADDRESS = "test@gmail.com"
ATT_FILE_NAME="job_infor.txt"
SMTP_SERVER = "smtp.126.com"
SMTP_USER_NAME = 'test'
SMTP_USER_PASSWORD = 'test' def filter_job(url):
#Python 3.X 必须用 urllib.request打开一个URL
text = urllib.request.urlopen(url).read().decode("gbk")
page_navi(text) #页面跳转
def page_navi(page_source):
#第一页直接获取信息
extract_job_info(page_source)
#"下一页"链接的正则
next_page_regular = r'</td><td><a href=(.*?)class="orange1".+?style=.*?>(.*?)<img .*?pageron.gif.*? />.*?</a></td></tr>'
next_pagelink_set = re.findall(next_page_regular, page_source)
if len(next_pagelink_set) > 0:
#如果需要更改全局变量,则需要先用global来声明
global PAGE_NUMBER
PAGE_NUMBER = PAGE_NUMBER + 1
print("#"*10 , "Page Number:", str(PAGE_NUMBER) , "#"*10, "Record Number:", TOTAL_JOB_COUNT)
next_url = next_pagelink_set[0][0].split('"')[1]
#解析出"下一页"按钮对应的链接,然后递归调用
filter_job(next_url) #内容抽取
def extract_job_info(page_source):
#职位名称的正则
job_name_reqular = r'<a .*? class="jobname" .*>(.*?)</a>'
#公司名称以及明细页面的正则
com_name_reqular = r'<a href=(.*?) class="coname" target="_blank".*>(.*?)</a>'
job_name_set = re.findall(job_name_reqular, page_source)
com_name_set = re.findall(com_name_reqular, page_source)
global TOTAL_JOB_COUNT
TOTAL_JOB_COUNT = TOTAL_JOB_COUNT + len(com_name_set)
#使用zip()对结果进行展示
job_information=open(ATT_FILE_NAME,'w+')
for job_name, com_name in zip(job_name_set, com_name_set):
if len(FAV_COMPANY) > 0:
for expected_com_name in FAV_COMPANY:
if expected_com_name.lower() in com_name[1].lower():
#send_email(job_name, com_name)
deal_with_result(job_name, com_name,job_information)
else:
deal_with_result(job_name, com_name,job_information)
job_information.close() def email():
if NEED_SEND_EMAIL:
time.asctime(time.localtime(time.time()))
subject=time.asctime(time.localtime(time.time()))+" job information"
content=subject
if len(FAV_COMPANY) >0:
content=content+"\n fav company list is "+ str(FAV_COMPANY)
send_email(subject,content) #对进过处理
def deal_with_result(job_name, com_name,job_information):
print(JOB_NAME_TITLE, job_name)
print(COM_NAME_TITLE, com_name[1])
print(DETAIL_TITLE, com_name[0], "\n")
if NEED_SEND_EMAIL: job_information.writelines(JOB_NAME_TITLE+job_name)
job_information.writelines(COM_NAME_TITLE+com_name[1])
job_information.writelines(DETAIL_TITLE+com_name[0]+"\n") def send_email(subject, content):
msg = MIMEMultipart()
msg['From'] = FROM_EMAIL_ADDRESS
msg['To'] = TO_EMAIL_ADDRESS
msg['Cc'] = CC_EMAIL_ADDRESS
msg['Subject'] = subject
# add content
txt = MIMEText(content, 'html', 'utf-8')
msg.attach(txt)
# add attach file
fileName = ATT_FILE_NAME
att = MIMEText(open(fileName, 'rb').read(), 'base64', 'gb2312')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="attch.txt"'
msg.attach(att)
# send email
smtp = smtplib.SMTP(SMTP_SERVER)
smtp.set_debuglevel(1)
smtp.login(SMTP_USER_NAME, SMTP_USER_PASSWORD)
smtp.sendmail(FROM_EMAIL_ADDRESS, TO_EMAIL_ADDRESS, msg.as_string())
smtp.quit()
print("send successful") #发送邮件的测试方法
def test_send_email():
for i in range(100):
subject = "Python test email:" + str(i);
content = "<br/><font size=\"2\" face=\"Verdana\"><b>" + "This is contents" + str(i) + "</b></font><br/>"
send_email(subject, content) #正则表达式的测试方法
def test_regular():
url_reqular = r'<a.*?class="coname".*?target="_blank".*?href=(.*?)>(.*?)</a>'
url = "<a class=\"coname\" target=\"_blank\" href=http://search.job.com/list/co,c,2766722,000000,10,1.html>上海锐格软件有限公司</a>dddd"
print("URL:", re.findall(url_reqular, url)) #entrance function
if __name__ == "__main__":
#输入一定条件后,结构列表的首页URL,只要输入这个作为条件
url='''http://search.job.com/jobsearch/search_result.php?fromJs=1&jobarea=180200%2C00&funtype=0000&industrytype=00&keyword=python&keywordtype=2&lang=c&stype=1&postchannel=0000&fromType=23'''
filter_job(url)
email()
让大蛇(Python)帮你找工作 之增强版的更多相关文章
- 让大蛇(Python)帮你找工作
前段时间用Python实现了一个网络爬虫(让大蛇(Python)帮你找工作),效率总体还可以,但是缺点就是每次都需要手动的去触发,于是打算对该爬虫加上Timer,经过网上一番搜索以及API的查询,发现 ...
- 【招聘】滴滴滴~ i春秋内推直通车来咯,帮你找工作!
凑是这么简单粗暴,i春秋冬日特享福利!虽然金九银十已经过去,但素想换工作想找工作的小哥哥小姐姐看过来! [职位方向]渗 透 测 试.代 码 审 计.安全开发.病毒分析.风险控制.安全运维.....任何 ...
- MonkeyRunner执行Python脚本实例——发送短信增强版
很久之前就写好的了,准备写个自动执行Monkey的脚本时才想到去找它,还是写在博客里找起来方便. 这次更新了批处理自动连接设备后执行Py脚本,结构如下图: 其中shotscreen为存放截图文件夹,s ...
- 金三银四科学找工作,用python大数据分析一线城市1000多份岗位招聘需求
文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 每年的三四月份是招聘高峰,也常被大家称为金三银四黄金招聘期,这时候上一 ...
- Python学到什么程度就可以去找工作?掌握这4点足够了!
大家在学习Python的时候,有人会问“Python要学到什么程度才能出去找工作”,对于在Python培训机构学习Python的同学来说这都不是问题,因为按照Python课程大纲来,一般都不会有什么问 ...
- Python学到什么程度才可以去找工作?掌握这4点足够了!
大家在学习Python的时候,有人会问"Python要学到什么程度才能出去找工作",对于在Python培训机构学习Python的同学来说这都不是问题,因为按照Python课程大纲来 ...
- 求职,找工作,平台大PK
国内 猎聘网:www.lietou.com 拉钩网:Lagou.com 智联招聘:www.zhaopin.com 前程无忧:http://www.51job.com/ 中华英才网:chinahr.co ...
- [Job] 找工作小结
有近2个月没有更新博客,主要精力放在了投递会议论文和秋招找工作方面.这里简单总结一下秋招笔试面试的几点建议和感受. 投递的NLP算法工程师岗位,主要参加过面试的公司有腾讯(春招),蚂蚁金服(春招),追 ...
- Java培训班学员如何找工作?如何过试用期?
在本文里,首先将结合我了解的多家培训班辅导学员就业的情况,来讲讲培训班学员如何高效找工作.由于本人在周末会兼职在培训班讲课,也帮助过不少学员成功入职,所以下文还会给出"培训班学员如何快速适应 ...
随机推荐
- 【BZOJ2281】【博弈论+DP】 [Sdoi2011]黑白棋
Description 黑白棋(game) [问题描述] 小A和小B又想到了一个新的游戏. 这个游戏是在一个1*n的棋盘上进行的,棋盘上有k个棋子,一半是黑色,一半是白色. 最左边是白色棋子,最右边是 ...
- login-登录
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...
- CentOS 6.5 IP 设置
DEVICE=eth0TYPE=EthernetUUID=7d6d54e0-054d-472b-8cc1-080f16ef36c1ONBOOT=yesNM_CONTROLLED=yesBOOTPROT ...
- PHP数据库
目录 1.创建数据库连接 2.创建数据库 3.选择数据库 4.设置当前连接使用的字符编码 5.创建表 6.插入数据 7.取得数据查询结果 8.关闭连接 1.创建数据库连接 //mysql_connec ...
- IOS 命令行安装备忘
1. 首先要越狱 2. 新增BIGBOSS或者苹果核的源 3. 安装MobileTerminal和MobileTerm Backgrounder (用于后台运行命令),最好r520以上版本,R530还 ...
- unix 环境高级编程-读书笔记与习题解答-第二篇
第四节 输入与输出 上次的笔记中写到的 open, read, write, lseek 以及close ,都是不带缓存的IO函数,这些函数都使用文件描述符进行工作. 上一篇笔记用到的 read(ST ...
- JSP语法
第3章 JSP语法 [本章专家知识导学] JSP是建立在Java语言基础上的一种Web程序设计语言,具有自己特有的用法和指令.本章首先介绍JSP页面的程序结构,然后讲述JSP程序中经常用到基本的面向 ...
- Node.js事件循环
Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...
- Java Socket Example
1.服务端:server package com.socket; import java.io.BufferedReader; import java.io.IOException; import j ...
- myeclipse spket spket-1.6.23.jar 破解安装教程
一年前安装文档就写过了,今天写破解文档,本来开发js/ext是想用aptana的,但是安装包100多M,我还是用spket吧(才11M),这个需要破解一下license,否则用不了. 一 安装教程如下 ...