前一段时间用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)帮你找工作 之增强版的更多相关文章

  1. 让大蛇(Python)帮你找工作

    前段时间用Python实现了一个网络爬虫(让大蛇(Python)帮你找工作),效率总体还可以,但是缺点就是每次都需要手动的去触发,于是打算对该爬虫加上Timer,经过网上一番搜索以及API的查询,发现 ...

  2. 【招聘】滴滴滴~ i春秋内推直通车来咯,帮你找工作!

    凑是这么简单粗暴,i春秋冬日特享福利!虽然金九银十已经过去,但素想换工作想找工作的小哥哥小姐姐看过来! [职位方向]渗 透 测 试.代 码 审 计.安全开发.病毒分析.风险控制.安全运维.....任何 ...

  3. MonkeyRunner执行Python脚本实例——发送短信增强版

    很久之前就写好的了,准备写个自动执行Monkey的脚本时才想到去找它,还是写在博客里找起来方便. 这次更新了批处理自动连接设备后执行Py脚本,结构如下图: 其中shotscreen为存放截图文件夹,s ...

  4. 金三银四科学找工作,用python大数据分析一线城市1000多份岗位招聘需求

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 每年的三四月份是招聘高峰,也常被大家称为金三银四黄金招聘期,这时候上一 ...

  5. Python学到什么程度就可以去找工作?掌握这4点足够了!

    大家在学习Python的时候,有人会问“Python要学到什么程度才能出去找工作”,对于在Python培训机构学习Python的同学来说这都不是问题,因为按照Python课程大纲来,一般都不会有什么问 ...

  6. Python学到什么程度才可以去找工作?掌握这4点足够了!

    大家在学习Python的时候,有人会问"Python要学到什么程度才能出去找工作",对于在Python培训机构学习Python的同学来说这都不是问题,因为按照Python课程大纲来 ...

  7. 求职,找工作,平台大PK

    国内 猎聘网:www.lietou.com 拉钩网:Lagou.com 智联招聘:www.zhaopin.com 前程无忧:http://www.51job.com/ 中华英才网:chinahr.co ...

  8. [Job] 找工作小结

    有近2个月没有更新博客,主要精力放在了投递会议论文和秋招找工作方面.这里简单总结一下秋招笔试面试的几点建议和感受. 投递的NLP算法工程师岗位,主要参加过面试的公司有腾讯(春招),蚂蚁金服(春招),追 ...

  9. Java培训班学员如何找工作?如何过试用期?

    在本文里,首先将结合我了解的多家培训班辅导学员就业的情况,来讲讲培训班学员如何高效找工作.由于本人在周末会兼职在培训班讲课,也帮助过不少学员成功入职,所以下文还会给出"培训班学员如何快速适应 ...

随机推荐

  1. 第八篇、SVN在Mac上使用

    Mac自带svn软件 1.创建目录 svn-repository/source-code 2.svnadmin create /Users/liaokailin/svn-repository/sour ...

  2. ExtJs4 学习3 combox自动加载的例子

    Ext.onReady(function() {   delivery_datas = [{ "Id" : "1", "Name" : &q ...

  3. 《作业控制系列》-“linux命令五分钟系列”之十

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...

  4. chromedriver release note

    ----------ChromeDriver v2.25 (2016-10-25)---------- Supports Chrome v53-55 Resolved issue 1547: Chro ...

  5. bootstrap-datetimepicker配置选项

    依赖 需要bootstrap的下拉菜单组件 (dropdowns.less) 的某些样式,还有bootstrap的sprites (sprites.less and associated images ...

  6. delphi中DLL编程详解

    10.1 Windows的动态链接库原理 动态链接库(DLLs)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中,同时用户也可以用LIB程序创建自己的函 ...

  7. PHP Cookie学习

    <?php /* Cookie在计算机中保存的格式 用户名@网站地址[数字].txt Cookie在文件夹下,每个Cookie文件都是一个简单而又普通的文件件而不是程序,Cookie中的内容大多 ...

  8. C语言结构体(struct)使用方法

    基本定义:结构体,通俗讲就像是打包封装,把一些变量有共同特征(比如同属于某一类事物的属性)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 struct stuf ...

  9. Resilio-sync auto restart

    syncheck.sh #!/bin/sh if [ $(pgrep xxxrslsync) ]; then echo && date >> /home/pi/sync/s ...

  10. SVN版本回滚~

    如果你在svn上对文件进行编辑作了修改,想撤销,那么有两种方法可以还原:1) svn revert <yourfile>2) 手动删除该文件,重新执行svn up(rm <yourf ...