目标是爬取七万份各不同职业的信息:
"职位名称","公司","薪资","公司地址","公司性质","公司福利","招聘信息","公司大小","公司类型"
1. 明确爬取的页面
通过翻页操作可以得出网址由三部分组成
url_1='https://search.51job.com/list/000000,000000,0000,00,9,99,+,2,'
url_2='.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
url_3=page_text #页数
通过三个url的封装可以得到我们想要爬取的网页
url=url_1+str(page_text)+url_2
page_text由input输入
2. 对一个页面进行简单的requests
html=requests.get(url=url,headers=headers).content.decode('gbk')
51job网是由gbk编码的,这里我先将其使用方法content,在进行编码。
用抓包工具观察网页
通过抓包可以发现我们所需数据所对应的xpath路径,但是题主用xpath并不能成功将其解析成功,因为我们上文所请求的html,与真实的网页源码有出入,这里我用的是正则表达式。
3. 数据解析
观察我们所得到的html,将其写入html文件中可以发现,我们所要的数据都在
window.__SEARCH_RESULT__ {}之中
对其使用正则表达式
#json
ev_1=re.compile('window.__SEARCH_RESULT__ = (.*?)</script>',re.S)
json_data = str(re.findall(ev_1, html)).replace('\\','').replace('&','').replace('?','').replace('.','')
把其整体提炼出形成一个超长字符串,再对部分使用正则表达式。
#职位名称
ev_2=re.compile('"job_title":"(.*?)","company_href":"',re.S)
#公司
ev_3=re.compile('"company_name":"(.*?)","providesalary_text":"',re.S)
#薪资
ev_4=re.compile('"providesalary_text":"(.*?)","workarea":"',re.S)
#公司地址
ev_5=re.compile('"workarea_text":"(.*?)","updatedate":"',re.S)
#公司性质
ev_6=re.compile('"companytype_text":"(.*?)","degreefrom":"',re.S)
#公司福利
ev_7=re.compile('"jobwelf":"(.*?)","jobwelf_list":',re.S)
#招聘信息
ev_8=re.compile('"attribute_text":(.*?),"companysize_text":"',re.S)
#公司大小
ev_9=re.compile('"companysize_text":"(.*?)","companyind_text":"',re.S)
#公司类型
ev_10=re.compile('"companyind_text":"(.*?)","adid":"',re.S)
每个对应信息申请一个列表
Job_title=[]
Company_name=[]
Providesalary_text=[]
Workarea_text=[]
Companytype_text=[]
Jobwelf=[]
Attribute_text=[]
Companysize_text=[]
Companyind_text=[]
调用方法findall,并将每个信息存入对应的列表
job_title = re.findall(ev_2, json_data)
for i in job_title:
Job_title.append(i)
company_name = re.findall(ev_3, json_data)
for i in company_name:
Company_name.append(i)
providesalary_text = re.findall(ev_4, json_data)
for i in providesalary_text:
Providesalary_text.append(i)
workarea_text = re.findall(ev_5, json_data)
for i in workarea_text:
Workarea_text.append(i)
companytype_text = re.findall(ev_6, json_data)
for i in companytype_text:
Companytype_text.append(i)
jobwelf = re.findall(ev_7, json_data)
for i in jobwelf:
Jobwelf.append(i)
attribute_text = re.findall(ev_8, json_data)
for i in attribute_text:
Attribute_text.append(i)
companysize_text = re.findall(ev_9, json_data)
for i in companysize_text:
Companysize_text.append(i)
companyind_text = re.findall(ev_10, json_data)
for i in companyind_text:
Companyind_text.append(i)
4. 数据保存
目标是对70000条数据进行分析,所以这里我们使用.xlsx对数据进行保存
for i in range(0,page_url*50):
ws.cell(i+2,1,Job_title[i])
ws.cell(i+2,2,Company_name[i])
ws.cell(i+2,3,Providesalary_text[i])
ws.cell(i+2,4,Workarea_text[i])
ws.cell(i+2,5,Companytype_text[i])
ws.cell(i+2,6,Jobwelf[i])
ws.cell(i+2,7,Attribute_text[i])
ws.cell(i+2,8,Companysize_text[i])
ws.cell(i+2,9,Companyind_text[i])
wb.save(savepath)
总体而言,这只是51job网的第二层,所以对新手爬虫比较友好,没有格外设置反爬。
2021-08-11更新后代码
这是一个整体的代码:
# -*- coding = utf-8 -*-
# @Time : 2021/8/11 12:19
# @Author : qqxy
# @File : All4.0
# @Software : PyCharm
import requests
import re
from fake_useragent import UserAgent
import openpyxl
UA = UserAgent()
headers = {
'Connection': 'close',
'User-Agent': UA.random
}
ev_0=re.compile('window.__SEARCH_RESULT__ = (.*?)</script>',re.S)
ev_group=re.compile('"type":(.*?)"adid":')
#职位名称
ev_1=re.compile('"job_title":"(.*?)","',re.S)
#薪资
ev_2=re.compile('"providesalary_text":"(.*?)","',re.S)
#公司名称
ev_3=re.compile('"company_name":"(.*?)","',re.S)
#公司大小
ev_4=re.compile('"companysize_text":"(.*?)",',re.S)
#公司类型
ev_5=re.compile('"companyind_text":"(.*?)",',re.S)
#公司地址
ev_6=re.compile('"workarea_text":"(.*?)","',re.S)
#公司福利
ev_7=re.compile('"jobwelf":"(.*?)","',re.S)
#公司性质
ev_8=re.compile('"companytype_text":"(.*?)","',re.S)
#入职要求
ev_9=re.compile('"attribute_text":(.*?),"',re.S)
#具体网址
ev_10=re.compile('"job_href":"(.*?)","')
Job_title=[]
Company_name=[]
Providesalary_text=[]
Workarea_text=[]
Companytype_text=[]
Jobwelf=[]
Attribute_text=[]
Companysize_text=[]
Companyind_text=[]
Job_href=[]
wb=openpyxl.Workbook()
ws=wb.worksheets[0]
title=("职位名称","薪资","公司名称","公司大小","公司类型","公司地址","公司福利","公司性质","入职要求","具体网址")
for k in range(0,10):
ws.cell(1,k+1,title[k])
savepath='./招聘4.0.xlsx'
wb.save(savepath)
url_1='https://search.51job.com/list/000000,000000,0000,00,9,99,+,2,'
url_2='.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare='
Page_Text = int(input("请输入爬取的页数:"))
for page_text in range(1,Page_Text+1):
url = url_1 + str(page_text) + url_2
html = requests.get(url=url, headers=headers).content.decode('gbk')
json_data = str(re.findall(ev_0, html)).replace('\\', '')
group = re.findall(ev_group, json_data)
try:
for num in range(0,50):
# 职业名称
job_title = re.findall(ev_1, group[num])
Job_title.append(job_title[0])
# 薪资
providesalary_text = re.findall(ev_2, group[num])
Providesalary_text.append(providesalary_text[0])
# 公司名称
company_name = re.findall(ev_3,group[num])
Company_name.append(company_name[0])
# 公司大小
companysize_text = re.findall(ev_4, group[num])
Companysize_text.append(companysize_text[0])
# 公司类型
companyind_text = re.findall(ev_5, group[num])
if len(companyind_text)==1:
Companyind_text.append(companyind_text[0])
else:
Companyind_text.append("")
# 公司地址
workarea_text = re.findall(ev_6, group[num])
Workarea_text.append(workarea_text[0])
# 公司福利
jobwelf = re.findall(ev_7, group[num])
Jobwelf.append(jobwelf[0])
# 公司性质
companytype_text = re.findall(ev_8, group[num])
Companytype_text.append(companytype_text[0])
# 入职要求
attribute_text = re.findall(ev_9, group[num])
Attribute_text.append(attribute_text[0])
# 具体网址
job_href = re.findall(ev_10, group[num])
Job_href.append(job_href[0])
except:
print("第" + str(page_text) + "页出错")
with open(srt(page_text)+'html.html', 'w', encoding='gbk') as obj:
obj.write(html)
print("第" + str(page_text) + "页爬完")
for i in range(0, Page_Text*50):
ws.cell(i+2,1,Job_title[i])
ws.cell(i+2,2,Providesalary_text[i])
ws.cell(i+2,3,Company_name[i])
ws.cell(i+2,4,Companysize_text[i])
ws.cell(i+2,5,Companyind_text[i])
ws.cell(i+2,6,Workarea_text[i])
ws.cell(i+2,7,Jobwelf[i])
ws.cell(i+2,8,Companytype_text[i])
ws.cell(i+2,9,Attribute_text[i])
ws.cell(i+2,10,Job_href[i])
wb.save(savepath)