爬虫第五课:动态数据-拉勾网

拉勾网动态数据爬取
网页的数据类型有两种,一种是动态数据,一种是静态数据。猫眼电影的数据就是静态数据,因为网页中所有的信息可以在它的源代码页中找到,像58同城,boss直聘里的数据都是静态生成的,可以很容易的爬取出来。但有些网站的数据是动态数据,动态数据就是你打开你需要数据所在页面的时候,在源代码中找不到你要的数据。这就说明数据是动态生成的,需要从其他途径来找到数据。
拉钩网是一个有关招聘信息的网站,这个网站里有静态数据,也有动态数据。你在搜索框里搜索出来的数据就是动态数据,而通过点击它已有的职位列表上的数据,那样出来的数据是静态数据。
下面出来的是静态数据
在这里插入图片描述
下图出来的是动态数据
在这里插入图片描述

爬取静态数都一样,只要用正则化就可以吧数据提取出来。爬取动态数据就得换另一种方法。
首先从发送请求开始
首先需要的url并不是你在浏览器上输入网址的那个地方看到的url。而是在检查页总的network中找到。以搜索职位爬虫为例。爬取爬虫职位的名称,工资,城市。
在这里插入图片描述
然后查看源代码:
在这里插入图片描述

在源代码中没有看到我们需要的数据。而且尝试点击下一页,发现浏览器上方的url并没有变化。说明这些数据是动态数据。
动态数据怎么办呢?
打开检查页的network,选中XHR。然后刷新,点开每一个出来的链接,然后在preview中看一看,看看是否能找到你需要的信息。

图5

在这里插入图片描述
功夫不负有心人,仔细找就能找到。

图7
点开就可以看到每一个职位的基本信息了。
这一步只是帮我们找到了我们需要的信息,下一步就是如何请求到这些数据。
在preview按钮旁边有一个headers按钮。Headers按钮里面的内容就是我们请求数据时需要用到的,只需要里面的一部分内容。

图8

图9
画红线的内容就是我们需要的内容
图中Request url就是我们需要发送请求的url,图9中的信息是构造头部信息时需要的参数。代码如下图所示

图10
爬取静态数据只要在headers里放一个user-agent就可以了,爬动态数据的时候,不仅需要放需要user-agent,还需要加上host,referer,x-requested-with。因为向服务器请求动态数据比请求静态数据需要的安全性要高,所以需要多加几个参数,使包装的更像一点。
下面就是要定义一个发送请求的函数了:

url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'

headers={
        'Host': 'www.lagou.com',
        'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
        }

#data参数在network/XHR中找到包含数据的网页,然后在该网页headers的最下面可以找到data参数。
#每一页url不变,但data里面的参数会变,是用来控制搜索关键字和页数的。
def get_page(url,i):
    data={
            'first':'false',
            'kd':'数据挖掘',  #搜索关键词  改关键字的时候,headers里面的referer也要改。
            'pn':i     #第几页         
            }
    try:
        response=requests.post(url,data=data,headers=headers)
        response.raise_for_status()
        response.encoding=response.apparent_encoding
        return response.json()  #注意这里写的是json(),而不是text
    except requests.ConnectionError as e:
        print('Error:',e.args)

代码中的data字典也是在检查页network的headers里面找到的,这个是控制爬取的的关键字和网页的第几页的。

图12
上图显示的是,这时我们搜索的关键字是‘爬虫’,当前页是第一页,当我们在网页中点击下一页的时候,在检查页的左侧找到新弹出来的网页,并打开。

图13
这就是第二页的内容,所以我们可以根据这个参数向服务器发送请求,请求所搜索每个个页面的内容。
若我们不搜索‘’爬虫‘’这个关键字,我们搜索‘机器学习’

图14
看到变化了吧。

  • 提取数据

图15
数据是字典格式的,所以只需要懂python基本的切片语法就可以提取。我们第一步请求到的数据是一个大的字典,我们所要的数据在字典中的content中的positionresult中的result里。Result中一共十五个职位的信息,然后写for循环遍历每一个职业,并提取。
在这里插入图片描述

def get_info(json):
    json=json['content']['positionResult']['result']
    for item in json:
        data={}
        data['companyFullName']=item['companyFullName']
        data['city']=item['city']
        data['district']=item['district']
        data['education']=item['education']
        data['financeStage']=item['financeStage']
        data['industryField']=item['industryField']
        data['companySize']=item['companySize']
        data['positionName']=item['positionName']
        data['salary']=item['salary']
        data['workYear']=item['workYear']       
        yield data 

  • 最后一步:写主程序代码,运行所有函数,并保存数据
