爬虫实例3 批量抓取数据之异步请求(ajax)

147 阅读2分钟

上代码

import requests
import json
#请求地址
url="http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList"
#浏览器伪装
headers={
     "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36"
}
id_list=[]#存储企业id
all_data_list=[]#存储所有的企业详情数据
for page in range(1,10):#请求10页数据,可以请求360页
    page=str(page)
    data={#所有请求数据,在f12开发者工具中network-HXR-header
        "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://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
for id in id_list:
    data={
        "id":id
    }
    datail_json=requests.post(url=post_url,headers=headers,data=data).json()
    all_data_list.append(datail_json)
#持久化存储
fp=open("./化妆品公司数据.json","w",encoding="utf-8")
json.dump(all_data_list,fp=fp,ensure_ascii=False,indent=True)
print("数据抓取完成!")

第一:浏览器请求地址
scxk.nmpa.gov.cn:81/xk/itownet/…

网站页面:

爬取数据均属于公开数据,不存在违法行为!
爬取数据均属于公开数据,不存在违法行为!
直接在首页打开f12,network,HXR,header
在这里插入图片描述
浏览器伪装部分:
在这里插入图片描述


data={#所有请求数据,在f12开发者工具中network-HXR-header
        "on":"true",
        "page":page,
        "pageSize":"15",
        "productName":"",
        "conditionType":"1",
        "applyname":"",
        "applysn":"",
    }

异步请求的原理
浏览器把请求交给代理对象—XMLHttpRequest(绝大多数浏览器都内置了这个对象),由代理对象向服务器发起请求,接收、解析服务器响应的数据,并把数据更新到浏览器指定的控件上。从而实现了页面数据的局部刷新。

看这里每个企业的详情数据

在这里插入图片描述
我们再来对比每个企业的源代码中的请求数据到底哪里不一样
例如这里的第一个企业和第二个企业
第一个:
在这里插入图片描述第二个:在这里插入图片描述
看到了吗,每个企业都有一个专属id,我们要请求到每个企业的详情数据就必须拿到每个企业的专属id

post_url="http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById"
for id in id_list:
    data={
        "id":id
    }
    datail_json=requests.post(url=post_url,headers=headers,data=data).json()
    all_data_list.append(datail_json)

这里的url地址就是详情页里的url地址
在这里插入图片描述
最后我们在对抓取的数据进行持久化储存

fp=open("./化妆品公司数据.json","w",encoding="utf-8")
json.dump(all_data_list,fp=fp,ensure_ascii=False,indent=True)
print("数据抓取完成!")

新手博主,请前辈批评指正———@丁一