您的位置:首页 > 编程语言 > Python开发

Python爬虫爬取智联招聘职位信息

2017-09-11 00:00 603 查看
目的:输入要爬取的职位名称,五个意向城市,爬取智联招聘上的该信息,并打印进表格中

#coding:utf-8 import urllib2
import re
import xlwt

class ZLZP(object):

def __init__(self,workname,citys):
# 记录查找工作名称  self.workname = workname
# 基础URL地址  self.url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?'  # 工作名称  args = 'kw=%s&jl='%workname
# 工作地点  for city in citys:
# 判断城市是否为最后一个  if city == citys[-1]:
args += city
else:
args += city
args += '%2B'  # kw=python&jl=北京%2B上海%2B南京%2B广州%2B深圳  # 拼接完整的url地址  self.url += args
self.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'  }
# 根据页码获取某一页HTML源代码  def get_page(self,pageNum):
# 1.根据页码拼接完整的url地址  getUrl = self.url + '&p=%s'%pageNum
# 2.创建request对象  request = urllib2.Request(getUrl,headers=self.headers)
try:
response = urllib2.urlopen(request)
except Exception ,e:
print '获取第%s页数据失败,原因%s'%(pageNum,e)
return None  else:
return response.read()

# 从html代码中提取总职位数  def get_total(self,html):
# 1.准备正则表达式  pattern = re.compile(r'<span class="search_yx_tj.*?em>(.*?)</em>',re.S)
# 2.根据正则表达式从源代码中查找数据  rs = re.search(pattern,html)
# 3.记录总职位数,计算总页数  total = int(rs.group(1))
print '共搜索到%s个相关职位信息...'%total
# 不能被60整除,总页码+1  if total%60 == 0:
self.totalPage = total/60  else:
self.totalPage = total/60+1  # 提取数据函数  def get_data(self,html):
# 1.准备正则  # print html  pattern = re.compile(r'<table.*?class="newlist.*?<td class="zwmc.*?<a.*?>(.*?)</a>.*?<td class="gsmc.*?_blank">(.*?)</a>.*?<td class="zwyx">(.*?)</td.*?<td class="gzdd">(.*?)</td>',re.S)
# 2.从html源代码中搜索  results = re.findall(pattern,html)
# 3.去除数据中标签  rs_data = []
for rs in results:
remove_b = re.compile(r'<.*?>',re.S)
name = re.sub(remove_b,'',rs[0])
rs_tp = (name,rs[1],rs[2],rs[3])
rs_data.append(rs_tp)
return rs_data
# 开始爬虫函数  def start(self):
# 1.获取第一页查询职位的HTML源代码  html = self.get_page(1)
if html == None:
return  # 2.从html源代码中提取总职位数  self.get_total(html)
# 3.for循环循环总页数次(循环10次)  # 创建workbook对象  workbook = xlwt.Workbook(encoding='utf-8')
print type(self.workname)
# unicode 将一个str类型的字符串转换为unicode字符  # 中文编码格式GBK,  print type(unicode(self.workname,encoding='utf-8'))
name = u'智联表'+unicode(self.workname,encoding='utf-8')
print type(name)
sheet = workbook.add_sheet(name)
sheet.write(0,0,'职位名称')
sheet.write(0,1,'公司名称')
sheet.write(0,2,'职位月薪')
sheet.write(0,3,'工作地点')
# count 记录当前的行号  count = 1  for x in range(1,11):
# 1.根据页码获取该页的HTML源代码  print '正在写入第%s页数据....'%x
html = self.get_page(x)
if html == None:
continue  # 2.从html源代码中提取数据  rs_data = self.get_data(html)
# 3.写入本地文件  for rs in rs_data:
sheet.write(count,0,rs[0])
sheet.write(count,1,rs[1])
sheet.write(count,2,rs[2])
sheet.write(count,3,rs[3])
count+=1  # 保存文件  print type(self.workname)
filename = u'智联%s职位信息.xls'%unicode(self.workname,encoding='utf-8')
workbook.save(filename)

'''  Python3之前:  要存储到本地的数据,保证是UTF-8编码  要在Python中使用的字符,保证是Unicode类型的字符  unicode(self.workname,encoding='utf-8')  字符串类型 str 输入的文本内容、''或""包裹的文本 '''   if __name__ == '__main__':

workname = raw_input('请输入要查询的工作名称:')
# 存放工作城市  citys = []
# 只要城市小于5个,继续输入城市  while len(citys) < 5:
city = raw_input('请输入意向城市,最多输入5个,输入0结束:')
if city == '0':
break  citys.append(city)

zlzp = ZLZP(workname,citys)
zlzp.start()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: