lixin2011
  • 查看网站详细信息

首先进入网站

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

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

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

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

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

 

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

 查看其请求参数

 

 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 繁体中文

分类:

技术点:

相关文章: