- 查看网站详细信息
首先进入网站
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 | 繁体中文 |