DATA=[]     
for i in range(1,3):        
    json=get_page(url,i)
    print(json)
    print('请求:'+str(i) + url)
    time.sleep(2)
    datas=get_info(json) 
    for data in datas:
        DATA.append(data)

保存数据:

f=xlwt.Workbook(encoding='utf-8')
sheet01=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet01.write(0,0,'companyFullName') #第一行第一列
sheet01.write(0,1,'city')
sheet01.write(0,2,'district')
sheet01.write(0,3,'education')
sheet01.write(0,4,'financeStage')  
sheet01.write(0,5,'positionName') 
sheet01.write(0,6,'salary') 
sheet01.write(0,7,'workYear') 
sheet01.write(0,8,'companySize')
sheet01.write(0,9,'industryField')

#写内容
for i in range(len(DATA)):
    sheet01.write(i+1,0,DATA[i]['companyFullName'])
    sheet01.write(i+1,1,DATA[i]['city'])
    sheet01.write(i+1,2,DATA[i]['district'])
    sheet01.write(i+1,3,DATA[i]['education'])
    sheet01.write(i+1,4,DATA[i]['financeStage'])
    sheet01.write(i+1,5,DATA[i]['positionName'])
    sheet01.write(i+1,6,DATA[i]['salary'])
    sheet01.write(i+1,7,DATA[i]['workYear'])
    sheet01.write(i+1,8,DATA[i]['companySize'])
    sheet01.write(i+1,9,DATA[i]['industryField'])
    print('p',end='')        
f.save(u'E:\\爬虫.xls')       

保存结果:
在这里插入图片描述

  • 总代码
import requests
import time
import xlwt

url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'

headers={
        'Host': 'www.lagou.com',
        'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
        }

#data参数在network/XHR中找到包含数据的网页,然后在该网页headers的最下面可以找到data参数。
#每一页url不变,但data里面的参数会变,是用来控制搜索关键字和页数的。
def get_page(url,i):
    data={
            'first':'false',
            'kd':'数据挖掘',  #搜索关键词  改关键字的时候,headers里面的referer也要改。
            'pn':i     #第几页         
            }
    try:
        response=requests.post(url,data=data,headers=headers)
        response.raise_for_status()
        response.encoding=response.apparent_encoding
        return response.json()
    except requests.ConnectionError as e:
        print('Error:',e.args)
        
def get_info(json):
    json=json['content']['positionResult']['result']
    for item in json:
        data={}
        data['companyFullName']=item['companyFullName']
        data['city']=item['city']
        data['district']=item['district']
        data['education']=item['education']
        data['financeStage']=item['financeStage']
        data['industryField']=item['industryField']
        data['companySize']=item['companySize']
        data['positionName']=item['positionName']
        data['salary']=item['salary']
        data['workYear']=item['workYear']       
        yield data 

DATA=[]     
for i in range(1,3):        
    json=get_page(url,i)
    print(json)
    print('请求:'+str(i) + url)
    time.sleep(2)
    datas=get_info(json) #如果这一步出了问题,那么可能就是因为上一步就出了问题。
    for data in datas:
        DATA.append(data)

      
f=xlwt.Workbook(encoding='utf-8')
sheet01=f.add_sheet(u'sheet1',cell_overwrite_ok=True)
sheet01.write(0,0,'companyFullName') #第一行第一列
sheet01.write(0,1,'city')
sheet01.write(0,2,'district')
sheet01.write(0,3,'education')
sheet01.write(0,4,'financeStage')  
sheet01.write(0,5,'positionName') 
sheet01.write(0,6,'salary') 
sheet01.write(0,7,'workYear') 
sheet01.write(0,8,'companySize')
sheet01.write(0,9,'industryField')

#写内容
for i in range(len(DATA)):
    sheet01.write(i+1,0,DATA[i]['companyFullName'])
    sheet01.write(i+1,1,DATA[i]['city'])
    sheet01.write(i+1,2,DATA[i]['district'])
    sheet01.write(i+1,3,DATA[i]['education'])
    sheet01.write(i+1,4,DATA[i]['financeStage'])
    sheet01.write(i+1,5,DATA[i]['positionName'])
    sheet01.write(i+1,6,DATA[i]['salary'])
    sheet01.write(i+1,7,DATA[i]['workYear'])
    sheet01.write(i+1,8,DATA[i]['companySize'])
    sheet01.write(i+1,9,DATA[i]['industryField'])
    print('p',end='')        
f.save(u'E:\\爬虫.xls')       
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值