python爬虫爬取实习僧岗位信息并存入excel数据表中

欢迎访问我的个人网站http://liubofeng.com

网页分析

博主在本博客中爬取的是数据分析岗位。
进入网站首页https://www.shixiseng.com/搜索数据分析,F12审查元素,可以发现岗位的薪资以及其他用数字表示的信息都被加密了,如下图所示:在这里插入图片描述

这也就意味着如果不破解字体加密,那么爬取到的薪资及其他数字数据将全部是上图中的乱码。

ctrl+u进入到网页源码,可以发现数据全是写在dom节点中的,那么只要破解字体加密再用xpath解析dom节点就可以爬取数据了。

F12审查元素,查看数字采用的哪一种字体:
在这里插入图片描述
从上图可以看到采用的是一种自定义字体:myFont
ctrl+u进入网页源码,ctrl+f在网页源码中搜索该字体: myFont,搜索结果如下图:
在这里插入图片描述
从上图可以看到该字体文件的相对路径,将该路径与实习僧的域名拼接即可得到完整的字体路径:www.shixiseng.com/interns/iconfonts/file?rand=0.12285263573042116
在浏览器中输入该路径就会下载一个名为file的文件,注意该文件是没有后缀名的,如下图:
在这里插入图片描述
将该文件重命名为file.ttf,然后将file.ttf文件移动到与你写的python文件的同一目录下,如下图所示,file.ttf文件与shixiseng.py文件都在实习僧_spider文件夹下,在同一目录下是为了方便在程序中使用file.ttf文件。

在这里插入图片描述在网页源码中,可以看到薪资被替换成了这样一串代码:在这里插入图片描述
&#xf0c7&#xe3c6&#xe3f5-&#xf0c7&#xe7ec&#xe3f5/天,与原网页对比就可以知道这串代码代表的是120-180/天。
现在要知道&#xf0c7&#xe3c6&#xe3f5是怎么解码成120的。

#将字体文件解析成xml文件
from fontTools.ttLib import TTFont
font = TTFont("file.ttf")
font.saveXML("font.xml")

在xml文件中搜索不到&#xf0c7,&#xe3c6,&#xe3f5,但是可以搜到xf0c7,xe3c6,xe3f5,下图是包含xf0c7的代码,code是键,name是值。
在这里插入图片描述
将name的值的uni后的字符31进行unicode解码,也就是对\u0031转中文得到1。
那么数字1的转换逻辑为&#xf0c7=>0xf0c7=>uni31=>\u0031=>1

代码

接下来直接上完整爬虫代码。

import requests
import xlwt
import urllib.parse
from lxml import etree
import re
from fontTools.ttLib import TTFont

font = TTFont("file.ttf")
font.saveXML("font.xml")

def get_dict():
    #打开并读取font.xml
    with open('font.xml') as f:
        xml = f.read()
        
    #正则表达式提取code和name
    keys = re.findall('<map code="(0x.*?)" name="uni.*?"/>', xml)
    values = re.findall('<map code="0x.*?" name="uni(.*?)"/>', xml)

    word_dict={}
    # 将name解码成中文并作为值写入字典word_dict,该字典的键为keys
    for i in range(len(values)):
        if len(values[i]) < 4:
            values[i] = ('\\u00' + values[i]).encode('utf-8').decode('unicode_escape')
        else:
            values[i] = ('\\u' + values[i]).encode('utf-8').decode('unicode_escape')
        word_dict[keys[i]]=values[i]
    print(word_dict)
    return word_dict

dict=get_dict()

#输入要爬取的岗位名称并转urlencode编码
job=input('请输入你要在实习僧爬取的实习岗位名称:')
job_urlencode=urllib.parse.quote(job)

def spider_sxs():
    #创建execl并设置列名
    workbook = xlwt.Workbook(encoding='utf-8')
    sheet1 = workbook.add_sheet('{}'.format(job))
    sheet1.write(0,0,'职位名称')
    sheet1.write(0,1,'工资')
    sheet1.write(0,2,'城市')
    sheet1.write(0,3,'出勤要求')
    sheet1.write(0,4,'实习周期')
    sheet1.write(0,5,'职位福利')
    sheet1.write(0,6,'公司名称')
    sheet1.write(0,7,'所属行业')
    sheet1.write(0,8,'公司规模')
    sheet1.write(0,9,'投递链接')
    sheet1.write(0,10,'公司链接')

    # 设置excel列宽度
    sheet1.col(0).width = 256 * 30
    sheet1.col(1).width = 256 * 20
    sheet1.col(2).width = 256 * 10
    sheet1.col(3).width = 256 * 15
    sheet1.col(4).width = 256 * 15
    sheet1.col(5).width = 256 * 60
    sheet1.col(6).width = 256 * 20
    sheet1.col(7).width = 256 * 20
    sheet1.col(8).width = 256 * 15
    sheet1.col(9).width = 256 * 30
    sheet1.col(10).width = 256 * 30

    sheet1_row=0
    # 解析网页源代码
    for i in range(1,int(input('请输入要爬取{}岗位的页数:'.format(job)))+1):
        url='https://www.shixiseng.com/interns?page={}&type=intern&keyword={}&area=&months=&days=&degree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%85%A8%E5%9B%BD&internExtend='.format(i,job_urlencode)
        print('第{}页的链接是:{}'.format(i,url))

        response=requests.get(url)
        response_text=response.text.replace('&#','0')       #将源码中&#xefed=>0xefed
        for key in dict:
            response_text=response_text.replace(key,dict[key])      #0xefed格式=>对应的字典的值


        html_sxs=etree.HTML(response_text)
        all_div=html_sxs.xpath('//*[@id="__layout"]/div/div[2]/div[2]/div[1]/div[1]/div[1]//div[@class="intern-wrap intern-item"]')

        # 循环语句获取数据并存入excel
        for item in all_div:
            try:
                # 获取数据
                job_name = item.xpath('.//a[@class="title ellipsis font"]/text()')[0]       #职位名称
                wages = item.xpath('.//span[@class="day font"]/text()')[0]      #工资
                city = item.xpath('.//span[@class="city ellipsis"]/text()')[0]      #城市
                week_time = item.xpath('.//span[@class="font"]/text()')[0]      #出勤要求
                work_time = item.xpath('.//span[@class="font"]/text()')[1]      #实习周期
                job_welfare = item.xpath('.//span[@class="company-label"]/text()')[0]       #职位福利
                company_name = item.xpath('.//a[@class="title ellipsis"]/text()')[0]       #公司名称
                company_type = item.xpath('.//span[@class="ellipsis"]/text()')[0]       #所属行业
                company_size = item.xpath('.//span[@class="font"]/text()')[2]       #公司规模
                job_href = item.xpath('.//a[@class="title ellipsis font"]/@href')[0]    #投递链接
                company_href = item.xpath('.//a[@class="title ellipsis"]/@href')[0]     #公司链接

                # 向execl写入数据
                sheet1_row=sheet1_row+1
                sheet1.write(sheet1_row,0,job_name)
                sheet1.write(sheet1_row,1,wages)
                sheet1.write(sheet1_row,2,city)
                sheet1.write(sheet1_row,3,week_time)
                sheet1.write(sheet1_row,4,work_time)
                sheet1.write(sheet1_row,5,job_welfare)
                sheet1.write(sheet1_row,6,company_name)
                sheet1.write(sheet1_row,7,company_type)
                sheet1.write(sheet1_row,8,company_size)
                sheet1.write(sheet1_row,9,job_href)
                sheet1.write(sheet1_row,10,company_href)

            except:
                ''

    workbook.save('实习僧{}岗位.xls'.format(job))
    print('爬取成功')
    print('------------------------------------------------------')
spider_sxs()

结果

爬取结果部分截图如下:
在这里插入图片描述

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值