应届生爬虫

应届生爬虫-仅供学习使用

今天我们进行学习的目标网站是应届生
我们话不多说,直接进入爬虫学习。

经过我们的仔细分析,应届生这个网站是一个静态网站,数据在源码里面都能看到。这个网站没什么难点,不过比较狗的是,应届生的详情页有两种,一不小心就会踩到坑里面去。
详情页一:
在这里插入图片描述
详情页二:
在这里插入图片描述
既然我们提前知道了这个坑,要解决就简单了,我们只要把两个页面的数据提取语法都写出来,用if进行判读,就可以确保万无一失了。
例如提取职位名称:

        #职位名称
        job_name = html.xpath("//div[@class='main']/div[@class='section'][2]/h2/a[1]/text()").get()
        if job_name:
            job_name = job_name
        else:
            job_name = html.xpath("//div[@class='info clearfix']/ol/li[5]/u/text()").get()

这样,我们可以提取到正确的数据,不怕提取到的数据为空了。
具体的字段提取我们在这里就不一一介绍,后面会给出源码。
我们来看看这个网站的翻页:
这个是第一页:
https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start=0
这个是第二页:
https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start=10
这个是第三页:
https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start=20

对比这三个页面的链接,机智的同学一眼就看出来了,不同的是‘start=10/20/30‘的区别,没错,这个就是控制着翻页的关键点。我们只要利用for循环进行遍历,就可以轻松实现对数据的翻页了:

    for i in range(0,19990,10): #构建翻页
        print('正在获取第{}条数据,请稍等...'.format(i+1))
        time.sleep(1) #沉睡,防止速度过快被识别
        url = 'https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start={}'.format(i) #每一页的链接

最后,把我们所抓取的数据保存到csv文件就可以了。
下面,我们给出应届生爬虫的全部代码:

#author:渔戈

#导入程序所需的库
import requests
import parsel
import time
import csv
#构建头部信息
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'
}

#存储数据为csv文件
fp = open('应届生.csv','a',encoding='utf-8-sig',newline='')
writer = csv.writer(fp)
header=['公司名称','职位名称','发布时间','工作地点','工作类型','职位信息','工作id','来源']
writer.writerow(header)

'''开始'''
def start_url(url):
    response = requests.get(url,headers=headers) #请求网页链接
    # print(response.text)
    html = parsel.Selector(response.text)#解析网页
    detail_url = html.xpath("//ul/li//div/h3/a/@href").getall()#获得详情页链接
    # print(detail_url)
    return detail_url  #返回一个列表(列表里面是详情页链接)


'''解析'''
def parse_url(detail_url):
    for url in detail_url:
        response = requests.get(url,headers=headers)
        # response.encoding = response.apparent_encoding  #自动识别网页编码
        # result = response.content.decode(encoding='GBK', errors="ignore")
        response.encoding='gbk' #使用gbk编码,防止乱码
        # print(response.text)
        html = parsel.Selector(response.text)#解析页面

        ''' 数据提取  '''
        ''' 应届生招聘网站的详情页有多种,所以写了多种提取方法,使用if进行判断,以便能成功提取到数据'''
        #公司名称
        company_name = html.xpath("//div[@class='mleft']/h1/text()").get()
        if company_name:
            company_name = company_name
        else:
            company_name = html.xpath("//div[@class='loca']/a[3]/text()").get()
        if company_name == None:
            company_name = html.xpath("//div[@class='main mleft']/h1/text()").get()

        #职位名称
        job_name = html.xpath("//div[@class='main']/div[@class='section'][2]/h2/a[1]/text()").get()
        if job_name:
            job_name = job_name
        else:
            job_name = html.xpath("//div[@class='info clearfix']/ol/li[5]/u/text()").get()

        #发布时间
        pub_time = html.xpath("//div[@class='info clearfix']/ol/li[1]/u/text()").get()
        if pub_time:
            pub_time = pub_time
        else:
            pub_time = html.xpath("//div[@class='job_list']/ul/li[2]/span/text()").get()

        #工作地点
        job_city = html.xpath("//div[@class='info clearfix']/ol/li[2]//u/text()").get()
        if job_city:
            job_city = job_city
        else:
            job_city = html.xpath("//div[@class='job_list']/ul/li[1]/span/a/text()").get()

        #工作类型
        job_type = html.xpath("//div[@class='info clearfix']/ol/li[3]//u/text()").get()
        if job_type:
            job_type = job_type
        else:
            job_type = html.xpath("//div[@class='job_list']/ul/li[4]/text()").get()

        #职位信息
        job_information = ''.join(html.xpath("//div[@class='j_i']/text()").getall()).strip()
        if job_information:
            job_information = job_information.replace('\n','')
        else:
            job_information = ''.join(html.xpath("//div[@class='jobContent']//text()").getall()).replace('\n','').replace('\t','').replace('\s','').strip()
        # print(job_information)

        #工作id
        job_ids = response.url
        job_id = job_ids.split('/')[-1]
        job_id = job_id.split('.')[0]
        if len(job_id) < 15: #判断id长度,长度小于15的,说明该页面不存在,或已被删除
            continue  #若页面不存在,则终止该循环,进入下一次循环
        else:
            job_id=job_id

        # 来源
        source = html.xpath('//div[@class="info clearfix"]/ol/li[4]/a/text()').get()
        if source == None:
            source = html.xpath('//ul[@class="company_detail clearfix"]/li[1]/span/text()').get()

        #打印信息
        print(company_name,job_name,pub_time,job_city,job_type,job_information,job_id,source)

        #将数据写入csv文件
        data = [company_name, job_name, pub_time, job_city, job_type, job_information, job_id, source]
        writer.writerow(data)

if __name__ == '__main__':
    for i in range(0,19990,10): #构建翻页
        print('正在获取第{}条数据,请稍等...'.format(i+1))
        time.sleep(1) #沉睡,防止速度过快被识别
        url = 'https://s.yingjiesheng.com/search.php?word=%E5%A4%A7%E6%95%B0%E6%8D%AE&sort=score&start={}'.format(i) #每一页的链接
        detail_url = start_url(url)
        parse_url(detail_url)

爬取的数据如下:
在这里插入图片描述
在这里插入图片描述
感谢各位大佬的观看!鞠躬.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渔戈

创作不易,如有帮助,请鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值