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