实习僧网站

实习僧网址,地址为北京,在搜索框输入“python”,如下

实战解析

步骤一、建立for循环爬取前20页的内容

首先、查看翻页URL的信息,找规律

第一页:https://www.shixiseng.com/interns?page=1&keyword=python&type=intern&area=&months=&days=&degree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%8C%97%E4%BA%AC&internExtend=
第二页:https://www.shixiseng.com/interns?page=2&keyword=python&type=intern&area=&months=&days=&degree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%8C%97%E4%BA%AC&internExtend=
第三页:https://www.shixiseng.com/interns?page=3&keyword=python&type=intern&area=&months=&days=&degree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%8C%97%E4%BA%AC&internExtend=
......

发现只有page=后面的数值是不一样的,所以构造for循环(先获取少一点的页面),如下

for i in range(1,5):req = requests.get(f'https://www.shixiseng.com/interns?page={i}&keyword=python&type=intern&area=&months=&days=&degree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%8C%97%E4%BA%AC&internExtend=',headers = headers)html = req.text
步骤二、获取每个职位的URL信息

进入浏览器后,点击检查,定位到职位一栏然后右侧会显示出对应的标签信息,可以信息是在div下的两个class标签下(class=“intern-wrap intern-item”,其中有一个空格,代表里面有两个class属性)

这时候就可以在右下方的查找框输入“.intern-wrap.intern-item"进行标签的搜索(注意这里是有两个点的)

soup = BeautifulSoup(html,'lxml')
offers = soup.select('.intern-wrap.intern-item')

接着是找到每个职位对应的URL,通过检查发现,该URL是在上面所选的标签的孙子class标签下面,因此可以使用“ .f-l.intern-detail__job a”方式访问(注意最开始是有个空格的,这里是访问了孙子标签,要有个空格,然后标签里面有一个空格,代表两个class属性,因此中间是要有两个点,最后选中该标签下的子标签a,中间加个空格即可),那么就可以遍历提取全部职位的URL信息了,关于里面的索引参数[0][‘href’],可以自己调试得出

for offer in offers:url = offer.select(" .f-l.intern-detail__job a")[0]['href']print(url)

–> 输出结果为:这里只截取了部分

将该部分获取URL的过程封装成为函数,方便调用

def job_url():for i in range(1,2):req = requests.get(f'https://www.shixiseng.com/interns?page={i}&keyword=python&type=intern&area=&months=&days=&degree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%8C%97%E4%BA%AC&internExtend=',headers = headers)html = req.textsoup = BeautifulSoup(html,'lxml')offers = soup.select('.intern-wrap.intern-item')for offer in offers:url = offer.select(" .f-l.intern-detail__job a")[0]['href']detail_url(url)

最下面一行代码执行的功能就是将获得职位的URL打开,然后获取该页面的标题,具体函数的调用在步骤三

步骤三、进入每个职位的详情页再爬取
def detail_url(url):html = requests.get(url,headers=headers).textsoup = BeautifulSoup(html, 'lxml')title = soup.title.textprint(title)job_url()

封装成函数后,只要调用函数即可,就不存在代码先后的问题了,这里直接调用job_url()函数就可以进行输出了,输出结果如下(时间是2020年2月3日的网站第一页的信息)

–> 输出结果为:

步骤四、获取公司名和职位名

点击职位相应的URL,进入后点击检查,然后找到公司对应的标签,右侧的标签信息可以看到

职位名::通过上面的输出,可以发现职位名称就在title里面,只需要按照“招聘”进行切分字符串,取第一个数据就是职位的名称了

job = title.split("招聘")[0]

公司名称:可以发现公司的名称在class="com_intro"下的子标签a中的class中,因此可以通过“.com_intro .com-name ”’方式获取(有两个点一个空格),注意对获得的数据进行格式的处理输出

company_name = soup.select('.com_intro .com-name')[0].text.strip()

–> 输出结果为:

步骤五、获取薪金(字体反爬虫)

首先找到有数字的标签信息,通过初步检查可以发现,这里面的数字经过反扒处理(是其自定义的字体),直接查看标签信息是无法知道具体的数值的

解决方式: 将数值对应的映射关系自己写一个出来

具体操作: 将薪资的内容获取到,然后转化成为我们可以识别的阿拉伯数字

进入具体的招聘信息的网页,找到薪金所对应的标签信息,然后发现其在两层class标签下,因此可以使用“.job_money.cutom_font”方式获取标签(中间两个点,没有空格)

salary_text = soup.select(".day.font")[0].text

–> 输出结果为:部分截图

