赞
踩
内容概要:
思路概述,一个简单的介绍。
基础实现。介绍爬虫的代码具体实现,如何将爬到的数据解析、保存下来
进阶应用。与机器学习结合,使用logistic分类器,训练一个分类模型,用于区分某一条新的招聘信息是否适合自己
本文代码下载:https://gitee.com/ecla_molly/get_constent.py
2018-06-26更新:
本文环境:python2,出现编码问题一般是python2和python3的原因
另外,由于年代已久,智联招聘主页已经更新了,这个代码不能直接跑了
刚看到csdn的通知,我迁移一下代码,迁移好了更新链接。不过,这个代码是我多年前写的,现在看着有点不忍直视。大家想看就看吧。接受request,如果想继续维护的童鞋可以一展身手啦
以上
一、抓取url链接
1、首先,我们要设置Python的编码,并import相关的库。
- <span style="font-size:18px;"><span style="font-size:18px;">#! /usr/bin/env python
- #coding=utf-8
-
-
- import urllib2
- import re
- import sys
-
- reload(sys)
- sys.setdefaultencoding('utf-8')
-
- _page = 3 #抓取页数 </span>
- </span>
由于程序涉及到中文的读写,所以编码问题非常重要。[拓展阅读:1文字编码,2python的中文编码问题。]。这里就根据我自己的理解做一个简单的介绍。(如果有说的不合适的地方,求路过的大神指正)
python涉及到编码的有三个地方:.py文件存储的编码和python解释器的编码,内部编码,外部输入信息的编码。.py文件存储的编码和python解释器的编码之所以放在一起说,是因为他们一定要是相同的。所谓文件存储的编码,就是你的.py文件要保存在计算机上面,这就需要有一个编码。python解释器的编码是用来解释python文件内出现的中文的。设置文件存储的编码的方法,一般在保存的选项中,比如VS在‘高级保存选项’里面可以更改。其它IDE的具体方法可能不太一样。设置解释器的方法是第二行的注释:
<span style="font-size:18px;"><span style="font-size:18px;">#coding=utf-8</span></span>
这句话告诉解释器,用‘utf-8’来解释本文件。
另一个涉及到编码的地方是‘内部编码’。设置它仅仅是为了方便。‘utf-8’实际上是unicode的一个存储形式,如果想要把'GBK'转为‘utf-8’,需要先将它转为unicode。在python2.7中,有两种字符格式:str和unicode。str通过.decode()编码可以转为unicode格式,unicode通过.encode方法转为str格式。那么问题来了——如果我对一个str使用.encode()方法,会发生什么呢?python会把str转化为unicode格式,再转化为我要的编码的str。也就是说,实际执行的是
- <span style="font-size:18px;"><span style="font-size:18px;">str1.decode(defaultendoding).encode('gbk')
- </span></span>
而defaultencoding默认是ascii,所以要使用这段代码来修改。将defaultencoding设置为utf-8- <span style="font-size:18px;"><span style="font-size:18px;">import sys
- reload(sys)
- sys.setdefaultencoding('utf-8')</span></span>
第三个涉及编码的地方是读写外部文件。此处不详细讲了,用到再说。
urllib2这个库是用来解析url链接的。re是正则表达式的库。两者都是python的内置库。
可以看到我还设了一个常量_page,用来指定读取到搜索结果的某页,可以获得更多的信息。
2、为了读取搜索结果页的源代码,定义了一个读取源代码的函数
- <span style="font-size:18px;"><span style="font-size:18px;">def get_page_html(page): #读取指定某页源代码
- html_url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%E5%8C%97%E4%BA%AC&kw=%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88&sm=0&p='+str(page)
- html=urllib2.urlopen(html_url).read()
- return html</span></span>
使用.urlopen()方法打开链接。用.read()方法将读取的源代码存储到html中。可以使用print函数来看看html中究竟是什么东西(其实就是你看到的页面源代码啦)。
3、读取了源代码之后,解析出其中的url
- <span style="font-size:18px;">def get_url(html): #从源代码中解析出url
- pattern_start=re.compile('par="ssidkey=y&ss=201&ff=03" href="') #url开始标记
- pattern_end=re.compile('" target="_blank">') #url结束标记
- split1=pattern_start.split(html)
- global url_save #用于存储解析出的url
- url_save=[]
- for link in split1[1:-1]: #跳过第一段split
- url_get=pattern_end.split(link)
- if re.search('http://jobs.zhaopin.com/',url_get[0]):#再次验证结果:
- url_save.append(url_get[0])
- #无须return rul_save,因为url_save已经被global
- return 0</span>
re的.compile()方法,是用来将字符串形式的正则表达式编译为Pattern实例。
rul_save是一个list,里面存储了所有切割出来的url信息。
到这里,所有想要的url就已经读出了了。
二、解析招聘详情页
仔细分析详情页的源代码,可以发现招聘信息的开始和结束是有标记的。就像这样
- <span style="font-size:18px;"> <!-- SWSStringCutStart -->
- <div style="MIN-HEIGHT: 16px"><span style="FONT-FAMILY: Verdana; COLOR: #333333"><span style="LINE-HEIGHT: 16px; FONT-SIZE: 12px"><div style="MIN-HEIGHT: 16px"><br/>1. 负责公司产品的算法编写;<br/>2. 针对编写的算法验证并改善算法;<br/>3. 针对算法编写相应文档。</div><div style="MIN-HEIGHT: 16px"> </div><div style="MIN-HEIGHT: 16px">岗位要求:</div><div style="MIN-HEIGHT: 16px">1. 信号与信息处理、通信、计算机、电子工程及自动化等相关专业,本科及以上学历毕业; <br/>2. 具备信号与信息处理、算法设计与研究经验,熟悉C语言等编程;<br/>3. 拥有雷达信号识别、雷达信号检测、雷达阵列信号处理相关经验者,优先考虑;<br/>4. 语音信号识别、图像识别、图像处理相关专业,或相关工作经验者,优先考虑;<br/>5. 熟悉matlab软件,能够熟练使用matlab进行编程、仿真及分析数据;<br/>6. 熟悉DSP应用开发,熟悉CCS,有C6000项目开发经验者优先;<br/>7. 性格开朗,勤奋、干练,具备团队精神,能够很快的融入到团队中</div><div style="MIN-HEIGHT: 16px"></div></span></span></div>
- <!-- SWSStringCutEnd --></span>
可以很方便的截取 <!-- SWSStringCutStart -->和<!-- SWSStringCutEnd -->之间的内容。下面是截取招聘内容的函数。- <span style="font-size:18px;"><span style="font-size:18px;">def read_url(url,cnt1,cnt2): #读取url内容,写入get_constent.txt
- try:
- constent_all=urllib2.urlopen(url).read() #获取页面源代码
- except:
- constent_all=''
- finally:
- #获取信息流
- pattern_strat=re.compile('<!-- SWSStringCutStart -->')
- pattern_end=re.compile('<!-- SWSStringCutEnd -->')
- constent_get=pattern_strat.split(constent_all)
- constent_get=pattern_end.split(constent_get[-1])
-
- #将信息流转化为独立的句子,并写入文本
-
- fw=open('get_constent.txt','a') #存储得到的招聘信息
- fu=open('save_url.txt','a') #存储招聘信息的url。此处分开存储是为后继的处理做准备。如果不打算进一步处理,也可以写在一起。
-
- if re.search(re.compile('style'),constent_get[0]):
- #有些网页内容被风格化了,由于处理这种语句比较复杂,暂时放弃这些数据
- cnt2 += 1
- else:
- split_pattern=re.compile('<P>|</P>|<p>|</p>|<BR>|<br/>|<br />|<br>') #格式化获得的信息
- #此命令处理句子间格式,或许可以和下文处理句内字符同时进行。此处出于逻辑清晰之虑,分两步进行
-
- con_0=re.split(split_pattern,constent_get[0])
-
- fu.write(url+'\n')
- for line in con_0:
- write_constent = line.replace(' ','').replace('\n','').replace('\r','').replace('\t','').replace(' ','')
- #删掉格式化字符。这里也是为了后继的处理做准备。
- if len(write_constent):
- fw.write(write_constent)
- cnt1 += 1
- fw.write('\n')
- return cnt1,cnt2</span></span>
- <span style="font-size:18px;">
- #读取url_save,解析其中招聘信息,存储在get_constent.txt中
-
- fc=open('get_constent.txt','w') #新建get_constent.txt,存储得到的信息。
- fc.close()
- fu = open('save_url.txt','w')
- fu.close()
-
- global count1 #统计解析数据
- global count2 #统计未解析数据
- count1 = 0
- count2 = 0
-
- for p in range(_page):
- html = get_page_html(p)
- re1 = get_url(html)
- for url in url_save:
- count1,count2 = read_url(url,count1,count2) #解析某一url内容
-
- count_text = '共解析 ' + str(count1) + ' 条数据'
- count_text2 = '未解析 ' + str(count2) + ' 条有格式数据'
- print count_text.encode('gbk')
- print count_text2.encode('gbk')</span>
接下来,我们可以使用这些数据,训练一个model来进行新的数据的分类。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。