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

来源:互联网 发布:进销存软件 免费 编辑:程序博客网 时间:2024/04/30 04:31

内容概要:

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

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

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

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

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

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


本文代码下载:https://code.csdn.net/u010657489/get_constent-py/tree/master/get_constent.py


一、抓取url链接

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

<span style="font-size:18px;"><span style="font-size:18px;">#! /usr/bin/env python#coding=utf-8import urllib2import re import sysreload(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 sysreload(sys)sys.setdefaultencoding('utf-8')</span></span>
第三个涉及编码的地方是读写外部文件。此处不详细讲了,用到再说。

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

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

可以看到我还设了一个常量_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('&nbsp;','').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 = 0count2 = 0for 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>

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

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



0 0
原创粉丝点击