★★★ 进行数据映射,也就是将上面这些我们没有办法识别的字符转化成为我们可以直接识别的数值

先进行一个试错,创建一个新的.py文件,查看一下这些字符经过解码后是什么样子?测试代码如下`

import requests
from bs4 import BeautifulSoup
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}url = "https://www.shixiseng.com/intern/inn_fxckjairtwke?mxa=asdd.0eqlx1.4xnxf0.b7vh6p"
req = requests.get(url,headers=headers)
html = req.text
soup = BeautifulSoup(html,"lxml")
job = soup.title.text.split("招聘")[0]
company_name = soup.select('.com_intro .com-name')[0].text.strip()
salary_text = soup.select(".job_money.cutom_font")[0].text
print("工作职位的名称为:{}\n薪金为:{}\n招聘公司的名称为:{}\n".format(job,salary_text,company_name))
print("该页面的薪金对应为:\n\n300-500/天")
print(f"{salary_text}".encode("utf-8"))

–> 输出结果为:

输出的前三行是为了查看采集的薪金是哪个公司和职位下的,用来确定输出我们可以直接识别的数值(300-500/天),最后一行就是输出将目标数据经过“utf-8”编码后所对应的输出十六进制的字符,经过比如可以发现,每个字符(包括数字和汉字)都应对\分割的三个字符组成的三块内容,分割如下:(这种对应的编码会更新)

数字3对应三块内容为:\xee\x85\xbc
数字0对应三块内容为:\xee\x8b\x92
数字5对应三块内容为:\xee\x87\x99
汉字天对应三块内容为:\xe5\xa4\xa9

因此按照这种方式就可以把数字对应的映射关系一一找到了

数字1对应的三块内容为:\xee\x9e\x88
数字2对应的三块内容为:\xef\x81\xa1
数字4对应的三块内容为:\xef\x84\xa2
数字6对应的三块内容为:\xee\x9b\x91
数字7对应的三块内容为:\xee\x94\x9d
数字8对应的三块内容为:\xee\xb1\x8a
数字9对应的三块内容为:\xef\x86\xbf

注意:数字7和9是在实习时间里面进行查找的,在薪金里面没有,重新解码后运行(也可以将所有的编码放在列表里,使用for循环)

salary = soup.select(".job_money.cutom_font")[0].text.encode("utf-8")
salary = salary.replace(b'\xee\x8b\x92',b"0")
salary = salary.replace(b'\xee\x9e\x88',b"1")
salary = salary.replace(b'\xef\x81\xa1',b"2")
salary = salary.replace(b'\xee\x85\xbc',b"3")
salary = salary.replace(b'\xef\x84\xa2',b"4")
salary = salary.replace(b'\xee\x87\x99',b"5")
salary = salary.replace(b'\xee\x9b\x91',b"6")
salary = salary.replace(b'\xee\x94\x9d',b"7")
salary = salary.replace(b'\xee\xb1\x8a',b"8")
salary = salary.replace(b'\xef\x86\xbf',b"9")
salary = salary.decode()
print("工作职位的名称为:{}\n薪金为:{}\n招聘公司的名称为:{}\n".format(job,salary,company_name))

–> 输出结果为:部分截图

全部代码

注意:网站的编码会更新,代码有时效性,掌握方法才是核心

import requests
from bs4 import BeautifulSoup
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}def detail_url(url):html = requests.get(url,headers=headers).textsoup = BeautifulSoup(html, 'lxml')title = soup.title.textjob = title.split("招聘")[0]company_name = soup.select('.com_intro .com-name')[0].text.strip()salary = soup.select(".job_money.cutom_font")[0].text.encode("utf-8")salary = salary.replace(b'\xee\x8b\x92',b"0")salary = salary.replace(b'\xee\x9e\x88',b"1")salary = salary.replace(b'\xef\x81\xa1',b"2")salary = salary.replace(b'\xee\x85\xbc',b"3")salary = salary.replace(b'\xef\x84\xa2',b"4")salary = salary.replace(b'\xee\x87\x99',b"5")salary = salary.replace(b'\xee\x9b\x91',b"6")salary = salary.replace(b'\xee\x94\x9d',b"7")salary = salary.replace(b'\xee\xb1\x8a',b"8")salary = salary.replace(b'\xef\x86\xbf',b"9")salary = salary.decode()print("工作职位的名称为:{}\n薪金为:{}\n招聘公司的名称为:{}\n".format(job,salary,company_name))def job_url():for i in range(1,2):req = requests.get(f'https://www.shixiseng.com/interns?page={i}&keyword=python&type=intern&area=&months=&days=&degree=&official=&enterprise=&salary=-0&publishTime=&sortType=&city=%E5%8C%97%E4%BA%AC&internExtend=',headers = headers)html = req.textsoup = BeautifulSoup(html,'lxml')offers = soup.select('.intern-wrap.intern-item')for offer in offers:url = offer.select(" .f-l.intern-detail__job a")[0]['href']detail_url(url)job_url()

–> 输出结果为:

【python实现网络爬虫(4)】实习僧网站信息爬取(字体反爬虫破解)相关推荐

  1. 爬虫实战:链家租房数据爬取,实习僧网站数据爬取

    前面已经进行了爬虫基础部分的学习,于是自己也尝试爬了一些网站数据,用的策略都是比较简单,可能有些因素没有考虑到,但是也爬取到了一定的数据,下面介绍两个爬过的案例. 爬虫实战 链家网站爬取 实习僧网站爬 ...

  2. 【2020-10-27】 scrapy爬虫之猎聘招聘信息爬取

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! scrapy爬虫之猎聘招聘信息爬取 1.项目场景 目标网址:https://www.liepin.com/zhao ...

  3. python爬虫 京东,苏宁,小米众筹网站信息爬取

    可代写python爬虫,收费可协商,用途需提前说明. 下面爬虫爬到的数据有100天左右,100家众筹的完整数据,需要的或者有写爬虫需求的同学可发邮件至starinsunriseabovesea@ali ...

  4. Python3--爬取数据之911网站信息爬取

    上代码: #*************************************************** #这份代码用于从911网站上爬取信息 #其中的IP.txt文件为我本地存IP的文件 ...

  5. Python爬虫学习教程 bilibili网站视频爬取!【附源码】

    Python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...

  6. python爬虫实践篇--------飞猪网站资料爬取

    一.什么是网页的http请求? Get请求:地址栏上明文显示了请求信息,即请求地址中带有符号 ? 的地址.请求速度快,但不安全 例如: 请求参数 wd 表示查询字段: pn表示页数,即pn=0 --& ...

  7. b站学python_Python爬虫学习教程 bilibili网站视频爬取!【附源码】

    python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...

  8. Python 爬虫练手项目—酒店信息爬取

    from bs4 import BeautifulSoup import requests import time import reurl = 'http://search.qyer.com/hot ...

  9. python爬取酒店信息_Python 爬虫练手项目—酒店信息爬取

    from bs4 import BeautifulSoup import requests import time import re url = 'http://search.qyer.com/ho ...

最新文章

  1. Python中yield和yield from的用法
  2. python 线程类 threading.Thread.join() 方法 (自闭,不让别人进来了)
  3. js 字符转换,小驼峰转大写字母开头并且加空格 changeDate -》 Change Date
  4. flume的概述和运行机制
  5. python中node.tag的用法_python在ui自动化中的一些常见用法
  6. 55 MM配置-评估和科目设置-定义账户分类参考
  7. mui switch 实现方案 让你的html 设计更贴近原生
  8. bzoj1941 [Sdoi2010]Hide and Seek 线段树
  9. MongoDB 的设计模式策略
  10. idea启动日志在哪里_艹,我的日志被Intellij IDEA 控制台给“吃”了!
  11. 分享一份适合练手的软件测试实战项目
  12. MacOS Mojave 安装 AI 東北きりたん 东北切蒲英 NEUTRINO 教程
  13. 行为金融(八):羊群行为
  14. 骚操作!快速创建JSON数据和解析JSON数据
  15. 单样本t检验之汽车引擎排放是否达标
  16. echart-pie
  17. lambda表达式与正则表达式
  18. 合成大西瓜漏洞作弊详解,教你如何生成三个大西瓜
  19. 强化学习之Grid World的时序差分算法解析【MiniWorld】SYSU_2023SpringRL
  20. iOS-Building for iOS Simulator, but the linked and embedded framework ‘XX.framework‘ was built for

热门文章

  1. kubeadm集群化部署多master节点(生产环境适用)
  2. 2022年中式烹调师(高级)操作证考试题库及模拟考试
  3. Either类java_怎样利用Either和Option进行函数式错误处理的示例
  4. opc客户端读取数据品质是bad_如何通过OPC自定义接口来实现客户端数据的读取
  5. 微信营销和微博营销有什么不同
  6. torch.utils.data.WeightedRandomSampler样本不均衡情况下带权重随机采样
  7. 用Java语言定义一个整数定义的数组,求奇数个数和偶数个数。
  8. 英语语法---四种句子类型的介绍
  9. 游戏机生产厂家不朽的神迹碎片系统详细攻略心得
  10. 增量学习 (Incremental Learning)