笔者之前在慕课学习Python网络爬虫与信息提取时,老师并未讲解如何爬取网页的动态加载数据,之后通过观看其他教学视频学会了如何爬取网页动态数据,下面用一个实例来记录一下爬取动态网页的步骤。

实例:爬取药监总局中的企业详情数据

url:http://125.35.6.84:81/xk/

需求:

  • 将首页中每一家企业的详情数据进行爬取。

  • 总共爬取前5页企业的数据。

首页:
在这里插入图片描述
详情页:
在这里插入图片描述

分析:

首先我们在详情页点击右键检查打开开发者工具,在全局搜索框内输入企业名称进行搜索,如下图所示:
在这里插入图片描述
此时已经成功定位到动态加载数据对应的数据包,点击Headers,查看请求携带的参数,发现需要一个名为ID的参数:
在这里插入图片描述
复制这个id的值,回到首页打开开发者工具,在全局搜索框内输入id值,就可以定位到包含id信息的动态加载数据包:
在这里插入图片描述
在Headers里提取出请求的url、请求方式和请求携带的参数:
在这里插入图片描述
在这里插入图片描述
编写代码利用Request库,获得该url的响应数据:

import requests

url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList"
headers = {
    'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
data = {
    'on': 'true',
    'page': '1', # 该参数指定爬取第几页,这里先爬取第一页
    'pageSize': '15',
    'productName': '',
    'conditionType': '1',
    'applyname': '',
    'applysn': ''
}
response = requests.post(url=url, headers=headers, data=data)
page_text = response.json()

用JSON解析器解析Response信息:
在这里插入图片描述
可以看到id信息被存储在list关键字下的ID关键字内,利用for循环获取所有的ID值,接着查看详情页的动态数据包的请求url和请求方式:
在这里插入图片描述
结合之前获取的id信息就可以获得该url的响应数据:

for dic in page_text['list']:
    ID = dic['ID']
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
    data = {'id': ID}
    response = requests.post(url=url, headers=headers, data=data)
    dict = response.json()

最后用JSON解析器解析Reponse信息,将需要的信息提取出来打印即可。

完整程序代码:

import requests

headers = {
    'User_Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
for i in range(1, 6): # 为了提取前5页的企业信息,需要添加一个for循环
    url = "http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList"
    data = {
        'on': 'true',
        'page': str(i),
        'pageSize': '15',
        'productName': '',
        'conditionType': '1',
        'applyname': '',
        'applysn': ''
    }
    response = requests.post(url=url, headers=headers, data=data)
    page_text = response.json()
    for dic in page_text['list']:
        ID = dic['ID']
        url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
        data = {'id': ID}
        response = requests.post(url=url, headers=headers, data=data)
        dict = response.json()
        name = dict['epsName']
        product = dict['productSn']
        address = dict['epsAddress']
        proAddr = dict['epsProductAddress']
        print(name, product, address, proAddr)

这里只提取了详情页的企业名称、许可证编号、企业住所和生产地址,可以根据需要提取更多的信息。

程序运行结果:

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