先上效果图:
声明:该代码是进行分享与学习用的,没有对爬取的数据进行任何的商业行为,如果你对爬取到的数据感兴趣,请联系相关网站。
符合你需求就往下看,不符合就闪人,(稳住,我们能赢)
![运行效果图](https://i-blog.csdnimg.cn/blog_migrate/d1cec4f2eae9678c6baa0020ab27bc59.png)
![数据效果图](https://i-blog.csdnimg.cn/blog_migrate/e91259538c5436fd0e0e39bc9d97350f.png)
如果上述代码符合你了解的需求,下面是一些运行分析该代码需要的东西(猥琐发育,别浪)
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())
感谢看完!!!