爬取的网址为
https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=
使用pycharm+anaconda
使用到的库:requests+time+json+pandas
网页分析:
当我们进入拉勾网,输入python搜索,查看源码时,发现居然没有这些职位的信息,而且翻页的时候发现网址也没有变化,这个时候就可以怀疑拉勾网使用的了Ajax技术。Ajax也叫做异步的JavaScript和XML,这不是一门语言,而是利用JavaScript在保证页面不被刷新,页面链接不改变的情况下与服务器交换数据,并更新部分网页的技术。比如我们刷微博的时候,不断往下翻可以看到内容在不断的更新,但是网址链接没有变化,这就是使用了Ajax技术。
打开网页的检查功能,点进Network,类型选择XHR,发现了一个positionAjax对象,打开它然后进入它的Response,可以发现我们要提取的职位信息就在这里面。而且翻页的时候,会多出一个positionAjax对象,将其进行对比,发现在headers的Form Data中,pn会变化,第一页时pn = 1,第二页时,pn = 2,以此类推。
为了让response中的信息更加的明显,可以打开https://www.json.cn/,将内容复制进去。发现我们要提取的信息在content\positionResult\result中。
爬取思路:
首先,访问拉勾网的首页,然后再从中寻找到Ajax的位置,将其解析成json类型,直接用索引的方式进行信息提取。这里,我构造一个for循环,通过Form Data的数据,提取了前10页的内容。
编写代码:
需要注意点是
1、这里的positionAjax对象中的访问方式为POST方式,所以requests请求时要使用POST请求;
2、使用了会话维持的函数,保证访问连续;
3、一开始我并没有使用cookie参数,但是访问没两次就报错,然后搜了一下,看到有人说刷新几次cookie里面的内容会发生改变。所以在访问Ajax前,先提取网址的cookie参数,这样就不会报错了。
import requests
import time
import json
import pandas as pd
def parse_page():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3',
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'Accept': 'application/json, text/javascript, */*; q=0.01'
}
url_start = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
url_parse = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
for x in range(1, 10):
data = {
' first': 'true',
'pn': str(x),
'kd': 'python'
}
s = requests.Session() #会话维持
s.get(url_start, headers=headers, timeout=3)
cookie = s.cookies
res = requests.post(url_parse, headers=headers, cookies=cookie, data=data, timeout=3)
time.sleep(5)
res.encoding = res.apparent_encoding #apparent_endoding可以根据网页内容分析出编码方式,比encoding更加准确
result = json.loads(res.text)
info = result["content"]["positionResult"]["result"]
for i in info:
companyId_list.append(i['companyId'])
postname_list.append(i['positionName'])
workyear_list.append(i['workYear'])
companysize_list.append(i['companySize'])
city_list.append(i['city'])
salary_lsit.append(i['salary'])
end_res = pd.DataFrame({
"公司代号": companyId_list,
"职位名称": postname_list,
"工作年限": workyear_list,
"公司规模": companysize_list,
"城市": city_list,
"薪水": salary_lsit
})
end_res.to_csv("lagou10.csv")
if __name__ == '__main__':
companyId_list = []
postname_list = []
workyear_list = []
companysize_list = []
city_list = []
salary_lsit = []
parse_page()
最后,直接用索引的方式提取出一些信息,保存为scv文件。用excel打开csv如果出现乱码,就按照我上一篇文章方法去做,最后得到的结果如下:
总结一下:本次爬取主要是学习了对使用Ajax技术的网址进行爬取,但看了一些资料说很多网站使用的Ajax很复杂,需要学习使用selenium进行爬取,这也是我后面学习的重点。