Python通过Request库爬取拉钩数据

  • 爬取方法
  • 数据页面
  • 建表存储职位信息
  • 解析页面核心代码
  • 完整代码
  • 结果展示

爬取方法

采用python爬取拉钩数据,有很多方法可以爬取,我采用的是通过Request库获取页面,然后通过BeautifulSoup解析html,获取到想要的信息,我只爬取到拉钩页面的基础数据信息,详细信息没有深入去爬取。

数据页面

首先观察拉钩页面链接和响应之后的页面标签组成,爬取数据的方式可以通过检查页面请求找到某一个方法返回json数据,通过解析json数据来得到职位信息。而我没有直接去访问这个获取json文件来进行解析数据,我是直接访问下面这些链接来获取页面整个html,通过解析html来得到数据信息。

#访问java第一页职位信息的连接 如果需要访问下一页修改1为其他就行 同理访问python的岗位信息 把java替换成python就行了
https://www.lagou.com/zhaopin/Java/1/
https://www.lagou.com/zhaopin/Python/3/#python第三页的职位信息
https://www.lagou.com/zhaopin/PHP/5/ #php第五页的职位信息

访问这些链接得到页面很复杂,但是仔细查找,发现我们只需要下面的一段

<ul class="item_con_list"><li class="con_list_item default_list" data-index="0"data-positionid="5335566" data-salary="20k-35k"data-company="和创科技(红圈营销)" data-positionname="高级Java工程师"data-companyid="50889" data-hrid="4973631" data-adword="9"><span class="hurry_up"></span><div class="list_item_top"><div class="position"><div class="p_top"><a class="position_link"href="https://www.lagou.com/jobs/5335566.html"target="_blank" data-index="0" data-lg-tj-id="8E00"data-lg-tj-no="0101"data-lg-tj-cid="5335566"data-lg-tj-abt="dm-csearch-useLayeredDisplay|0"><h3>高级Java工程师</h3> <span class="add">[<em>北京·新街口</em>]</span></a> <span class="format-time">14:44发布</span></div><div class="p_bot"><div class="li_b_l"><span class="money">20k-35k</span><!--<i></i>-->经验5-10年 / 本科</div></div></div><div class="company"><div class="company_name"><a href="https://www.lagou.com/gongsi/50889.html"target="_blank" data-lg-tj-id="8F00"data-lg-tj-no="0101"data-lg-tj-cid="50889"data-lg-tj-abt="dm-csearch-useLayeredDisplay|0">和创科技(红圈营销)</a></div><div class="industry">移动互联网,企业服务 / 上市公司 / 500-2000人</div></div><div class="com_logo"><a href="https://www.lagou.com/gongsi/50889.html"target="_blank" data-lg-tj-id="8G00"data-lg-tj-no="0101"data-lg-tj-cid="50889"data-lg-tj-abt="dm-csearch-useLayeredDisplay|0"><imgsrc="//www.lgstatic.com/thumbnail_120x120/i/image/M00/03/44/Cgp3O1ax7JWAOSzUAABS3OF0A7w289.jpg"alt="和创科技(红圈营销)" width="60" height="60"></a></div></div><div class="list_item_bot"><div class="li_b_l"><span>后端</span> <span>平台</span></div><div class="li_b_r">“大牛云集”</div></div></li><li class="con_list_item default_list" data-index="1"data-positionid="3486431" data-salary="25k-45k"data-company="大圣互动" data-positionname="Java架构师"data-companyid="128535" data-hrid="5335898" data-adword="9"><span class="hurry_up"></span><div class="list_item_top"><div class="position"><div class="p_top"><a class="position_link"href="https://www.lagou.com/jobs/3486431.html"target="_blank" data-index="1" data-lg-tj-id="8E00"data-lg-tj-no="0102"data-lg-tj-cid="3486431"data-lg-tj-abt="dm-csearch-useLayeredDisplay|0"><h3>Java架构师</h3> <span class="add">[<em>北京·大望路</em>]</span></a> <span class="format-time">10:41发布</span></div><div class="p_bot"><div class="li_b_l"><span class="money">25k-45k</span><!--<i></i>-->经验5-10年 / 本科</div></div></div><div class="company"><div class="company_name"><a href="https://www.lagou.com/gongsi/128535.html"target="_blank" data-lg-tj-id="8F00"data-lg-tj-no="0102"data-lg-tj-cid="128535"data-lg-tj-abt="dm-csearch-useLayeredDisplay|0">大圣互动</a></div><div class="industry">移动互联网,文化娱乐 / B轮 / 15-50人</div></div><div class="com_logo"><a href="https://www.lagou.com/gongsi/128535.html"target="_blank" data-lg-tj-id="8G00"data-lg-tj-no="0102"data-lg-tj-cid="128535"data-lg-tj-abt="dm-csearch-useLayeredDisplay|0"><imgsrc="//www.lgstatic.com/thumbnail_120x120/i/image/M00/2B/E3/Cgp3O1c27OmABsMHAAA9KYW0IXE916.png"alt="大圣互动" width="60" height="60"></a></div></div><div class="list_item_bot"><div class="li_b_l"><span>分布式</span> <span>SOA</span> <span>系统架构</span></div><div class="li_b_r">“海外机会,获顶级投资,期权激励,带薪年假”</div></div></li><!--  期间省略很多li --></ul>

