采用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-35kspan>
经验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"><img
src="//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-45kspan>
经验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"><img
src="//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>SOAspan> <span>系统架构span>
div>
<div class="li_b_r">“海外机会,获顶级投资,期权激励,带薪年假”div>
div>
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)#获取html
html_doc=resp.content.decode('utf-8')#进行编码
soup = BeautifulSoup(html_doc,'html.parser')#用BeautifulSoup解析html
target=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').string
jobname=i.find('h3').string
time=i.find(name='span', attrs={"class": "format-time"}).string
salary=i.find(name='span', attrs={"class": "money"}).string
experience=i.find_all(name='div', attrs={"class": "li_b_l"})[0].get_text()
companyname=i.find(name='div', attrs={"class": "company_name"}).a.string
companydetail=i.find(name='div',attrs={"class": "industry"}).string
try:
flag = i.find_all(name='div', attrs={"class": "li_b_l"})[1].span.string
except(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)#获取html
html_doc=resp.content.decode('utf-8')#进行编码
soup = BeautifulSoup(html_doc,'html.parser')#用BeautifulSoup解析html
target=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').string
jobname=i.find('h3').string
time=i.find(name='span', attrs={"class": "format-time"}).string
salary=i.find(name='span', attrs={"class": "money"}).string
experience=i.find_all(name='div', attrs={"class": "li_b_l"})[0].get_text()
companyname=i.find(name='div', attrs={"class": "company_name"}).a.string
companydetail=i.find(name='div',attrs={"class": "industry"}).string
#有些职位没有标签 会报错 所以在这捕获一下异常
try:
flag = i.find_all(name='div', attrs={"class": "li_b_l"})[1].span.string
except(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 = 1
while page<=30:
print('---------------------第',page,'页--------------------')
time.sleep(15)
lagou(page)
page=page+1
#输入你想要爬取的职位名,如:python
if __name__ == '__main__':
main()
我爬取了 java python PHP 大概有1500条数据,读者可以自行调试 下面是我爬取的结果