Python使用BeautifulSoup与selenium爬取Boos直聘
Hello,我是普通Gopher,00后男孩,极致的共享主义者,想要成为一个终身学习者。专注于做最通俗易懂的计算机基础知识类公众号。每天推送Golang技术干货,内容起于K8S而不止于K8S,涉及Docker、微服务、DevOps、数据库、虚拟化等云计算内容及SRE经验总结
=======================
初次见面,我为你准备了100G学习大礼包:
1、《百余本最新计算机电子图书》
2、《30G Golang学习视频》
3、《20G Java学习视频》
4、《90G Liunx高级学习视频》
5、《10G 算法(含蓝桥杯真题)学习视频》
6、《英语四级,周杰伦歌曲免费送!》
路过麻烦动动小手,点个关注,持续更新技术文章与资料!
数据采集
数据采集(Date Capture),又叫做数据获取,数据采集是将系统需要管理的所有对象的原始数据(外部数据)进行一系列的操作并输入到系统内部的一个接口。像摄像头、麦克风等等,都是数据采集工具,而在计算机世界,相应的数据采集工具就更多了,简单的采集工具有Hawk、八爪鱼等。在计算机广泛应用的今天,数据采集在多个领域具有非常重要的意义。它是计算机与外部物理世界连接的桥梁。
前几个月做了一个互联网加项目,是基于机器学习的一个简历招聘推荐系统
今天就分享一下当时爬取Boss直聘时的爬虫代码
用到的库
- Python3
- selenium
- BeautifulSoup
- os
- io
- re
简述思路
第一步 查看网站url与网站标签
可以看到所有的子网页与招聘职位便签都是有规律的,所以咱们可以从这里下手
代码
import io
import os
import re
import time
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome#寻找网站
def find_boss():main_html = BeautifulSoup(browser.page_source, "lxml")htmls_two = main_html.find_all("a", href=re.compile('\w.*?-\w.*?')) #寻找职位hreffor html_two in htmls_two: #遍历for i in range(1,100): #寻找下一页browser.get(base_url+html_two['href']+'?page='+str(i)+'&ka=page-'+str(i))print("第{}页".format(str(i))) #输出下一页soup_one = BeautifulSoup(browser.page_source, 'lxml')link_lists_nexts = soup_one.find_all('a', href=re.compile('job_detail/.*?~.html')) #寻找需要爬取的职位网站for link_lists_next in link_lists_nexts: #遍历html_end=base_url+link_lists_next['href']browser.get(html_end)reptilian() #执行爬虫函数time.sleep(1)#主函数
if __name__=='__main__':#获取目标网站url 与 创建招聘信息文件url='https://www.zhipin.com/?ka=header-home-logo'base_url='https://www.zhipin.com'#打开浏览器browser=Chrome()browser.get(url)#主函数find_boss()#关闭浏览器browser.close()
构造函数的时候使用了正则表达式匹配了第一页所有的招聘岗位网站
构造成功后可以爬虫就可以定位到想要爬取的具体招聘岗位网页了
第二步 爬取岗位具体信息
现在我们要根据要爬取的具体信息来分析标签了
#构造爬虫函数
def reptilian():page_source=browser.page_sourcesoup=BeautifulSoup(page_source, 'html.parser')#工作名称 学历 福利 工资company_info=soup.find('div', class_='info-primary')job_name = company_info.find('div', class_='name')study_infor=company_info.find('p',)job_tags=company_info.find('div',class_='job-tags')describe=soup.find('div',class_='text')#工作地址 公司名称detail_content=soup.find('div', class_='detail-content')company_name=detail_content.find('div', class_='name')company_addr=detail_content.find('div',class_='location-address')#去标签job_name = ' '.join('%s' % id for id in job_name)study_infor = ' '.join('%s' % id for id in study_infor)job_tags = ' '.join('%s' % id for id in job_tags)describe=' '.join('%s' % id for id in describe)company_name = ' '.join('%s' % id for id in company_name)company_addr = ' '.join('%s' % id for id in company_addr)cut = re.compile(r'<[^>]+>', re.S)job_name= cut.sub('', job_name)study_infor= cut.sub('', study_infor)job_tags= cut.sub('', job_tags)company_name= cut.sub('', company_name)company_addr= cut.sub('', company_addr)describe = cut.sub('', describe)f="-------------------------------------------------------------------------------------"infors=str(job_name)+str(study_infor)+str(job_tags)+str(company_name)+str(company_addr)+'\n'+"职位描述 : "+'\n'+str(describe)+'\n'+str(f)+'\n'write_data(file_path=file_path, file_name=file_name, data=infors)
可以添加个写入txt文件的函数,便于保存
# 创建文件函数(文件路径,文件名)
def establish_file(file_path, file_name):# 文件路径path = file_path + file_name# 判断文件是否存在if os.path.exists(path):print(file_name + "文件已经存在,正在删除~~~~~")# 删除原有的文件os.remove(path)print("原有文件已经删除,正在重新创建文件~~~~")# 创建文件(文件路径, 打开方式‘w’只写, 编码格式)f = io.open(path, 'w', encoding='utf-8')# 关闭文件f.close()print("文件创建成功!")# 将获取数据写入文件中(文件路径,文件名,数据)
def write_data(file_path, file_name, data):# 文件路径path = file_path + file_name# 打开创建文件(文件路径,打开方式'a'追加, 编码格式)f = io.open(path, 'a', encoding='utf-8')print("正在写入" + file_name + "...")# 数据写入文件f.write(data)print("写入成功")# 关闭文件f.close()
这样就成功将该招聘岗位的基本信息就爬取到了
自动化爬取
接下来就考虑将所有页数的与所有在招聘岗位自动化爬取了
import io
import os
import re
import time
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome# 创建文件函数(文件路径,文件名)
def establish_file(file_path, file_name):# 文件路径path = file_path + file_name# 判断文件是否存在if os.path.exists(path):print(file_name + "文件已经存在")else:f = io.open(path, 'w', encoding='utf-8')# 关闭文件f.close()print("文件创建成功!")# 主函数find_boss()# 将获取数据写入文件中(文件路径,文件名,数据)
def write_data(file_path, file_name, data):# 文件路径path = file_path + file_name# 打开创建文件(文件路径,打开方式'a'追加, 编码格式)f = io.open(path, 'a', encoding='utf-8')print("正在写入" +file_name + "...")# 数据写入文件f.write(data)print("写入成功")# 关闭文件f.close()#构造爬虫函数# 构造爬虫函数
def reptilian():page_source = browser.page_sourcesoup = BeautifulSoup(page_source, 'html.parser')try:# 工作名称 学历 福利 工资company_info = soup.find('div', class_='info-primary')job_name = company_info.find('div', class_='name')study_infor = company_info.find('p')job_tags = company_info.find('div', class_='job-tags')describe = soup.find('div', class_='text')# 工作地址 公司名称detail_content = soup.find('div', class_='detail-content')company_name = detail_content.find('div', class_='name')company_addr = detail_content.find('div', class_='location-address')# 剔除标签job_name = job_name.get_text("", strip=True)study_infor = study_infor.get_text("", strip=True)job_tags = job_tags.get_text("", strip=True)describe = describe.get_text("", strip=True)company_name = company_name.get_text("", strip=True)company_addr = company_addr.get_text("", strip=True)except AttributeError:print("该页面不存在,请跳过本次页面")else:f = "-------------------------------------------------------------------------------------"infors = "工作名称 工资:" + job_name + '\n' + "工作地点 工作经验 学历:" + study_infor + '\n' + "公司福利:" + job_tags + '\n' + "职位描述:" + describe + '\n' + "公司名称:" + company_name + '\n' + "工作地址:" + company_addr + '\n' + f + '\n'write_data(file_path=file_path, file_name=file_name, data=infors)#寻找网站
def find_boss():main_html = BeautifulSoup(browser.page_source, "lxml")job_list=main_html.find('div',class_="menu-sub")htmls_two = job_list.find_all("a", href=re.compile('\w.*?-\w.*?')) #寻找职位hreffor html_two in htmls_two: #遍历for i in range(1,11): #寻找下一页browser.get(base_url+html_two['href']+'?page='+str(i)+'&ka=page-'+str(i))print("第{}页".format(str(i))) #输出下一页soup_one = BeautifulSoup(browser.page_source, 'lxml')link_lists_nexts = soup_one.find_all('a', href=re.compile('job_detail/.*?~.html')) #寻找需要爬取的职位网站for link_lists_next in link_lists_nexts: #遍历html_end=base_url+link_lists_next['href']browser.get(html_end)reptilian() #执行爬虫函数time.sleep(1)#主函数
if __name__=='__main__':#获取目标网站url 与 创建招聘信息文件url='https://www.zhipin.com/?ka=header-home-logo'base_url='https://www.zhipin.com'file_path='E:\\' #路径file_name=str(input("请输入要创建的文件名称:"))#打开浏览器browser=Chrome()browser.get(url)#创建文件establish_file(file_path=file_path, file_name=file_name)#关闭浏览器browser.close()
注意
在设计代码的时候一定要考虑到404网站的存在,及时抛出异常,考虑周到
改进
import io
import os
import re
import time
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome#寻找网站
def find_boss():main_html = BeautifulSoup(browser.page_source, "lxml")job_lists = main_html.find('div', class_="menu-sub")job_list= job_lists.find_all("a", href=re.compile('\w.*?-\w.*?'))for html_two in job_list[79:]:browser.get(base_url+html_two['href'])soup_one = BeautifulSoup(browser.page_source, 'lxml')link_lists_nexts = soup_one.find_all('a', href=re.compile('job_detail/.*?~.html')) #寻找需要爬取的职位网站for link_lists_next in link_lists_nexts: #遍历html_end=base_url+link_lists_next['href']print(html_end)browser.get(html_end)# reptilian() #执行爬虫函数time.sleep(1)try: #下一页next_page =soup_one.find('div', class_="page")next_page_end = next_page.find("a", class_='next')browser.get(base_url + next_page_end['href'])except:pass #如果没有则退出#主函数
if __name__=='__main__':#获取目标网站url 与 创建招聘信息文件url='https://www.zhipin.com/?ka=header-home-logo'base_url='https://www.zhipin.com'#打开浏览器browser=Chrome()browser.get(url)#运行主函数find_boss()
这样,一个简单的python爬虫就实现了
Python使用BeautifulSoup与selenium爬取Boos直聘相关推荐
- part1 selenium爬取BOSS直聘信息
首先我们先梳理一下需求:想要使用的工具,想要获取的信息,以及想要保存的位置 其次可以选择常规方式书写也可以考虑面向对象的方式进行功能封装 这里采用常规方式书写 关键需要注意的点也已注释的方式写出 im ...
- 利用selenium爬取boss直聘
正在通过boss直聘求职,然后见网上有需求boss直聘的职位大数据的,就简单写了一下,发现boss直聘的反爬机制还是比较友好的,首先不需要登陆就可以获取所有的职位信息,其次如果想要避过boss反爬成功 ...
- Python集成scrapy和selenium爬取苏宁图书
Python集成scrapy和selenium爬取苏宁图书 环境:python3.6 pycharm2018.1.3 前言 本人渣渣一枚,为爬虫苏宁图书获取数据,将获得的数据保存在MangoDB中,现 ...
- 【python爬虫】在scrapy中利用代理IP(爬取BOSS直聘网)
同学们好,我又滚回来更新了,这一次我们要爬取的目标是BOSS直聘,BOSS直聘可以说是反爬虫一个很好的例子了,主要在于如果你访问他的次数过多,他就会出现验证码,要求你通过验证才能继续看,这样还算可以, ...
- 用BeautifulSoup简单爬取BOSS直聘网岗位
用BeautifulSoup简单爬取BOSS直聘网岗位 爬取python招聘 import requests from bs4 import BeautifulSoupdef fun(path):r1 ...
- 使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)
使用python爬取BOSS直聘岗位数据并做可视化 结果展示 首页 岗位信息 岗位详情 薪资表 学历需求 公司排名 岗位关键词 福利关键词 代码展示 爬虫代码 一.导入库 二.爬取数据 1.爬取数据代 ...
- Python笔记-爬取Boss直聘的招聘信息
Python笔记-爬取Boss直聘的招聘信息 最近迷上了爬虫,爬取招聘信息,存在MongoDB上 代码思路和上一篇爬取酷狗TOP500差不多,但是在使用CSS选择器的时候,有两组信息是连在一起,所以使 ...
- 【数据分析项目实战】Python爬取BOSS直聘岗位和数据分析
说明:这是一个数据分析项目全流程(附带项目实例),本篇教程来源于网络,胖哥对此进行了完整的梳理,并把用到的数据+代码完全奉上.如需数据+完整代码可以直接到文章最后获取. 这里面的数据,我只爬取了部分, ...
- python 爬取boss直聘招聘信息实现
1.一些公共方法的准备 获取数据库链接: import pymysql ''' 遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载! ''' ...
最新文章
- ue4 classuobject没有成员beginplay_关于UE4使用的一些想法(一)
- web笔记Error:That IP address
- hbase集群无法重启的可能原因之一及解决办法
- MATLAB数字信号处理函数
- Thrift异步IO服务器源码分析
- yum -y install与yum install有什么不同
- vmware workstation 8上面装vsphere5
- oracle group by 多类别_python数据关系型图表散点图系列多数据系列
- gff3转mysql_科学网-把GFF3文件导入MySQL数据库-闫双勇的博文
- 关于ie7下display:inline-block;不支持的解决方案
- 取消过账oracle,总帐过帐是状态是“正在处理” 如何处理?
- 百度邀您来听一场云存储的大戏!
- day 34 进程线程排序 抢票 初级生产者消费者
- 【C语言开源库】lw_oopc:轻量级的C语言面向对象编程框架
- alanwang[GDOU] 直接插入排序法简单演示
- PTA 离散数学-数理逻辑自测
- 计算共形几何讲座笔记
- 求数组所有非空子序列的和
- 7 索引,视图,同义词,序列,表空间
- 新冠疫情历史数据(COVID-19-Data)
热门文章
- c++学习笔记- 自制魔兽显血改键
- js除法四舍五入保留小数点后两位写法
- 什么叫多头,什么叫空头?
- 悟空(wukong)搜索引擎源代码阅读(待续)
- 数据分析/算法/建模/产品实习面经(字节跳动、爱奇艺、平安科技、石墨文档、欧克云链、水滴、茄子快传……)
- html视频教程全套
- 弹性盒子 Flex 子元素高度塌陷
- 华为2020校招软件开发岗全流程,已签约
- (4)复函数与拉普拉斯变换
- Error: stat_count() can only have an x or y aesthetic Run `rlang::last_error()` to see where the err