可以看出来 一个 ul 中的 li是一个职位的信息 ,一页大概有15个职位 所以去得到这个li里的数据存储到数据库中就可以了。

建表存储职位信息

根据页面信息和li里显示的信息,我们可以大致将按着下面的建表语句建数据表存储职位信息。

# 工作名称 公司地址 发布时间 薪资 要求 公司名称 公司介绍 工作标签 福利待遇工作环境
CREATE TABLE `lagou`  (`id` int(11) NOT NULL AUTO_INCREMENT,`jobname` varchar(200) ,`jobaddress` varchar(200),`time` varchar(150) ,`salary` varchar(50) ,`experience` varchar(100),`companyname` varchar(150) ,`companydetail` varchar(250) ,`flag` varchar(300),`fuli` varchar(300),PRIMARY KEY (`id`) USING BTREE
)  CHARACTER SET = utf8 ;

解析页面核心代码

下面代码中 通过request库获取连接返回的html页面,然后通过BeautifulSoup解析html,将刚才说的那个ul li给解析出来得到信息 存储到数据库中去。

    resp=requests.get(url,headers=headers,proxies= proxy)#获取htmlhtml_doc=resp.content.decode('utf-8')#进行编码soup = BeautifulSoup(html_doc,'html.parser')#用BeautifulSoup解析htmltarget=soup.find(id="s_position_list").find(name='ul',attrs={"class":"item_con_list"}).find_all('li');#获取工作职位db = pymysql.connect(**config)#连接数据库cursor = db.cursor()for i in target:jobaddress=i.find('em').stringjobname=i.find('h3').stringtime=i.find(name='span', attrs={"class": "format-time"}).stringsalary=i.find(name='span', attrs={"class": "money"}).stringexperience=i.find_all(name='div', attrs={"class": "li_b_l"})[0].get_text()companyname=i.find(name='div', attrs={"class": "company_name"}).a.stringcompanydetail=i.find(name='div',attrs={"class": "industry"}).stringtry:flag = i.find_all(name='div', attrs={"class": "li_b_l"})[1].span.stringexcept(Exception):print("error: 没有标签")flag="没有标签"fuli=i.find(name='div',attrs={"class": "li_b_r"}).string'''print("地址:" + jobaddress)print("工作:" + jobname);print("时间:" + time);print("工资:" + salary);print("经验:" + experience);print("公司名称:" +companyname);print("公司介绍:" + companydetail);print("工作标签:" + flag);print("工作环境:" + fuli);print("地址:" +i.find('em').string)print("工作:"+i.find('h3').string);print("时间:" + i.find(name='span',attrs={"class":"format-time"}).string);print("工资:" + i.find(name='span',attrs={"class":"money"}).string);print("经验:" + i.find_all(name='div',attrs={"class":"li_b_l"})[0].get_text());print("公司名称:" + i.find(name='div',attrs={"class":"company_name"}).a.string);print("公司介绍:" + i.find(name='div',attrs={"class":"industry"}).string);print("工作标签:" + i.find_all(name='div',attrs={"class":"li_b_l"})[1].span.string);print("工作环境:" + i.find(name='div',attrs={"class":"li_b_r"}).string);'''sql="insert  into  lagou(jobname,jobaddress,time,salary,experience,companyname,companydetail,flag,fuli) values(" \" %s,%s,%s,%s,%s,%s,%s,%s,%s)"# 连接数据库cursor.execute(sql,(jobname,jobaddress,time,salary,experience,companyname,companydetail,flag,fuli))db.commit()#提交#print(i)db.close()

完整代码

下面是整个完整代码,我加了一些代理池,每爬取一页就随机从代理池中获取ip去访问,并且每爬取一页就暂停15秒,下面代码还可以优化 直接将要查询的岗位作为参数传递进去 如同 页数一样 这里我就不再做详细介绍

