requests+bs4+正则爬取前程无忧招聘信息进阶版
整理思路
- 获取所有职位信息的url
- 通过正则去掉不符合要求的url
- 爬取详情页信息
- 解析详情页
- 写入txt文件
- 循环抓取
- 提高速度多线程爬取
先放上url:https://search.51job.com/list/000000,000000,0000,00,9,99,+,2,1.html
url的最后“1.html”中的1是指第一页第二页就是2.html以此类推我们可以使用一个变量替代实现循环抓取
分析网页结构:
提取详情页url:
使用谷歌F12后审查元素我们发现所有的url都包含在p标签的span标签中
我们先选中所有的p标签然后再提取出里面的span和a标签
url_items = soup.select('#resultList .el .t1')
我们打印一下提取出来的p标签
我们发现多了一条没用的信息没关系我们删掉他
url_items = soup.select('#resultList .el .t1')
url_items.pop(0)
接下来我们提取所有span标签中的a标签的href属性
for url_item in url_items:all_a = url_item.find('span').find('a')print(all_a['href'])
通过打印a标签的href属性我们又发现了一个新问题
并不是所有的url都是可以抓取的
通过观察我们会发现能够抓取的url都是以http或https开头然后是jobs.51job.com最后以t=0结尾
我们通过正则过滤掉无效的url
pattern = re.compile(r'.*?://jobs.*?t=0')
这样我们抓取的详情页url就都符合规范了
抓取详情页
套路和抓取详情页url一样我就不过多赘述了
解析详情页
我们所需要的信息:职位名称、公司、地点、薪资、经验要求、学历要求、人数、时间和职位信息
我们通过bs4的css选择器依次提取,不熟悉bs4的小伙伴可以去看一下官方文档很简单的bs4中文文档
我直接上代码了
其中:地点、经验、学历、职位信息等很不规范,有的网页有,有的网页没有所以我们无法规范的抓取所以对于地点等标签我们全部抓取然后加在一个列表里。对于职位信息我们定位到包含职位信息的div通过正则提取出所有中文,有能力的小伙伴可以爬一下智联那个比较规范不过智联反爬比较厉害能爬的信息也比较少只有12页数据都是通过ajax动态加载的
regx = re.compile(r'[\u4e00-\u9fa5]+')
soup = BeautifulSoup(html,'lxml')job = soup.select('.tHeader.tHjob .in .cn h1')[0]['title']salary = soup.select('.tHeader.tHjob .in .cn strong')[0].textcompany = soup.select('.tHeader.tHjob .in .cn .cname .catn')[0]['title']info = soup.select('.tHeader.tHjob .in .cn .msg.ltype')[0]['title'].replace('\xa0\xa0','')info_list = info.split('|')job_info_item = soup.select('.bmsg.job_msg.inbox')[0].textregx = re.compile(r'[\u4e00-\u9fa5]+')job_info = ''.join(re.findall(regx,job_info_item))
写入txt文件
def write_to_file(data):with open('result.txt','a+',encoding='utf-8') as f:datas = json.dumps(data,ensure_ascii=False)f.write(datas+'\n')f.close()
循环抓取
for i in range(1,2001):url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%2B,2,'+str(i)+'.html?'
看一下效果:
多线程
from multiprocessing import Pool
pool = Pool
pool.map(main,[i for i in range(1,2001)])
ps:如果不是对速度有要求不要使用多线程我们也要考虑服务器的压力尽量使用time.sleep()控制自己的爬取速度如果速度过快很多网站都是会封ip的提高速度的话也可以使用scrapy爬取
最后放上完整代码供大家交流
# 作者: LENOVO
# 时间: 2019/3/22 8:50
import json
from multiprocessing import Pool
import requestsfrom bs4 import BeautifulSoup
import reheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}def get_all_url(url):try:response = requests.get(url, headers=headers)if response.status_code == 200:response.encoding = response.apparent_encodingreturn response.textreturn Noneexcept ConnectionError:return Nonedef parse_url(html):soup = BeautifulSoup(html, 'lxml')url_items = soup.select('#resultList .el .t1')url_items.pop(0)for url_item in url_items:all_a = url_item.find('span').find('a')yield all_a['href']def deal_with_url(href_list):pattern = re.compile(r'.*?://jobs.*?t=0')urls = []for href in href_list:url_list = re.findall(pattern, href)if len(url_list) != 0:urls.append(url_list[0])return urlsdef get_detail_html(url):try:response = requests.get(url, headers=headers)if response.status_code == 200:response.encoding = response.apparent_encodingreturn response.textreturn Noneexcept ConnectionError:return Nonedef parse_detail(html):soup = BeautifulSoup(html, 'lxml')job = soup.select('.tHeader.tHjob .in .cn h1')[0]['title']salary = soup.select('.tHeader.tHjob .in .cn strong')[0].textcompany = soup.select('.tHeader.tHjob .in .cn .cname .catn')[0]['title']info = soup.select('.tHeader.tHjob .in .cn .msg.ltype')[0]['title'].replace('\xa0\xa0', '')info_list = info.split('|')# location = info_list[0]# exp = info_list[1]# amount = info_list[2]# date = info_list[3]job_info_item = soup.select('.bmsg.job_msg.inbox')[0].textregx = re.compile(r'[\u4e00-\u9fa5]+')job_info = ''.join(re.findall(regx, job_info_item))yield {'job': job,'salary': salary,'company': company,'info_list': info_list,# 'location':location,# 'exp':exp,# 'amount':amount,# 'date':date,'job_info': job_info}def write_to_file(data):with open('result.txt', 'a+', encoding='utf-8') as f:datas = json.dumps(data, ensure_ascii=False)f.write(datas + '\n')f.close()def main(offset):print('正在抓取', offset)url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,%2B,2,' + str(offset) + '.html?'url_html = get_all_url(url)if url_html:href_list = parse_url(url_html)urls = deal_with_url(href_list)for url1 in urls:detail_html = get_detail_html(url1)if detail_html:details = parse_detail(detail_html)for detail in details:# print(detail)write_to_file(detail)if __name__ == '__main__':# for i in range(1,2001):# main(i)pool = Pool()pool.map(main, [i for i in range(1, 2001)])
后续我会放上使用flask+echarts对这些数据的分析以及可视化请大家继续关注
招聘信息可视化(https://blog.csdn.net/qq_42844049/article/details/88800107)
这里面我只放了一张柱状图因为懒癌犯了,如有需要其他图的同学可以联系我
requests+bs4+正则爬取前程无忧招聘信息进阶版相关推荐
- Python爬虫新手入门教学:爬取前程无忧招聘信息
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本开发环境 Python 3.6 Pycharm 相关模块的使用 requests parsel ...
- Python爬虫实战之一 - 基于Requests爬取拉勾网招聘信息,并保存至本地csv文件
Python爬虫实战之二 - 基于Requests抓取拉勾网招聘信息 ---------------readme--------------- 简介:本人产品汪一枚,Python自学数月,对于小白,本 ...
- 抓取前程无忧招聘信息
抓取前程无忧招聘信息 本文通过分析前程无忧的相关规则,通过python来抓取相关的招聘信息,并通过redis缓存相关信息,实现增量抓取. 相关技术 python3.6 requests redis m ...
- 什么你还不知道招聘信息,小唐来教你——最新2021爬取拉勾网招聘信息(一)
文章目录 前言 一.准备我们的库 二.分析分析 三. 代码 四.数据展示 小唐的心路历程 上一篇:没有啦! 下一篇:什么你还不知道招聘信息,小唐来教你--最新2021爬取拉勾网招聘信息(二) 前言 有 ...
- Python搭建代理池爬取拉勾网招聘信息
先来看一张图了解下爬虫 实现功能 多线程爬取拉勾网招聘信息 维护代理 ip 池 搭建 node 服务器 Taro 使用 echarts 做数据分析 1.多线程爬取拉勾网招聘信息 Tip:涉及知识 1. ...
- 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息
使用Scrapy框架爬取拉勾网招聘信息 最近接触了Scrapy爬虫框架,简单写了个爬虫爬取拉钩网的招聘信息,加深对Scrapy框架的理解,不得不说Scrapy框架其实还是蛮方便的,就像爬虫流水线一样, ...
- scrapy爬取——阿里招聘信息
scrapy爬取--阿里招聘信息 爬取网站地址: https://job.alibaba.com/zhaopin/positionList.htm 1.创建项目 进入项目目录 输入cmd进入都是窗口创 ...
- day02 requests请求库爬取豆瓣电影信息+selenium请求库
一. requests请求库爬取豆瓣电影信息 - 请求url http://movie.douban.com/top250 - 请求方式 GET - 请求头 user-agent cookies ...
- 什么你还不知道招聘信息,小唐来教你——最新2021爬取拉勾网招聘信息(二)
文章目录 前言 一.准备我们的库 二.数据清洗 三.核密度图及词云制作 四.完整代码 五.扩展 上一篇:什么你还不知道招聘信息,小唐来教你--最新2021爬取拉勾网招聘信息(一) 下一篇:没有拉! 前 ...
最新文章
- 图像语义分割之FCN和CRF
- toad for oracle xpert edition,Toad for oracle 软件产品模块对比,方便大家选型
- 本周ASP.NET英文技术文章推荐[06/03 - 06/09]
- spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX)
- 梯度下降法Gradient Descent深度学习 机器学习
- ins40401 oracle,安装orace grid infrastructure 提示[INS-40404]问题
- 在區塊鏈上建立可更新的智慧合約(二)
- coreos 安装mysql_CoreOS 在 PC 上快速安装方法指南
- IIS新建站点服务器,localhost能登录但是IP访问登录不了。
- [转]解决mySQL占用内存超大问题
- 去哪儿 Api 自动化测试实践
- @程序员,不会设计项目?有了这个工具,轻轻松松
- 大数据技术笔记之数据采集和预处理
- android手机的mqtt测试工具,sIoT及安卓app实现mqtt实验
- Capture One使用的几个小技巧
- 【无标题】我们的三周年————致我的小宝贝
- Lifeline功能介绍02——个人事件的添加
- Win10离线安装.NET Framework 3.5的方法总结
- Spring Cloud 学习笔记(1 / 3)
- 【Python教程】史上最全Python快速入门教程,满满都是干货
热门文章
- linux使用mv报资源或什忙,一天一个Linux命令(第6天mv命令)
- python之数据文件批量清洗,入库
- HTML小项目之双色球
- 计算机紧缺岗位,广东省急需紧缺人才缺口还有45335人 最需计算机服务
- 苏州市全国计算机二级报名,2021年3月苏州市计算机二级报名时间|网上报名入口【12月28日开通】...
- idea 修改SVN账户信息
- 黑莓开发之环境的搭建
- 如何彻底关闭Windows10系统更新带来的天气、资讯和兴趣删除开机任务栏右下角的广告自动弹窗程序
- 让我们拥抱DataV,感受数据可视化的魅力
- Android apk 编译版