前言:
应对AJAX动态加载,并应用表单的交互技术,爬取爬取拉勾网招聘信息,解析网页返回的json数据,并将爬取的数据存储于MongoDB数据库中。
本文为整理代码,梳理思路,验证代码有效性——2020.2.2
环境:
Python3(Anaconda3)
PyCharm
Chrome浏览器
主要模块: 后跟括号内的为在cmd窗口安装的指令
requests(pip install requests)
pymongo(pip install pymongo )
json
time
1.
爬取目标url:https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=
看看python的相关职位。
2.
在源代码中查看相关的信息,我们可以发现在网页源代码中没有找到任何岗位的信息,由此可以推断,该网页是异步加载(AJAX)的。
3.
打开开发者工具F12,选择Network选项,并点击XHR文件,刷新一下网页,依次查看各个文件返回的内容。
我们发现在第一个文件在中就返回了我们需要的信息,而且是json格式。
4.
解析json格式。由于该json格式比较复杂,所以我们先点击到Preview查看,如图。
那么在content —》positionResult- --》result 路径中,我们用python中的json库对其解析。
注意:这里得到的 results 是多组信息,后用循环对它进行分组拆分,详见完整代码。
html = requests.post(url, data=params, headers=headers, cookies=get_cookie(), timeout=5)
# 将网页的Html文件加载为json文件
json_data = json.loads(html.text)
# 解析json文件,后跟中括号为解析的路径
results = json_data['content']['positionResult']['result']
5.
到上一步,我们就已经获取到了信息了,但是不满足于此,我们还要爬取更多页的信息,手动翻页,发现url没有变化,可判断翻页也是异步加载,同上,我们还是进行逆向工程,去XHR文件中找线索。
发现它是一个POST请求,页数是由pn参数控制。
6.
发现返回的json数据中含有信息的总数,如图。
拉勾网每页有15条岗位信息,并默认只有30页,那么我们将返回的信息总数除以15看是否小于30,若小于,总页数取对应结果,不然总页数就等于30,代码如下。
# 定义获取页数的函数
def get_page(url, params):
html = requests.post(url, data=params, headers=headers, cookies=get_cookie(), timeout=5)
# 将网页的Html文件加载为json文件
json_data = json.loads(html.text)
# 解析json文件,后跟中括号为解析的路径
total_Count = json_data['content'][