首先访问这个页面 url = 'http://125.35.6.84:81/xk/'
我们的目标是抓取这里的每一个企业的详情页数据,但是可以发现这里只有企业的简介信息,所以这就意味着我们要发送两次get请求。
在写代码之前,我们可以大概看一下我们想要的数据大概在什么位置。
1. 我们打开一个公司的详情页
2. 右击检查,通过Response查找对应的目标数据
从这里我们可以看出,当前的数据是通过ajax请求动态加载出来的
3.查看头信息,以及参数信息
我们可以看出,当前的请求是post请求,所需要的参数是id,但是从以上的数据来看我们并没有发现哪里有id这个参数。因为我们将目光聚焦到首页。
4. 分析首页所返回的数据
同样是右击检查,打开抓包工具
从这里我们可以看出首页的数据也是通过ajax动态加载出来的,并且通过观察我们可以发现在ID的踪迹,至此我们就可以形成一条完整的思路。
5.我们可以看看首页的请求方式,与是否携带了参数
6. 思路:拿到首页的响应数据的ID,并以此为参数向详情页发送post请求,拿到每个详情页的详情数据。
7.代码实现:
import requests import json if __name__ == '__main__': # 获取各个企业id id_list = [] # 这里的url并非是首页的url 首页中的所有企业信息都是通过ajax动态请求的 因此应查看对应包中的url url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList' header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36' } # 获取前五页的数据 for page in range(1, 5): page = str(page) # 首页请求所需参数 data = { 'on': 'true', 'page': page, 'pageSize': '15', 'productName': '', 'conditionType': '1', 'applyname': '', 'applysn': '' } # 向首页发送请求 response = requests.post(url=url, data=data, headers=header) # 拿到json格式的数据 info = response.json() # 拿到所有企业信息的列表 target_id = info['list'] for i in target_id: # 获取所有企业的id id_list.append(i['ID']) # 获取企业详情信息 ret_list = [] url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' # 获取所有企业的详情数据 for i in id_list: data = { 'id': i } ret = requests.post(url=url, data=data, headers=header) ret_list.append(ret.json()) # 持久化存储 fileName = 'files/药监总局.json' with open(fileName, 'w', encoding='utf-8') as f: f.write(json.dumps(ret_list, ensure_ascii=False)) print('work is done')