本次案例涉及到requests的使用比较全面!!!
首先我们打开网址:
化妆品许可证
图1:
图2:
这里我们要爬取的信息就是上图中的许可证信息。
这里我们分析一下,如果我们要获取到图2中的信息,首先我们要得到它的url,它的url也只能通过图1中的数据获得。
步入正题:
我们使用抓包工具看一下数据到底是怎么传输的:
这里我们找到了这个请求,我么发现在它的返回response中并没有有关企业的信息。所以我们可以判断它可能是通过Ajax请求数据。
我们在往下看其他请求,我们发现在这个请求中我们找到了有关企业的一部分信息:
这里我们看一下许可证信息的url:
不难发现它的url中就包含ID,我们再看看其他的几个许可证:
我们发现他们的url中只有id不同其他的都是一样的,所以我们需要获取到它们的id参数。
所以我们来看一下这个请求的请求头:
我们可以得到它的url以及数据类型是json。
接下来我们看一下它传递的参数:
这几个参数也比较好理解。我们能用到的也就是:page(页码)pageSize(每页显示个数)
代码段1:
import requests
import json
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
#批量获取不同企业的id值
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
}
id_list=[] #存储企业id
#参数封装
for page in range(1,20):
page = str(page)
data = {
'on': 'true',
'page': page,
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn':'',
}
json_ids = requests.post(url=url,headers=headers,data=data).json()
for dic in json_ids['list']:
id_list.append(dic['ID'])
print(id_list)
注:这里我们只需要id参数,所以我们要对爬取的json数据进行处理,提取处理id参数。
获取到id后我们分析一下许可证信息页面,这里有个问题许可证信息页面是否也是Ajax传输的数据呢?我们还是抓下包看一下:
这里我们发现它的response中也没有关于信息的数据,所以它也是动态传输数据。我们再往下看请求。
我们在 ‘portalAction.do?method=getXkzsById’ 这个请求中发现了有关信息的数据。
我们看下请求头:
我们可以得到url,返回数据和传递的参数。
这里我们观察多个页面的url,发现url中也只有id有区别。所以这里仍要用到我们之前爬取的id。
返回值类型也是json类型,传递的参数也只有id。
到这里页面就分析完了,下面就是完整代码:
完整代码:
import requests
import json
url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
#批量获取不同企业的id值
headers = {
'User-Agent': 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
}
id_list=[] #存储企业id
#参数封装
for page in range(1,20):
page = str(page)
data = {
'on': 'true',
'page': page,
'pageSize': '15',
'productName': '',
'conditionType': '1',
'applyname': '',
'applysn':'',
}
json_ids = requests.post(url=url,headers=headers,data=data).json()
for dic in json_ids['list']:
id_list.append(dic['ID'])
print(id_list)
#获取企业详情数据
post_url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
data = {
'ID':id,
}
final_data = requests.post(url=url,headers=headers,data=data).json()
print(final_data)
#持久化存储
fp = open('./huazhuangpin.json', 'w', encoding='utf-8')
json.dump(final_data, fp=fp, ensure_ascii=False)
这样就能爬取到产品许可证的详细信息啦。