思路
1、页面分析
页面地址:https://app.mokahr.com/campus_apply/bilibili01/6205#/
抓包后发现,页面的预览一片空白,凭我的经验,这个页面应该是通过JavaScript渲染的
那我们想要的数据在哪里呢?
先看看页面源代码再说
哦,找到了
<input id="init-data" type="hidden" value="我们想要的数据">
那就好说了,直接用正则表达式提取就行了
通过正则表达式,我们可以提取到每个职位的zhinengId
再次进行抓包分析,发现返回的是一个JSON格式的数据
我们通过遍历每个职能id号下面的所有页码,就可以获取到数据了
for i in range(total_page):
position_url = base_position_url % (i, p_id)
result = requests.get(url=position_url, headers=headers)
data = json.loads(result.text)
jobs = data['jobs']
for job in jobs:
print(job)
2、数据提取
这里我使用了正则表达式来提取页面中的数据
result_list = re.findall(r'<input id="init-data" type="hidden" value="(.*?)">', html, re.DOTALL)
result_str = ''.join(result_list).replace('"', '').replace('\\', '')
position_str = ''.join(re.findall(r'jobsGroupedByZhineng:\[(.*?)\]', result_str, re.DOTALL))
position_list = re.findall(r'{id:(.*?),label:(.*?),jobCount:(\d+)}', position_str, re.DOTALL)
3、数据保存
偷个懒,数据就直接保存到MongoDB数据库中了
代码
import requests
import re
import json
import math
from pymongo import MongoClient
url = 'https://app.mokahr.com/campus_apply/bilibili01/6205'
base_position_url = 'https://app.mokahr.com/api/apply/jobs?limit=15&offset=%d&&zhinengId=%s&siteId=6205&orgId' \
'=bilibili&site=campus '
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/86.0.4240.198 Safari/537.36 Edg/86.0.622.69 '
}
connect = MongoClient('localhost')
db = connect['bilibili']
r = requests.get(url=url, headers=headers)
html = r.text
# 利用正则表达式来提取网页中的数据
result_list = re.findall(r'<input id="init-data" type="hidden" value="(.*?)">', html, re.DOTALL)
result_str = ''.join(result_list).replace('"', '').replace('\\', '')
position_str = ''.join(re.findall(r'jobsGroupedByZhineng:\[(.*?)\]', result_str, re.DOTALL))
position_list = re.findall(r'{id:(.*?),label:(.*?),jobCount:(\d+)}', position_str, re.DOTALL)
for position in position_list:
p_id, p_label, jobCount = position
position_url = base_position_url % (0, p_id)
response = requests.get(url=position_url, headers=headers)
data = json.loads(response.text)
# 计算总页数
total = data['jobStats']['total']
limit = 15
total_page = math.ceil(total / limit)
# 遍历每个页面
for i in range(total_page):
position_url = base_position_url % (i, p_id)
result = requests.get(url=position_url, headers=headers)
data = json.loads(result.text)
jobs = data['jobs']
for job in jobs:
print(job)
# 保存数据到数据库
db.campus_apply.insert_one(job)
结果