智联校园招聘数据爬取
1 本次实验只爬取一页内容,适合入门学习xpath,excel文件写入。
2 url =‘https://xiaoyuan.zhaopin.com/full/538/0_0_160000_1_0_0_0_1_0’
3 结尾会附上全部代码
大神请绕过本博客
(一) xpath基础知识
含义:xpath可以用在xml文档中对元素和属性值进行遍历,在网络爬虫中,只用xpath采集数据。
xpath有7种类型的节点:元素,属性,文本,命名空间,处理指令,诠释,文档节点
- 路径表达式
表达式 | 含义 |
---|---|
nodeName | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档节点,不考虑它们位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
Node() | 匹配任何类型节点 |
- 用xpath练习
<div class="searchResultList clearfix">
<ul class="searchResultListUl">
<li>
<div class="searchResultItemDetailed" pid="CC000130700J90000003000" datecreated="12/4/2018 1:12:00 AM" companytype="国企">
<p class="searchResultJobName">
<a target="_blank" joburl href="//xiaoyuan.zhaopin.com/job/CC000130700J90000003000?traceId=s06d8dfa5d490830848f00b204e9800998&scenario=1&jobSourceType=0&pageIndex=1&position=1" class="fl __ga__fullResultcampuspostname_clicksfullresultcampuspostnames_001">嵌入式软件 测试</a>
<span class="oTips oTips4 fl">校园招聘</span>
</p>
<p class="searchResultCompanyname"><span>中国电子科技集团公司第三十二研究所-基础软件部</span></p>
<p class="searchResultJobAdrNum">
<span class="searchResultKeyval">
<i class="nicon niconAdr"></i>
<span>城市:<em class="searchResultJobCityval">上海</em></span>
</span>
<span class="searchResultKeyval">
<i class="nicon niconReleasetime"></i>
<span>发布时间:<em>昨天</em></span>
</span>
</p>
<p class="searchResultCompanyInfodetailed">
<span class="searchResultKeyval">
<span>公司类型:<em>国企</em></span>
</span>
<span class="searchResultKeyval">
<span>公司规模:<em>500-999人</em></span>
</span>
<span class="searchResultKeyval">
<span>所属行业:<em>政府/公共事业/非盈利机构 计算机软件 IT服务(系统/数据/维护)</em></span>
</span>
<span class="searchResultKeyval">
<span>职位类别:<em>软件工程师</em></span>
</span>
<span class="searchResultKeyval">
<span>招聘人数:<em>若干</em></span>
</span>
</p>
<p class="searchResultCompanyWelfare">
</p>
<p class="searchResultJobdescription">
职责描述:<span>1、硕士/本科;2、计算机、自动化、电子工程、机电、工业控制等相关专业,具备嵌入式软件开发经验者优先;3、熟悉Linux或UCOS等嵌入式操作系统,熟练使用gcc、gdb等编译、调试工具,掌握软件工程基础知识,掌握软件测试的基本理论和技术;4、具有较强的团队精神和责任心,学习能力较强,能吃苦耐劳,具备较强的沟通协作能力...</span>
</p>
<a target="_blank" href="//xiaoyuan.zhaopin.com/job/CC000130700J90000003000?traceId=s06d8dfa5d490830848f00b204e9800998&scenario=1&jobSourceType=0&pageIndex=1&position=1" class="searchResultSeemore __ga__fullResultcampuspostmore_clickfullresultcampuspostmore_001">查看更多>></a>
</div>
<div class="showHideBtn">
<span class="__ga__fullResultpostunfold_clickfullresultpostunfold_001">
展开
</span>
<i class="nicon niconShowhide"></i>
</div>
</li>
<li>
针对上面html源码训练如下:
#导入lxml中的etree模块
#lxml能将字符串或流转化成ElementTree类型,也能将ElementsTree--> str
from lxml import etree
text = '''上面的html代码复制在这'''
#利用etree.HTML将字符串解析成HTML文档的elementstree类型
html = etree.HTML(text)
#例如:提取公司类型
# 1 首先看公司类型在哪(所属标签) 如上HTML代码是span标签 #<span class="searchResultKeyval" >
# 2 发现不止有公司类型是这个标签,还有公司规模,所属行业点等,此时就要进行步骤3
# 3 再找此内容所在标签的父节点即如上代码中span的父节点是 <p class="searchResultCompanyInfodetailed">
# 4 根据索引取得所要得到的公司类型
# 代码解释:
#//:如上表格所说从当前节点选取,不考虑位置,即p节点开始
#[@class=" "]:指定当前p标签的class
#text() :选取节点内容
companies = html.xpath('//p[@class="searchResultCompanyInfodetailed"]/span[@class="searchResultKeyval"][1]/span/em/text()')
#同理可以选取别的值,按需进行即可
(二)完整代码
import requests
import xlwt
from lxml import etree
#不加次header会拒绝访问,这是伪造头信息,去访问网页
header={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}
url = 'https://xiaoyuan.zhaopin.com/full/538/0_0_160000_1_0_0_0_1_0'
re = requests.get(url,headers=header)
#print(re.text)
#re和re.text类型不一样。etree.HTML只能解析str类型
#print(type(re.text))
#print(type(re))
html = etree.HTML(re.text)
print(type(html))
#---------------------解析网页,提取城市,职位,人数,公司类型,发布时间-----------
items = []
#找城市
cities = html.xpath('//p[@class="searchResultJobAdrNum"]/span[@class="searchResultKeyval"][1]/span/em/text()')
items.append(cities)
#发布时间
times = html.xpath('//p[@class="searchResultJobAdrNum"]/span[@class="searchResultKeyval"][2]/span/em/text()')
items.append(times)
#工作,选择p标签下的span内容,但是span的class都是一样的名字,只能用下标索引所要抽取的职位类型的em中的值
jobs = html.xpath('//p[@class="searchResultCompanyInfodetailed"]/span[@class="searchResultKeyval"][4]/span/em/text()')
items.append(jobs)
#招聘人数
numbers = html.xpath('//p[@class="searchResultCompanyInfodetailed"]/span[@class="searchResultKeyval"][5]/span/em/text()')
items.append(numbers)
#公司类别
companies = html.xpath('//p[@class="searchResultCompanyInfodetailed"]/span[@class="searchResultKeyval"][1]/span/em/text()')
items.append(companies)
#职位描述
description = html.xpath('//p[@class="searchResultJobdescription"]/span/text()')
items.append(description)
#-------------------------------------创建文件---------------------------------
#文件名称
newFile = "ZhiLian.xls"
#创建excel 文件 ,声明编码为utf-8
wb = xlwt.Workbook(encoding='utf-8')
#创建表格
ws = wb.add_sheet('sheet1')
#表头信息
headData = ['城市','职位','公司类型','招聘人数','发布时间','职责描述']
#写入表头信息
for column in range(0,6):
ws.write(0,column,headData[column],xlwt.easyxf('font:bold on'))
#将所获得的信息添加到excel文件中
# -----------------------------写入文件---------------------------------------
#将爬取的信息写入excel中 按列存储
for i in range(0,len(items)):
for j in range(1,len(items[i])):
ws.write(j,i,items[i][j])
wb.save(newFile)
输出内容:
(三)总结:
本文主要将xpath的方式解析网页,因为本人今天才真正正式学习爬虫,代码比较臃肿,还有那个items.append添加内容有点繁琐,后期我继续努力,看看有没有好的方法,本人下篇博客将爬取多个网页,并将代码进行封装。不会显得零散,可读性比较差。
(四)致谢:
感谢如下博客提供的参考:
https://blog.csdn.net/u011486491/article/details/84061432
https://blog.csdn.net/u010187278/article/details/77847737?locationNum=10&fps=1#网页分析