当前位置:   article > 正文

初学者教程:第一只爬虫——爬取招聘信息(二)_抓取招聘信息机器人实训步骤

抓取招聘信息机器人实训步骤

内容概要:

初学者教程:第一只爬虫——爬取招聘信息(一)

    思路概述,一个简单的介绍。

初学者教程:第一只爬虫——爬取招聘信息(二)

    基础实现。介绍爬虫的代码具体实现,如何将爬到的数据解析、保存下来

初学者教程:第一只爬虫——爬取招聘信息(三)

    进阶应用。与机器学习结合,使用logistic分类器,训练一个分类模型,用于区分某一条新的招聘信息是否适合自己


本文代码下载:https://gitee.com/ecla_molly/get_constent.py


2018-06-26更新:

本文环境:python2,出现编码问题一般是python2和python3的原因

另外,由于年代已久,智联招聘主页已经更新了,这个代码不能直接跑了

刚看到csdn的通知,我迁移一下代码,迁移好了更新链接。不过,这个代码是我多年前写的,现在看着有点不忍直视。大家想看就看吧。接受request,如果想继续维护的童鞋可以一展身手啦

以上


一、抓取url链接

    1、首先,我们要设置Python的编码,并import相关的库。

  1. <span style="font-size:18px;"><span style="font-size:18px;">#! /usr/bin/env python
  2. #coding=utf-8
  3. import urllib2
  4. import re
  5. import sys
  6. reload(sys)
  7. sys.setdefaultencoding('utf-8')
  8. _page = 3 #抓取页数 </span>
  9. </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。也就是说,实际执行的是

  1. <span style="font-size:18px;"><span style="font-size:18px;">str1.decode(defaultendoding).encode('gbk')
  2. </span></span>
而defaultencoding默认是ascii,所以要使用这段代码来修改。将defaultencoding设置为utf-8
  1. <span style="font-size:18px;"><span style="font-size:18px;">import sys
  2. reload(sys)
  3. sys.setdefaultencoding('utf-8')</span></span>
第三个涉及编码的地方是读写外部文件。此处不详细讲了,用到再说。

urllib2这个库是用来解析url链接的。re是正则表达式的库。两者都是python的内置库。

[拓展阅读1、urllib2,2、re正则表达式]

可以看到我还设了一个常量_page,用来指定读取到搜索结果的某页,可以获得更多的信息。


2、为了读取搜索结果页的源代码,定义了一个读取源代码的函数

  1. <span style="font-size:18px;"><span style="font-size:18px;">def get_page_html(page): #读取指定某页源代码
  2. 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)
  3. html=urllib2.urlopen(html_url).read()
  4. return html</span></span>
使用.urlopen()方法打开链接。用.read()方法将读取的源代码存储到html中。可以使用print函数来看看html中究竟是什么东西(其实就是你看到的页面源代码啦)。


3、读取了源代码之后,解析出其中的url

  1. <span style="font-size:18px;">def get_url(html): #从源代码中解析出url
  2. pattern_start=re.compile('par="ssidkey=y&ss=201&ff=03" href="') #url开始标记
  3. pattern_end=re.compile('" target="_blank">') #url结束标记
  4. split1=pattern_start.split(html)
  5. global url_save #用于存储解析出的url
  6. url_save=[]
  7. for link in split1[1:-1]: #跳过第一段split
  8. url_get=pattern_end.split(link)
  9. if re.search('http://jobs.zhaopin.com/',url_get[0]):#再次验证结果:
  10. url_save.append(url_get[0])
  11. #无须return rul_save,因为url_save已经被global
  12. return 0</span>

开始标记和结束标记是分析了页面源代码后得到的。对于其他的招聘网站,可能会有所不同。

re的.compile()方法,是用来将字符串形式的正则表达式编译为Pattern实例。

rul_save是一个list,里面存储了所有切割出来的url信息。


到这里,所有想要的url就已经读出了了。


二、解析招聘详情页


仔细分析详情页的源代码,可以发现招聘信息的开始和结束是有标记的。就像这样

  1. <span style="font-size:18px;"> <!-- SWSStringCutStart -->
  2. <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>
  3. <!-- SWSStringCutEnd --></span>
可以很方便的截取 <!-- SWSStringCutStart -->和<!-- SWSStringCutEnd -->之间的内容。下面是截取招聘内容的函数。


  1. <span style="font-size:18px;"><span style="font-size:18px;">def read_url(url,cnt1,cnt2): #读取url内容,写入get_constent.txt
  2.     try:
  3.         constent_all=urllib2.urlopen(url).read() #获取页面源代码
  4.     except:
  5.         constent_all=''
  6.     finally:
  7.     #获取信息流
  8.         pattern_strat=re.compile('<!-- SWSStringCutStart -->')
  9.         pattern_end=re.compile('<!-- SWSStringCutEnd -->')
  10.         constent_get=pattern_strat.split(constent_all)
  11.         constent_get=pattern_end.split(constent_get[-1])
  12.     
  13.     #将信息流转化为独立的句子,并写入文本
  14.         fw=open('get_constent.txt','a') #存储得到的招聘信息
  15.         fu=open('save_url.txt','a') #存储招聘信息的url。此处分开存储是为后继的处理做准备。如果不打算进一步处理,也可以写在一起。
  16.         if re.search(re.compile('style'),constent_get[0]):
  17. #有些网页内容被风格化了,由于处理这种语句比较复杂,暂时放弃这些数据
  18.             cnt2 += 1
  19.         else:
  20.             split_pattern=re.compile('<P>|</P>|<p>|</p>|<BR>|<br/>|<br />|<br>'#格式化获得的信息
  21.             #此命令处理句子间格式,或许可以和下文处理句内字符同时进行。此处出于逻辑清晰之虑,分两步进行
  22.             
  23.             con_0=re.split(split_pattern,constent_get[0])
  24.             
  25.             fu.write(url+'\n')         
  26.             for line in con_0:
  27.                 write_constent = line.replace('&nbsp;','').replace('\n','').replace('\r','').replace('\t','').replace(' ','')
  28. #删掉格式化字符。这里也是为了后继的处理做准备。
  29.                 if len(write_constent):
  30.                     fw.write(write_constent)
  31.             cnt1 += 1
  32.             fw.write('\n')
  33.     return cnt1,cnt2</span></span>

三、主程序


  1. <span style="font-size:18px;">
  2. #读取url_save,解析其中招聘信息,存储在get_constent.txt中
  3. fc=open('get_constent.txt','w') #新建get_constent.txt,存储得到的信息。
  4. fc.close()
  5. fu = open('save_url.txt','w')
  6. fu.close()
  7. global count1 #统计解析数据
  8. global count2 #统计未解析数据
  9. count1 = 0
  10. count2 = 0
  11. for p in range(_page):
  12. html = get_page_html(p)
  13. re1 = get_url(html)
  14. for url in url_save:
  15. count1,count2 = read_url(url,count1,count2) #解析某一url内容
  16. count_text = '共解析 ' + str(count1) + ' 条数据'
  17. count_text2 = '未解析 ' + str(count2) + ' 条有格式数据'
  18. print count_text.encode('gbk')
  19. print count_text2.encode('gbk')</span>

现在,我们就得到两个txt文件,分别是get_constent.txt 和 save_url.txt 。

接下来,我们可以使用这些数据,训练一个model来进行新的数据的分类。



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/939953
推荐阅读
相关标签
  

闽ICP备14008679号