requests爬取拉钩网
首先还是老样子,打开拉勾网的网址,先进行一波分析
查看网页源代码搜索,第一个职位名称大数据开发工程师,发现不在源码里
这时我们就要利用开发者工具在找接口
找到接口发现数据都存在该接口里,且发现请求为post请求,请求所需要data也找到了,大概可以猜测pn就是这个职位的页数,所以我们的翻页操作就可以靠改变pn的值来实现,kd就是我们搜索的职位,我们可以通过改变它的值从而达到搜索其他职位信息的操作。
明确目标之后我们就可以来写代码了:
完整代码如下:
import requests
import json
#拉勾网的反爬需要验证cookie,所以我们通过Session来获取cookie,
#如果不加cookie的话会获取不到数据
def getCookie(starturl,headers):
s = requests.Session()
s.get(starturl, headers=headers)
cookie = s.cookies
return cookie
def List_get(list):
text = ''
for j in list:
text += j
return text
def wirte_data(i,text1,text2):
with open('D:\\files\\lagou.json', 'a', encoding='utf-8') as f:
stra = i['positionName'] + '·' + i['salary'] + '·' + i['city'] + '·' + i['companyFullName'] + '·' + i[
'workYear'] + '·' + i['education'] + '·' + i['industryField'] + '·' + i['companySize'] + '·' + i[
'financeStage'] + '·' + text1 + '·' + text2
#存json文件只需要把要存入的数据dump一下就好了
json.dump(stra,f,ensure_ascii=False)
f.write('\n')
def get_data(starturl,url,headers,k,title):
cookie = getCookie(starturl, headers)
data = {
'first': 'true',
'pn': str(k),
'kd': title,
'sid': '7da6249276fc4a718625d2d2d1b3b6f7'
}
if k%10==0:
cookie=getCookie(starturl,headers)
req = requests.post(url, data, headers=headers, cookies=cookie)
html = json.loads(req.text)
else:
req = requests.post(url, data, headers=headers, cookies=cookie)
html = json.loads(req.text)
return html
def main(title,page):
starturl = 'https://www.lagou.com/jobs/list_%E5%A4%A7%E6%95%B0%E6%8D%AE/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput='
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
headers = {
'accept': 'application/json, text/javascript, */*; q=0.01',
'referer': 'https://www.lagou.com/jobs/list_%E5%A4%A7%E6%95%B0%E6%8D%AE/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput=',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
}
for k in range(1,page+1):
html=get_data(starturl,url,headers,k,title)
for i in html['content']['positionResult']['result']:
txt1 = List_get(i['companyLabelList'])
txt2 = List_get(i['skillLables'])
wirte_data(i,txt1,txt2)
print('==' * 20, '第{}页已爬取完成'.format(k), '==' * 20)
if __name__ == '__main__':
while True:
title=input('请输入职位名称:')
page=int(input('请输入获取页数:'))
main(title,page)
注:本文章仅供参考学习