#create by ljg
from bs4 import BeautifulSoup
import bs4
import time
import requests
import pymysql
import random
config={"host":"127.0.0.1","user":"root","password":"","database":"bysj","charset":"utf8"
}
def lagou(page,position):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36','Accept': 'application/json, text/javascript, */*; q=0.01',}#url='https://www.lagou.com/zhaopin/Java/'+str(page)+'/'#url = 'https://www.lagou.com/zhaopin/Python/' + str(page) + '/'url = 'https://www.lagou.com/zhaopin/PHP/' + str(page) + '/'#url = 'https://www.lagou.com/jobs/positionAjax.json'  {'http': 'http://117.114.149.66:53281'} {'http': 'http://116.209.54.151:9999'}proxy_list = [{'http': 'http://121.69.13.242:53281'}, {'http': 'http://116.209.57.6:9999'}, {'http': 'http://61.146.159.182:48557'}, {'http': 'http://218.76.253.201:61408'}, {'http': 'http://122.193.246.80:9999'}, {'http': 'http://60.223.243.21:32779'}, {'http': 'http://116.209.58.29:9999'}, {'http': 'http://117.81.136.128:9999'}, {'http': 'http://118.182.33.7:42801'}, {'http': 'http://124.93.201.59:59618'}, {'http': 'http://182.88.160.16:8123'}, {'http': 'http://106.87.83.197:8888'}]#proxy_list = {'http': 'http://112.85.173.170:9999'}proxy=random.choice(proxy_list)print("代理IP是:"+str(proxy))resp=requests.get(url,headers=headers,proxies= proxy)#获取htmlhtml_doc=resp.content.decode('utf-8')#进行编码soup = BeautifulSoup(html_doc,'html.parser')#用BeautifulSoup解析htmltarget=soup.find(id="s_position_list").find(name='ul',attrs={"class":"item_con_list"}).find_all('li');#获取工作职位db = pymysql.connect(**config)cursor = db.cursor()for i in target:jobaddress=i.find('em').stringjobname=i.find('h3').stringtime=i.find(name='span', attrs={"class": "format-time"}).stringsalary=i.find(name='span', attrs={"class": "money"}).stringexperience=i.find_all(name='div', attrs={"class": "li_b_l"})[0].get_text()companyname=i.find(name='div', attrs={"class": "company_name"}).a.stringcompanydetail=i.find(name='div',attrs={"class": "industry"}).string#有些职位没有标签 会报错 所以在这捕获一下异常try: flag = i.find_all(name='div', attrs={"class": "li_b_l"})[1].span.stringexcept(Exception):print("error: 没有标签")flag="没有标签"fuli=i.find(name='div',attrs={"class": "li_b_r"}).string'''print("地址:" + jobaddress)print("工作:" + jobname);print("时间:" + time);print("工资:" + salary);print("经验:" + experience);print("公司名称:" +companyname);print("公司介绍:" + companydetail);print("工作标签:" + flag);print("工作环境:" + fuli);print("地址:" +i.find('em').string)print("工作:"+i.find('h3').string);print("时间:" + i.find(name='span',attrs={"class":"format-time"}).string);print("工资:" + i.find(name='span',attrs={"class":"money"}).string);print("经验:" + i.find_all(name='div',attrs={"class":"li_b_l"})[0].get_text());print("公司名称:" + i.find(name='div',attrs={"class":"company_name"}).a.string);print("公司介绍:" + i.find(name='div',attrs={"class":"industry"}).string);print("工作标签:" + i.find_all(name='div',attrs={"class":"li_b_l"})[1].span.string);print("工作环境:" + i.find(name='div',attrs={"class":"li_b_r"}).string);'''sql="insert  into  lagou(jobname,jobaddress,time,salary,experience,companyname,companydetail,flag,fuli) values(" \" %s,%s,%s,%s,%s,%s,%s,%s,%s)"# 连接数据库cursor.execute(sql,(jobname,jobaddress,time,salary,experience,companyname,companydetail,flag,fuli))db.commit()#提交#print(i)db.close()def main():page = 1while page<=30:print('---------------------第',page,'页--------------------')time.sleep(15)lagou(page)page=page+1
#输入你想要爬取的职位名,如:python
if __name__ == '__main__':main()

结果展示

我爬取了 java python PHP 大概有1500条数据,读者可以自行调试 下面是我爬取的结果

python 爬取拉钩数据相关推荐

  1. 【2019.05】python 爬取拉钩数据(静态+动态)

    拉钩这个网站有点意思,页面加载有两种方法 点击首页的标签,页面是静态加载的 直接搜索,页是动态加载的 两种爬取方式不一样,这里都实现了. 动态爬取时会出现 '操作太频繁,请稍后再试'字样,出现这种情况 ...

  2. python 爬取拉钩网数据

    python 爬取拉钩网数据 完整代码下载:https://github.com/tanjunchen/SpiderProject/blob/master/lagou/LaGouSpider.py # ...

  3. python 爬取拉钩招聘数据

    上一篇介绍在linux 搭建jupter lab,本文将介绍python数据接口的爬取以及提取建模分析的数据 导入依赖的包 import requests import time from urlli ...

  4. python爬取拉钩python数据分析职位招聘信息

    python数据分析 python数据分析是目前python最火的方向之一,为了解目前市场对该职位的需求,我们爬取了拉钩上对pythons数据分析的招聘信息. 环境 系统:windows7 pytho ...

  5. Python 爬取拉勾招聘信息

    Python 爬取拉勾招聘信息 故事背景 最近有个好哥们啊浪迫于家里工资太低,准备从北方老家那边来深圳这边找工作,啊浪是学平面设计的知道我在深圳这边于是向我打听深圳这边平面设计薪资水平,当时我有点懵逼 ...

  6. Python应用实战-Python爬取4000+股票数据,并用plotly绘制了树状热力图(treemap)

    目录: 1. 准备工作 2. 开始绘图 2.1. 简单的例子 2.2. px.treemap常用参数介绍 2.3. color_continuous_scale参数介绍 2.4. 大A股市树状热力图来 ...

  7. python爬去朋友圈_利用Python爬取朋友圈数据,爬到你开始怀疑人生

    人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...

  8. 利用Python爬取国家水稻数据中心的品种数据

    利用Python爬取国家水稻数据中心的品种数据 一.页面获取 python可以进行对网页的访问,主要用到requests,beautifulsoup4包. 首先新建一个page的py文件,用来获取页面 ...

  9. 利用Python爬取朋友圈数据,爬到你开始怀疑人生

    人生最难的事是自我认知,用Python爬取朋友圈数据,让我们重新审视自己,审视我们周围的圈子. 文:朱元禄(@数据分析-jacky) 哲学的两大问题:1.我是谁?2.我们从哪里来? 本文 jacky试 ...

最新文章

  1. 利用计算机解决问题实际依赖,行测答题技巧:准确把握加强、削弱的“相关性”...
  2. python运行不了程序代码_python怎么运行代码程序
  3. Request_获取请求参数中文乱码问题处理
  4. 无限流量手机怎样改服务器,无限流量手机服务器
  5. Python绘制sigmoid函数及其导数图像
  6. android go解析json,Go 关于Json通用解析
  7. GUI中axes使用subplot时的清空及axes大小的固定的解决方法
  8. 第一:Python安装需要的第三方库时,命令行输入pip提示不是内部或外部命令
  9. oracle数据库的字符集更改
  10. BCGControlBar教程:可视化管理器
  11. Word批量转PDF/图片
  12. 数学之美:《社交网络》中Facemash算法分析
  13. 技术人员谈管理之帕累托法则(80/20法则)
  14. Vs2008在高DPI下显示模糊的解决办法
  15. matlab treeplot,matlab creats phylogenetic tree
  16. 高斯滤波及高斯卷积核C++实现
  17. 关于前端 后端 数据库 时间的设置与传递
  18. 二十万字带你入门C语言-史上最强C语言教程(汇总篇)
  19. 《CUDA高性能并行计算》----1.4 推荐项目
  20. Compose搭档 — Flow、Room

热门文章

  1. 三十七、缓存注解@Cacheable、@CacheEvict、@CachePut详解
  2. 网页Windows Media Player播放器参数含义(转)
  3. React父传子、子传父
  4. 查询出一班、二班的人数和平均分,并且按照由高到低排序
  5. warning: TCG doesn‘t support requested feature: CPUID.01H:ECX.vmx [bit 5]Could not initialize SDL
  6. iOS开发--AVFoundation进行视频合成, 导出结果旋转90度问题
  7. 华为 日志服务器 配置文件,华为设置日志服务器配置
  8. HTML怎么在背景中加视频,视频加背景图片 怎样把一个视频嵌入到一个图片中
  9. 最简单可靠的机房温度电话报警
  10. 豆瓣民谣排行100爬取练习