一、浏览器载荷面板相关
查询字符串参数
查询字符串参数就是URL后面的参数。例如在join.qq.com/api/v1/posi... 中,timestamp=1739447123303就是查询字符串参数。
表单数据
表单数据一般以data=字典的形式存在。
请求载荷
1.json形式:可以直接使用json=字典的方式传递数据。例如:
python
import requests
url = 'https://join.qq.com/api/v1/position/searchPosition?timestamp=1764229782263'
data = {
'bgList':[],
'keyword':'',
'pageIndex':1,
'pageSize':10,
'positionFidList':[],
'projectIdList':[],
'projectMappingIdList':[1,2,12,14,20],
'recruitCityList':[],
'workCityList':[],
'workCountryType':0
}
res = requests.post(url=url,json=data)
res_data = res.json()
print(res_data)
2.自定义字符串形式:
- 第一步:需要带上请求头content-type:application/json;charset=UTF-8。
- 第二步:使用data=字符串。例如:
python
import requests
url = 'https://join.qq.com/api/v1/position/searchPosition?timestamp=1764229782263'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36',
'content-type':'application/json;charset=UTF-8'
}
data = '{"bgList":[],"keyword":"","pageIndex":1,"pageSize":10,"positionFidList":[],"projectIdList":[],"projectMappingIdList":[1,2,12,14,20],"recruitCityList":[],"workCityList":[],"workCountryType":0}'
res = requests.post(url, data=data, headers=headers)
res_data = res.json()
print(res_data)
数据关联(多接口数据映射)
- **核心场景:**当接口返回数据为ID值,需关联另一接口的中文名称/描述时(如岗位数据中的部门ID→部门名称)。
- 实现步骤
1.获取字典数据
▶调用专门返回字典的请求(如腾讯校招的部门数据接口)保存到字典内,做一个部门id和部门名称的映射表。
python
import requests
# 针对页面上有部分信息是要在其他接口去查找的,我们可以看一下这两个接口之间是否有关联
# 工作类别接口
d_url = 'https://join.qq.com/api/v1/dictionary/?timestamp=1764232871152&types=RecruitType,BusinessGroup,RecruitProjectPostList'
headers = {
# 找到标头里面的请求标头 模拟浏览器的user-agent版本名 也可以用其他的用字典存起来
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36'
}
# 对这个工作类别接口发起请求
d_res = requests.get(d_url, headers=headers)
d_res_data = d_res.json()
# 定义一个空字典用来存放item_code和工作类别,因为item_code和工作岗位页面接口里的positionFamily是对应的,这样就可以把item_code和name用字典的键值对应关系存放起来
d_dict = {}
# 遍历d_res_data['data']['RecruitProjectPostList']这个列表
for d in d_res_data['data']['RecruitProjectPostList']:
item_code = d.get('itemCode', '') # 类别代码
name = d.get('name', '') # 类别名
# 用字典的内置方法setdefault添加键值对,如果有值则查询,没有则添加
d_dict.setdefault(item_code,name)
# print(item_code, name)
# print(d_dict)
获取部门数据时,可以通过得到岗位的所在部门id从部门字典中获取id对应的数据值
3.关联业务数据
▶在业务数据接口的响应中,通过ID从映射字典获取对应名称。
python
# 工作岗位信息接口
url = 'https://join.qq.com/api/v1/position/searchPosition?timestamp=1764232871535'
# 这是个post请求,请求参数在请求载荷里面用字典存放起来
data = {
'bgList': [],
'keyword': '',
'pageIndex': 1,
'pageSize': 10,
'positionFidList': [],
'projectIdList': [],
'projectMappingIdList': [1, 2, 12, 14, 20],
'recruitCityList': [],
'workCityList': [],
'workCountryType': 0
}
res = requests.post(url, json=data, headers=headers)
res_data = res.json()
for i in res_data['data']['positionList']:
positionTitle = i.get('positionTitle','')
projectName = i.get('projectName','')
bgs = i.get('bgs','')
workCities = i.get('workCities','')
# 获取positionFamily
positionFamily = i.get('positionFamily', '')
# 用f插值法将positionFamily放在字典d_dict,每遍历一次从字典里找出对应的类别名
name_ = d_dict[f'{positionFamily}']
print(positionTitle,projectName,bgs,workCities,name_)
二、Cookie相关
1.Cookie定义
Cookie是存储在浏览器中的一组键值对,用来保存当前用户的身份信息,并且具有时效性。
2.Cookie使用示例
例如在访问my.4399.com/account/log... 时,必须要先登录,才可以获取到当前页面数据:
- 通过爬虫模拟登录,但是网站登录都是先将用户输入的密码进行加密后传给服务端再保存到数据库中,比如实际输入的密码是123但是最终保存的密码数据为202cb962ac59075b964b07152d234b70,那存到数据库的也是这段加密的值,我们如果在爬虫中不分析加密的流程,不做模拟加密,直接把123作为密码传入,也会认证失败
- 通过复制登录后的cookie
python
#cookie是来自于请求头中一项存储在浏览器中的一组键值对用来保存当前用户的身份信息,并且具有时效性'''importrequests#浏览器登录成功才可以阅读的数据
#爬虫代码默认也是得不到的,需要带上用户的信息
headers={'cookie':'_gprp_c="";Puser=3073859018;Qnick=;Pnick=%E4%B8%AD%E9%87%8E%E5%B7%A7%E5%AE%89%E6%9B%BC%E5%A6%AE;zone_guide_date=1744646400;zone_guide_time=6;ptusertype=my.4399_login;home4399=yes;UM_distinctid=197b17d78ffaf5-0c7db87d5b371e8-26011e51-1fa400-197b17d79008f9;Hm_lvt_334aca66d28b3b338a76075366b2b9e8=1751029480;Hm_lpvt_334aca66d28b3b338a76075366b2b9e8=1751029480;HMACCOUNT=5A2DEB655BCA06BE;_4399tongji_vid=175102948734381;_4399tongji_st=1751029487;Hm_lvt_e5a07b5994f78634294b9c347a5be7d2=1751029487;Hm_lvt_5c9e5e1fa99c3821422bf61e662d4ea5=1751029487;_4399stats_vid=17510294875086511;USESSIONID=1837003a-e271-4eb5-b2fd-7fa170fe17fc;phlogact=l13902;Uauth=4399|1|2025627|my.|1751029508159|0524a19defc4b7cb097d666a867edea9;Pauth=4078826105|3073859018|t3ce7n2813a6aed76b05da9e7a5646e7|1751029508|10002|51ef3c108d9554ef75c7b1d4c329eba3|2;ck_accname=3073859018;Xauth=6a9cc60bc5863274cbc29c551c6b4dce;ol=1;Hm_lpvt_5c9e5e1fa99c3821422bf61e662d4ea5=1751030151;Hm_lpvt_e5a07b5994f78634294b9c347a5be7d2=1751030151;Pmtime=a6c0069aead7a7913da3%7C1751030211'}
url='https://my.4399.com/forums/index-getMtags?type=game&page=2'
res=requests.get(url,headers=headers)
#设置编码
res.encoding='utf-8'
print(res.text)
需要注意的是,Cookie不能跨不同网站携带,并且Cookie内的信息是网站自定义的。
三、代理相关
1.代理定义
代理类似于中介,在爬虫中,代理指的是代理服务器,其作用是转发请求和转发响应。 例如,如果客户端IP192.168.11.101被服务器拉黑,此时可以通过代理IP进行请求:192.168.11.101---》代理ip--》请求服务器,响应则是192.168.11.101《---代理ip《--请求服务器。
2.使用代理的原因
如果爬虫在短时间内向对方服务器发起高频率的请求,服务器可能会检测到异常请求,进而对请求对应的设备IP进行封禁(拉入黑名单),导致客户端设备无法再向服务器发起请求获取数据,甚至浏览器访问也会受到影响。此时使用代理可以避免自身真实IP被封禁。