前程无忧网站内容( 【伙伴快讯】51job数据数据分析师,)
优采云 发布时间: 2021-11-28 10:09前程无忧网站内容(
【伙伴快讯】51job数据数据分析师,)
我们以数据分析师为例,抓取 51job 51job 上的职位信息
首先导入所有使用的库
import requests
from urllib import parse # 将中文转换为%***格式
from lxml import etree # 解析数据
import re # 解析数据
from fake_useragent import UserAgent # 随机请求头
先看的url,非常长,我们会吗?以下全部删除后,发现不影响访问。删除的url如下
https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,1.html
通过观察,我们发现长列表是我们要搜索的——数据分析师,前面的99是我们要搜索的薪水范围,.html的前面代表页数,所以我们将其用作变量 Receive 以便我们可以修改
page=1 # 搜索第一页
key="数据分析师" # 搜索词
key=parse.quote(key) # parse.quote能将汉字转换成那么一长串的东西
salary=99 # 99默认全部,输入范围“A-B”表示从A到B的薪资范围
通过观察,我们发现我们想要的URL在一个script标签中,所以使用正则表达式是一个不错的选择
url = f'https://search.51job.com/list/000000,000000,0000,00,9,{salary},{key},2,{page}.html'
headers = {
'User-Agent': str(UserAgent().random), # 随机请求头
}
def get_text(url): #获取网页文本
response=requests.get(url,headers=headers)
return response.content.decode('gbk')
def get_url(): #拿到职位链接
hrefs=re.findall('"job_href":"(.*?)"',get_text(url)) # 正则提取职位链接
hrefs=list(map(lambda x: x.replace("\\", ''), hrefs)) # 得到的url中有多余的'\',因此我们将它替换为空
# map函数可以将一个函数作用于一个可迭代对象中的所有元素,而使用"\\"是为了防止转义
return hrefs
我们获取第一页的所有url,然后获取每个job页面的详细信息
def parse():
for i in get_url():
text=get_text(i)
html=etree.HTML(text)
# 职位名称
title=html.xpath("//h1/@title")[0]
# 公司名称
job_dict['company']=html.xpath('//div[contains(@class,cn)]/p/a/@title')[0]
# 招聘要求
require=html.xpath('//div[contains(@class,cn)]/p[2]/@title')[0]
require=require.split('|')
job_dict['location'] = require[0].replace(r'\xa0','') # 地点
job_dict['experience'] = require[1].replace(r'\xa0','') # 经验
job_dict['education'] = require[2].replace(r'\xa0','') # *敏*感*词*
# 职位描述
job_dict['what']=html.xpath("//div[@class='bmsg job_msg inbox']/p/text()")[0]
job_list.append(job_dict)
df=pd.DataFrame(job_list)
df.to_excel("51job职位详情.xlsx")
最后直接调用parse()函数,大功告成!!!
!!!当然可以加一个循环来抓取51job的多个页面,但是51job的IP检测好像很强。所以,如果要爬取51job的数据,就要准备大量的可用IP。所以,对于抗爬强网站来说,显然使用selenium更让人印象深刻,好吧,希望你看完这篇文章后能帮到你,谢谢阅读