• 查看网站详细信息

首先进入网站

https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput=

注意其带有参数,并且翻页的时候网址并没有发生变化

此时就只能使用F12查看其请求的接口

发现在翻页的时候,其使用了post方式请求了如下网址

(post需要带参数data进行访问,data为一个字典,指定了提交的参数)

Python 拉勾网数据分析与展示 拉勾网址_json

 

该网址返回了职位,薪酬等信息

 查看其请求参数

Python 拉勾网数据分析与展示 拉勾网址_Python 拉勾网数据分析与展示_02

 

 first表示其不是第一页

pn表示page number,即页数

kd表示请求职位的关键字

  • 使用requests模块进行测试
def get_data():
    '''
    输入页数,返回一个网页的响应对象
    '''
    url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
    # 请求头
    headers = {
        "referer": "https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput=",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
    }
    data = {
        'first': 'false',
        'pn': '3',
        'kd': 'java'
    }

    res = requests.post(url=url, headers=headers, data=data)
    print(res.text)
    return res

其返回了如下

{"status":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"222.178.10.172","state":2402}

其可能需要在post的时候传入cookie参数,也就是动态cookie

  • 获取cookie

通过访问之前的网址可以获得一个返回对象

(虽然其text属性不可用,但是cookies属性可以使用)

通过response.cookies可以获得返回对象对应cookies

  • 使用动态cookiess进行爬取
re_1 = requests.get(url=url_1, headers=headers)
    re_2 = requests.post(url=url_2, headers=headers, data=data, cookies=re_1.cookies)
    print(re_2.text)

第一个请求是用于获得cookies

第二个请求使用第一个请求的cookies,这样在每次请求接口的时候都是用的访问主页时获得的cookies

  • 解析返回结果

直接爬取时获得数据是html文件

可以在浏览器和lxml模块中使用xpath定位到代码块

然后使用正则匹配所需要的内容

此时使用返回的结果是json文件

可以使用json美化在线工具(也可以直接使用vscode来查看)来进行匹配获得结构

然后使用json模块将其转换为字典进行匹配

results = json.loads(re_2.text)
  • 导出文件
for i in range(15):
        results.loc[i,'职位'] = data['content']['positionResult']['result'][i]['positionName']
        results.loc[i,'公司简称'] = data['content']['positionResult']['result'][i]['companyShortName']
        results.loc[i,'公司全称'] = data['content']['positionResult']['result'][i]['companyFullName']
        results.loc[i,'公司规模'] = data['content']['positionResult']['result'][i]['companySize']
        results.loc[i,'业务范围'] = data['content']['positionResult']['result'][i]['industryField']
        results.loc[i,'城市'] = data['content']['positionResult']['result'][i]['city']
        results.loc[i,'地区'] = data['content']['positionResult']['result'][i]['district']
        results.loc[i,'薪酬'] = data['content']['positionResult']['result'][i]['salary']
        results.loc[i,'创建时间'] = data['content']['positionResult']['result'][i]['createTime']

匹配字典,然后导出为dataframe即可

  • 编码错误的解决

在使用pandas保存文件时,encoding使用utf-8时出现了乱码,改用gbk编码

出现了编码错误

'gbk' codec can't encode character '\xae' in position 10: illegal multibyte sequence

常用的编码,出现问题可以逐个尝试

使用了gb18030编码问题得到了解决

编码名称

用途

utf8

所有语言

gbk

简体中文

gb2312

简体中文

gb18030

简体中文

big5

繁体中文

big5hkscs

繁体中文