python爬虫:爬取拉勾网职业信息,并用excl进行保存

先上效果图:

声明:该代码是进行分享与学习用的,没有对爬取的数据进行任何的商业行为,如果你对爬取到的数据感兴趣,请联系相关网站。

符合你需求就往下看,不符合就闪人,(稳住,我们能赢)

运行效果图
运行效果图
数据效果图
部分数据效果图

如果上述代码符合你了解的需求,下面是一些运行分析该代码需要的东西(猥琐发育,别浪)

1.利用浏览器查看http请求的信息

2.能找到代码的运行的入口

3.能对运行时出现的错误进行分析

4.将所需的请求头信息保存在代码当前文件夹下,命名为lagou.txt,同时修改在"Referer"处进行简单的修改,修改后的效果如下 :

Host: www.lagou.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: utf-8
Referer:***********/jobs/list_KeyWord?city*********************
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: (不要嫌长,全部写上)
Connection: keep-alive

简单的分析图如下:

请求头获取

 

数据分析截图

下面直接上代码,全部,(集合,准备团战

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2018-09-02 19:24:38
# @Author  : Your Name (you@example.org)
# @Link    : http://example.org
# @Version : $Id$

from urllib import request,parse
from bs4 import BeautifulSoup
import json
import xlsxwriter
def make_head(filename,keyword):
	"""
	该方法是利用一个用文本保存的头信息变成一个可以用urllib利用的头信息。
	"""
	with open(filename) as f:
		header={} #一个空的字典,用于存储头信息
		temp=[] #一个空的list,用于存储一个行的临时信息
		for line in f.readlines(): #遍历整个文件
			temp=line.rstrip("\n").split(":") #去掉回车,利用:进行分割
			if len(temp)>1:  #如果list的长度大于1,则进行头信息的拼装
				header[temp[0]]=":".join(temp[1:])
		header['Referer']=header['Referer'].replace('KeyWord',keyword)
	return header


def make_data(page_num,key_word):
	"""
	该方法是利用专门构造lagou网职位信息的请求数据
	"""
	fflag=False #是否是首页的标志
	if page_num==1:
		fflag=True
	raw_data={
		'first':fflag,
		'kd':key_word,
		'pn':page_num
	}
	data=parse.urlencode(raw_data)
	return data

def get_page(url,header,data):
	#方法是利用python自带的请求信息进行相关页面的请求
	myReq=request.Request(url,headers=header) #构造一个请求对象
	page=request.urlopen(myReq,data=data.encode('utf-8')).read() #请求一个页面并利用utf-8进行解码
	paga=page.decode('utf-8')
	return page #返回页面内容
	pass

def get_maxPage(json_page):
	#通过读取json文件中的相关信息,确定要读取的页面的数量
	page_json = json.loads(json_page)
	max_page_num = page_json['content']['positionResult']['totalCount']/page_json['content']['positionResult']['resultSize']
	if max_page_num > 30:
		max_page_num = 30
	return max_page_num

def get_pageSize(page):
	#通过读取json文件中的相关信息,确定要读取的每个页面的容量
	page_json = json.loads(page)
	page_size=page_json['content']['pageSize']
	return page_size
	pass
def get_info(page,tags,size):
	#读取页面中的关于要查找信息,其中tag中包含的是想找的信息对应的json文件中的名称,size是一个页面中信息的容量,返回的是一个包含信息的二维数组
	page_result=[] #构造信息的一个二维数组的外面的数组
	#读取页面
	page_json = json.loads(page)
	#取得结果数组
	result_json=page_json['content']['positionResult']['result']
	#进行一个页面内容的构造
	for i in range(size):
		temp=[]
		for tag in tags:
			temp.append(result_json[i].get(tag))
		page_result.append(temp)
	return page_result

def save_excl(datas,filename):
	#创建一个excl表
	workbook = xlsxwriter.Workbook("%s.xlsx" % filename) # 默认存储在当前文件夹中
	#在excl表中创建一个活动的页
	worksheet=workbook.add_worksheet()

	#定义行列
	row=0
	col=0

	#循环输入相应的数据,datas中存储的是一个二维数组,所以用二维数组的方式进行遍历
	#取出一行数据
	for data in datas: 
		#遍历每一行中每一列的数据 
		for i in range(len(data)):
			#将每一行的数据对应的列写入表格
			tempData=""
			if isinstance(data[i],list):
				tempData=','.join(data[i])
			else:
				tempData=data[i]
			worksheet.write(row,col+i,tempData) 
		#进行下一行的序号
		row+=1
	#关闭表
	workbook.close()



tags=["city",	"positionName","workYear","education","jobNature","industryField","positionAdvantage","salary",	"companySize","companyShortName","positionLables","industryLables",	"financeStage",	"companyLabelList",	"district","businessZones",
		"firstType","secondType","companyFullName"]

if __name__ == '__main__':
	#请求的url
	url=r"https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false" 
	print("***************************×××爬取数据开始×××************************")
	lan_type=input("请输入你要查询的语言类型:")
	#请求的数据
	data=make_data(1,lan_type)
	#请求头
	header=make_head("lagou.txt",lan_type)
	#请求页面
	paga=get_page(url,header,data)
	# #进行页面的转化
	# page_soup=BeautifulSoup(paga,"html.parser")
	#读取页面的总数
	max_page_num=get_maxPage(paga)
	#读取页面的容量
	page_size=get_pageSize(paga)
	#定义一个结果输出的数组
	result=[]
	#为结果添加一个标题
	result.append(tags)
	#定义一个临时的list进行数组的暂时存储
	temp=[]
	#进行循环攫取每页的数据 
	for i in range(1,max_page_num+1):
		print("***************************当前爬取第%s页数据************************" % i)
		#请求的数据
		data=make_data(i,lan_type)
		#请求页面
		paga=get_page(url,header,data)
		temp=get_info(paga,tags,page_size)
		if len(temp)>1:
			for data in temp :
				result.append(data)
		else:
			print("result false")
	#将结果写入一个excl表中
	filename=input("请输入要保存的文件的名称:")
	save_excl(result,filename)
	#输出相关的信息
	# print(max_page_num)
	# print(page_size)
	# for i in range(len(result)):
	# 	print(type(result[i]))
	# print(temp)
	# print(result)
	#print(page_soup.prettify())

感谢看完!!!

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值