当前位置: 首页 > 科技观察

Python爬虫抓拍智联招聘(基础版)

时间:2023-03-12 20:04:58 科技观察

对于每个上班族来说,总会有好几份工作变动。如何在网上选择自己喜欢的工作?如何提前准备梦想工作的面试?今天我们就来抢智联招聘的招聘信息,助你成功跳槽!运行平台:WindowsPython版本:Python3.6IDE:SublimeText其他工具:Chrome浏览器1.网页分析1.1分析请求地址以北京市海淀区一名python工程师为例,对网页进行分析。打开智联招聘首页,选择北京地区,在搜索框中输入“python工程师”,点击“搜索职位”:然后跳转到搜索结果页面,按“F12”打开开发者工具,然后选择在“热点地区”栏目“海淀”,我们看一下地址栏:从地址栏后半部分的searchresult.ashx?jl=Beijing&kw=pythonengineer&sm=0&isfilter=1&p=1&re=2005可以看到我们必须自己构建地址。接下来我们需要分析开发者工具,按照如图的步骤找到我们需要的数据:RequestHeadersandQueryStringParameters:构造请求地址:paras={'jl':'Beijing',#Searchcity'kw':'pythonengineer',#搜索关键词'isadv':0,#是否开启更详细的搜索选项'isfilter':1,#是否过滤结果'p':1,#页码're':2005#region缩写,region,2005代表海淀}url='https://sou.zhaopin.com/jobs/searchresult.ashx?'+urlencode(paras)请求头:headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36','Host':'sou.zhaopin.com','Referer':'https://www.zhaopin.com/','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding':'gzip,deflate,br','Accept-Language':'zh-CN,zh;q=0.9'}1.2分析有用数据接下来,我们需要分析有用数据。从搜索结果中我们需要的数据有:职位名称、公司名称、公司详情页地址、该职位的月薪:通过网页元素的定位找到这几项在HTML文件中的位置,如图下面:使用正则表达式提取这四项:#正则表达式分析pattern=re.compile('(.*?).*?'#Match职位信息'(.*?).*?'#匹配公司URL和公司名'(.*?)',re.S)#匹配月薪#匹配所有符合条件的内容项=re.findall(pattern,html)注:解析Someofjobtitles出来是带tag的,如下图:然后解析后,对数据进行处理,去掉tag,可以用下面的代码实现:foriteminitems:job_name=item[0]job_name=job_name.replace('','')job_name=job_name.replace('','')yield{'job':job_name,'website':item[1],'company':item[2],'salary':item[3]}2.写入文件。我们得到的数据,每个位置的信息项都是一样的,可以写入数据库,但是本文选择的是csv文件。以下是百度百科的解释:逗号分隔值(Comma-SeparatedValues,CSV,有时也称为字符分隔值,因为分隔符也可以不是逗号),其文件存储表格数据(数字和文本))纯文本。纯文本意味着该文件是一个字符序列,不包含必须看起来像被解释为二进制数的数据的任何内容。由于python内置了csv文件操作的库函数,非常方便:importcsvdefwrite_csv_headers(path,headers):'''writeheader'''withopen(path,'a',encoding='gb18030',newline='')asf:f_csv=csv.DictWriter(f,headers)f_csv.writeheader()defwrite_csv_rows(path,headers,rows):'''writerow'''withopen(path,'a',encoding='gb18030',newline='')asf:f_csv=csv.DictWriter(f,headers)f_csv.writerows(rows)3.进度展示如果你想找到一份理想的工作,你必须过滤更多的职位,所以我们抓取的数据量它肯定是非常大的,几十页,几百页甚至几千页,所以我们要抓取爬取进度才能更安心,所以需要添加进度条显示功能。本文选择tqdm进行进度展示,一起来看看炫酷的效果吧(图片来源网络):执行如下命令安装:pipinstalltqdm。简单示例:fromtqdmimporttqdmfromtimeimportsleepforiintqdm(range(1000)):sleep(0.01)4、完整代码以上是所有功能的分析,如下为完整代码:#-*-coding:utf-8-*-importreimportcsvimportrequestsfromtqdmimporttqdmfromurllib.parseimporturlencodefromrequests.exceptionsimportRequestExceptiondefget_one_page(city,keyword,region,page):'''Getthehtmlcontentofthewebpageandreturn'''paras={'jl':city,#searchcity'kw':keyword,#searchkeyword'isadv':0,#whetherOpenmoredetailedsearchoptions'isfilter':1,#Whethertofiltertheresults'p':page,#numberofpages're':region#regionabbreviation,region,2005representsHaidian}headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36','Host':'sou.zhaopin.com','Referer':'https://www.zhaopin.com/','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding':'gzip,deflate,br','Accept-Language':'zh-CN,zh;q=0.9'}url='https://sou.zhaopin.com/jobs/searchresult.ashx?'+urlencode(paras)try:#Getthecontentofthewebpage,returnhtmldataresponse=requests.get(url,headers=headers)#Judgewhethertheacquisitionissuccessfulthroughthestatuscodeifresponse.status_code==200:returnresponse.textreturnNoneexceptRequestExceptionase:returnNonedefparse_one_page(html):'''解析HTML代码,提取有用信息并返回'''#解析pattern的正则表达式=re.compile('(.*?).*?'#匹配位置信息'(.*?).*?'#匹配公司网站和公司名称'(.*?)',re.S)#匹配月薪#匹配所有符合条件的内容项=re.findall(pattern,html)foriteminitems:job_name=item[0]job_name=job_name.replace('','')job_name=job_name.replace('','')yield{'job':job_name,'website':item[1],'company':item[2],'salary':item[3]}defwrite_csv_file(path,headers,rows):'''写表头和行csvfile'''#添加编码防止中文写错#newline参数防止每写一行多一个空行withopen(path,'a',encoding='gb18030',newline='')asf:f_csv=csv.DictWriter(f,headers)f_csv.writeheader()f_csv.writerows(rows)defwrite_csv_headers(path,headers):'''writeheader'''withopen(path,'a',encoding='gb18030',newline='')asf:f_csv=csv.DictWriter(f,headers)f_csv.writeheader()defwrite_csv_rows(path,headers,rows):'''写行'''withopen(path,'a',encoding='gb18030',newline='')asf:f_csv=csv.DictWriter(f,headers)f_csv.writerows(rows)defmain(city,keyword,region,pages):'''主函数'''filename='zl_'+city+'_'+keyword+'.csv'headers=['job','website','company','salary']write_csv_headers(filename,headers)foriintqdm(range(pages)):'''获取本页所有职位信息,写入csvfile'''jobs=[]html=get_one_page(city,keyword,region,i)items=parse_one_page(html)foriteminitems:jobs.append(item)write_csv_rows(filename,headers,jobs)if__name__=='__main__':main('北京','pythonengineer',2005,10)上面代码的执行效果如图:执行完成后,会在同一个文件夹下生成一个名为:zl_Beijing_pythonengineer.csv的文件级别为py。打开后效果如下: