欢迎访问我的个人网站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 TTFontfont = TTFont("file.ttf")
font.saveXML("font.xml")def get_dict():#打开并读取font.xmlwith open('font.xml') as f:xml = f.read()#正则表达式提取code和namekeys = re.findall('<map code="(0x.*?)" name="uni.*?"/>', xml)values = re.findall('<map code="0x.*?" name="uni(.*?)"/>', xml)word_dict={}# 将name解码成中文并作为值写入字典word_dict,该字典的键为keysfor 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_dictdict=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 * 30sheet1.col(1).width = 256 * 20sheet1.col(2).width = 256 * 10sheet1.col(3).width = 256 * 15sheet1.col(4).width = 256 * 15sheet1.col(5).width = 256 * 60sheet1.col(6).width = 256 * 20sheet1.col(7).width = 256 * 20sheet1.col(8).width = 256 * 15sheet1.col(9).width = 256 * 30sheet1.col(10).width = 256 * 30sheet1_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=>0xefedfor 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"]')# 循环语句获取数据并存入excelfor 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+1sheet1.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()

结果

爬取结果部分截图如下:

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

  1. python爬虫爬取古诗词内容,并存入mysql

    python爬虫爬取古诗词内容,并存入mysql 爬取结果展示: 代码如下: from urllib import request import re,os import pymysql import ...

  2. python爬虫-爬取当当网书籍信息存到Excel中

    文章目录 一.任务 二.分析 (一).单页面的信息分析 源代码分析 目标信息定位与分析 代码设计 (二).所有目标页面链接分析 目标链接分析 代码设计 三.注意要点 四.完整代码 五.参考 一.任务 ...

  3. 上手快!!福利局!新手如何使用python爬虫爬取网页图片(使用正则进行数据解析)当然这个新手是我自己

    作为一个python新入门小白,突然就想发个博客,一方面为了记录学习历程,一方面能分享给新入门的同学经验,更多的是想和大家一起学习和交流.以下是我以小白的角度分享的爬虫的相关知识和一个简单的爬取网页图 ...

  4. python爬虫 爬取淘宝搜索页面商品信息数据

    主要使用的库: requests:爬虫请求并获取源码 re:使用正则表达式提取数据 json:使用JSON提取数据 pandas:使用pandans存储数据 以下是源代码: #!coding=utf- ...

  5. python爬虫爬取虎扑湖人论坛专区帖子数据,并存入MongoDB数据库中

    今天就带大家从头到尾一步一步带着大家爬取虎扑论坛帖子的数据,里面涉及到的一些知识,我会给出学习的连接,大家可以自行去学习查看. 前期准备 首先我们打开虎扑NBA论坛,我选择的是湖人专区(小湖迷一个). ...

  6. python爬虫 爬取 豆瓣网 搜索结果 同城活动 数据

    主要使用的库: requests:爬虫请求并获取源码 re:使用正则表达式提取数据 json:使用JSON提取数据 pandas:使用pandans存储数据 bs4:网页代码解析 以下是源代码: #! ...

  7. 使用requests爬取实习僧网站数据

    任务要求: 爬取实习僧网站的招聘公司信息和职位信息,并存储到数据库中,对应的数据库表和需要爬取的字段见下面表一和表二(注意:爬取存在的字段) 代码以上传带github上:使用requests爬取实习僧 ...

  8. 在当当买了python怎么下载源代码-python爬虫爬取当当网

    [实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...

  9. python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例

    这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...

最新文章

  1. RequestResponse总结
  2. linux检查邮件命令,Linux:mail的邮件收发及查看
  3. python安装包-Python软件包的安装(3种方法)
  4. 数据更改后推送_合格的数据科学家,这些Github知识必须了解
  5. POJ - 2318 TOYS(叉积+二分)
  6. android调用fragment的方法,AndroidX下使用Activity和Fragment的变化
  7. 版本之间如何兼容_Spring Boot 2.4 版本的系统运行要求
  8. day31-python阶段性复习五
  9. 决策树(十一)--GBDT补充
  10. 「08」回归的诱惑:深入浅出逻辑回归(Python实战篇)
  11. atitit.高性能遍历 文本文件行 attilax总结
  12. php获取mysqli_query内容,PHP mysqli_query() 函数 - PHP 基础教程
  13. 《勤哲Excel服务器专业开发》
  14. 数据结构WSADATA
  15. 【5G核心网】 NGAP 消息
  16. oracle第二天笔记
  17. 蓝桥杯(纯C)比赛--菜鸟级
  18. 【MySQL练习】数据查询(02)-简易版
  19. 数据可视化实验一之单变量数据的统计图表可视化
  20. 【pandas】df.str.contains包含多个值写法

热门文章

  1. matlab数字信号处理(1)——正弦信号生成与时域分析
  2. [java] POI shiftRows 移动后合并的单元格被拆分了
  3. 前端开发遇到 STATUS_BREAKPOINT
  4. 洛谷P1008 [NOIP1998 普及组] 三连击题解
  5. 计算机无法转换输入发,电脑无法切换输入法怎么办
  6. 盘点中国未来最具潜力的IT培训学校前5名
  7. 微博html5版什么手机,搜狐微博推出全新手机HTML5触屏版
  8. Mac运行已安装软件提示“XXX 已损坏,打不开。移到废纸篓/推出磁盘映像。”解决方法
  9. python使用pandas模块介绍以及使用,dataframe结构,Series结构,基本数据操作,DataFrame运算,pandas画图,存储,缺失值处理,离散化,合并
  10. Logisim中六进制计数器的设计