前一段时间用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. iOS打包ipa 让别人设备安装你的App

    首先推荐一本书<一步一步学习iOS 5编程(第二版) – PDF 中文版>在一本学习IOS入门很不错的书籍,目前,这是第一本介绍iOS 5.x 和 Xcode 4.3 的中文版书籍,尤其适 ...

  2. get方式编码问题解决方案 转载

    我们的内容使用GET方式发送,就会在URL后面带上内容,在游览器发来的请求经过了游览器的URI编码,发送到服务器这边,如果是struts2会经过拦截器进行URI解码,并且使用"iso8859 ...

  3. js submit的問題

    form 里面有input name="submit"的时候 $('#seachform').submit();不起作用

  4. Linux系统分区

    在Linux系统里面,"分区",被称作"挂载点" 挂载点 意思就是把一部分硬盘容量,分成一个文件夹的形式,用来做某些事情,这个文件夹的名字,就叫做:挂载点 (如 ...

  5. 黑马程序员—C语言的特点和关键字

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- C语言的简介 一. C语言具有下列特点: C语言既具有低级语言直接操纵硬件的特点,又具有高级语言 ...

  6. bzoj3541: Spoj59 Bytelandian Information Agency

    Description        BIA机构内部使用一个包含N台计算机的网络.每台计算机被标号为1..N,并且1号机是服务器.计算机被一些单向传输线连接着,每条数据线连接两台计算机.服务器可以向任 ...

  7. iscc2016-好长的字符串

    Vm0wd2QyVkhVWGhVYmxKV1YwZDRXRmxVUm5kVlJscHpXa2M1VjFKdGVGWlZNbmhQWVd4YWMxZHViRmROYWxaeVdWZDRZV014WkhG ...

  8. windows 下安装nodejs及其配置环境

    第一步:下载安装文件下载nodejs,官网:http://nodejs.org/download/,我这里下载的是node-v0.10.28-x86.msi,如下图: 第二步:安装nodejs下载完成 ...

  9. 怎样找到native speaker的感觉

  10. Following Orders

    uva124:http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=60题 ...