对51job网页招聘信息的简单爬取

目标是爬取七万份各不同职业的信息:

"职位名称","公司","薪资","公司地址","公司性质","公司福利","招聘信息","公司大小","公司类型"

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&degreefrom=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&degreefrom=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)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值