轻松拿到51job数千条职位信息

51job数据抓取(普通速度)

导入模块
import time # 
import csv
import requests
from lxml import etree

U-A伪装

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"}

对"数据"关键词进行职位搜索
数据搜索

对搜索页面使用xpath提取信息获得职位的名称(Text_list) 、薪资(Salary_list) 、公司名称(Company_name)、地点(City_list) 、发布时间(Data_list) 、以及详情页url(deep_url)

"""
名称(Text_list) 、薪资(Salary_list) 、公司名称(Company_name)、地点(City_list) 、发布时间(Data_list) 、以及详情页url(deep_url)。

获取到的这些信息都是以列表形式进行存储的,每个列表中有50个职位信息。
其中薪资(Salary_list)列表中有空值,需要进行处理。
"""
# 创建文件保存
f = open("51job1.csv", "a", encoding="utf-8")
for n in range(1,150):
    url = "https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,{}.html?".format(n)
    print("正在抓取:"+url)
    response = requests.get(url,headers=headers)
    html = etree.HTML(response.content.decode('gbk'))
    #获取职位名称
    Text_list = html.xpath("//div[@class='el']/p/span/a/@title")
    # 薪资
    a = html.xpath("//div[@class='el']/span[@class='t4']")
    Salary_list = [i.text for i in a] 
    # 公司名称
    Company_name = html.xpath("//div[@class='el']/span[@class='t2']/a/@title") 
    # 地点
    City_list = html.xpath("//div[@class='el']/span[@class='t3']/text()") 
    # 发布时间
    Data_list = html.xpath("//div[@class='el']/span[@class='t5']/text()") 
    # 获取职位详情页的url
    deep_url =html.xpath('//div[@class="dw_table"/div[@class="el"]//p/span/a[@target"_blank"]/@href')
    # 调用详情页处理函数
	get_detail(deep_url)

通过详情页url获取岗位描述信息、公司类型、公司规模、所属行业等信息

'''
将详情页请求信息封装成函数,方便改写线程池,以便增快爬取速度。

传入deep_url。通过xpath获取到的deep_url是列表形式存储的url。
所以需要对其进行for循环遍历。遍历得到的信息对应的是和deep_url列表同级的列表中的信息。

for i in range(len(deep_url)):对deep_url的长度进行遍历。使用i作为下标将详情页中得到的信息和主页得到的信息列表进行配对。

normalize-space() 获取xpath文本内容时忽略空格空行。
'''
def get_detail(deep_url):
    for i in range(len(deep_url)):
        try:
            web_test = requests.get(deep_url[i], headers=headers)
            dom = etree.HTML(web_test.content.decode('gbk'))
        except:
            pass
        # 7、学历经验信息
        random_all = dom.xpath('//div[@class="tHeader tHjob"]//div[@class="cn"]/p[@class="msg ltype"]/text()')
        # 8、岗位描述信息
        job_describe = dom.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/p/text() ')
        if len(job_describe) > 10:
            pass
        else:
            job_describe = dom.xpath(
                'normalize-space(//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"])')
        # job_describe = job_describe.strip()
        # 9、公司类型
        company_type = dom.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[1]/@title')
        # 10、公司规模(人数)
        company_size = dom.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[2]/@title')
        # 11、所属行业(公司)
        industry = dom.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[3]/@title')
        # 为了反爬,设置睡眠时间
        time.sleep(1)
        # 转换成json格式
        items = {"职位名称": Text_list[i], "薪资": Salary_list[i], "地点": City_list[i], "发布时间": Data_list[i],
                 "学历经验": random_all,
                 "岗位描述信息": job_describe, "公司类型": company_type, "公司规模": company_size, "公司所属行业": industry}
        json_data = json.dumps(items, ensure_ascii=False) + ",\n"
        # 创建文件保存
        f.write(json_data)

正在获取信息
在这里插入图片描述

51job数据高速抓取(线程池)

from multiprocessing.dummy import Pool
import time
import csv
import requests
from lxml import etree

'''
第一步:在列表页批量拿到职位初步信息(职位名称、公司名、薪资、地点、发布时间、详情页url)
第二步:在详情页里拿到职位详细信息(学历经验要求、岗位描述信息、公司类型、公司规模、所属行业)
'''

count = 0
f = open("51job.csv", "a",newline='', encoding="gbk")
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"}

def req(durl): # 拿到一个详情页url进行第二步获取数据
    web_test = requests.get(durl, headers=headers)
    dom_test = etree.HTML(web_test.content.decode('gbk'))
    # 7、学历,经验
    random_all = dom_test.xpath('//div[@class="tHeader tHjob"]//div[@class="cn"]/p[@class="msg ltype"]/text()')
    # 8、岗位描述信息
    job_describe = dom_test.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/p/text() ')
    if len(job_describe) > 10:
        pass
    else:
        job_describe = dom_test.xpath(
            'normalize-space(//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"])')
    # 9、公司类型
    company_type = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[1]/@title')
    # 10、公司规模(人数)
    company_size = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[2]/@title')
    # 11、所属行业(公司)
    industry = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[3]/@title')
    # 为了反爬,设置睡眠时间
    time.sleep(1)
    # 一个页面有50个职位,i是这一页50个职位的第i个,对应详情页里面的信息和列表页的公司名称职位名称等信息
    i = deep_url.index(durl)
    items = [Text_list[i] ,Company_name[i] ,Salary_list[i] ,City_list[i], Data_list[i], random_all, job_describe, company_type, company_size, industry]
    # 创建文件保存
    # print(items)
    writer = csv.writer(f)
    writer.writerow(items)
    global count
    count += 1
    print("已抓取:", str(count)) # 打印当前页面50个职位信息中,已抓取数量

if __name__ == '__main__':
    pool = Pool(5)
    for n in range(1,150): #  第一步获取列表页可以直接拿到的信息和职位详情页的url
        url = "https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,{}.html?".format(n)
        print("正在抓取:"+url)
        response = requests.get(url,headers=headers)
        html = etree.HTML(response.content.decode('gbk'))
        Text_list = html.xpath("//div[@class='el']/p/span/a/@title")#获取职位
        a = html.xpath("//div[@class='el']/span[@class='t4']") # 有的职位信息内容为空,进一步处理
        Salary_list = [i.text for i in a] # 薪资
        Company_name = html.xpath("//div[@class='el']/span[@class='t2']/a/@title") # 公司名称
        City_list = html.xpath("//div[@class='el']/span[@class='t3']/text()") # 地点
        Data_list = html.xpath("//div[@class='el']/span[@class='t5']/text()") # 发布时间
        deep_url = html.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@href') # 详情页url
        try:
            pool.map(req, deep_url)
        except:
            print("当前页面抓取缺失")
    pool.close()
    pool.join()



本文仅做供学习交流,内容仅做参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值