前一段时间用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. VIM快捷键(转)

    VIM快捷键:光标移动:四个方向   kh 0 l   j  ctrl+f, ctrl+b                 向下翻页,向上翻页  ctrl+d, ctrl+u              ...

  2. 转:如何找出发生SEGV内存错误的程序

    原文来自于:http://www.searchtb.com/2014/03/%E5%A6%82%E4%BD%95%E6%89%BE%E5%87%BA%E5%8F%91%E7%94%9Fsegv%E5% ...

  3. Windows Phone 学习笔记(一) 数据存储

    独立存储设置IsolatedStorageSetting private IsolatedStorageSettings _appSettings; public MainPage() { Initi ...

  4. BZOJ 1049 数字序列

    Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个数 ...

  5. db2索引创建和删除

    在表trpt_jv_rpt_log_td的tim列上创建索引 create index dw_rpt.irpt_jv_rpt_log_td_tim on dw_rpt.trpt_jv_rpt_log_ ...

  6. java中的string字符串中的trim函数的作用

    去掉字符串首尾空格 防止不必要的空格导致错误public class test{ public static void main(String[] args) { String str = " ...

  7. 我的VSTO之路(三):Word基本知识

    原文:我的VSTO之路(三):Word基本知识 在前一篇文章中,我初步介绍了如何如何开发一个VSTO程序,在本文中,我将进一步深入介绍Word的插件开发.Word是一个大家在日常工作中一直接触的文档工 ...

  8. .net ref关键字在引用类型上的使用

    只接上干货. namespace ConsoleApplication1 { class Person { public string UserName { get; set; } } class P ...

  9. Gvim自动编译运行c++11的程序

    gcc中对c++11的支持是默认不开启的,要想在实现对其的成功编译,需要添加参数-std=c++11: g++ -o test.exe test.cpp g++ -o test.exe test.cp ...

  10. 老毛桃U盘启动盘制作工具V20140501完美贡献版

    老毛桃U盘启动盘制作工具V20140501完美贡献版 下载地址:http://down.laomaotao.net:90/LaoMaoTao_V2014zhuangji.exe 老毛桃U盘装系统综合教 ...