python 爬取拉钩数据

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-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条数据,读者可以自行调试 下面是我爬取的结果

python 爬取拉钩数据_第1张图片

你可能感兴趣的:(python爬虫)