Python动态爬取网页信息

目录

 

背景

解析

什么是动态加载

动态加载数据获取

动态数据解析

实战

总结


背景

在日常的爬虫练习时有些网站的数据信息是静态的,也就是说我们通过浏览器窗口中的“检查源代码”窗口就可以获取到(图1-1)。

但是也有相当一部分网站通过上述方法是获取不到的,如图1-2所示,打开该链接http://scxk.nmpa.gov.cn:81/xk/,该网页的的源代码中并没有我需要的数据信息“广东妮色生物科技有限公司(图1-3)”内容,

                                                                    图1-2网页源代码

                                                                     图1-3 网页信息

此时再进一步进行分析,我们使用谷歌开发者工具去进行一个抓包,通过分析可知我们需要的数据并不在http://scxk.nmpa.gov.cn:81/xk/这个链接中,而是在http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList这个url返回的请求数据中,那这个数据就不是静态数据,而是动态加载的数据。

                                                                    图1-4动态加载数据

解析

什么是动态加载

当我们通过requests模块进行数据爬取无法每次都是可见即可得,有些数据是通过非浏览器地址栏中得url请求到的地址。而是其他请求请求到的数据,那么这些通过其他请求请求到的数据就是动态加载的数据,那这些数据基本就是动态加载数据。

动态加载数据获取

1、打开浏览器开发工具,选择NetWork-All,然后鼠标点击该浏览器窗口,按下快捷键Ctrl+F进入全局搜索,输入搜索数据匹配后获取到url和response进行确认等进一步分析。

2、还有一种方法是打开浏览器开发工具,选择NetWork-XHR,确定是否是动态页面(如果随着下拉页面、翻页,项目不断增加就说明是动态页面)。

动态数据解析

确定数据是动态加载之后,我们需要拿到对应的url请求方式请求参数来构造请求

data = {
    'on': 'true',
    'page': '1',
    'pageSize': '15',
    'productName':'' ,
    'conditionType': '1',
    'applyname':'',
    'applysn':''
    }
    url= 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'  #总的uil链接地址
    list_name = []
    #获取response响应数据
    response = requests.post(url,data=data,headers = headers).json()

实战

以上我们便把一个动态加载的主要项就分析完了,下面通过代码来具体演示一下(获取每一个企业的详情数据信息):

'''
爬取国家药监局的化妆品生产许可证信息
http://scxk.nmpa.gov.cn:81/xk/

'''

import requests
import time

#请求头
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
    }

#获取ID号并构造新的url请求
def get_id(url):
    data = {
    'on': 'true',
    'page': '1',
    'pageSize': '15',
    'productName':'' ,
    'conditionType': '1',
    'applyname':'',
    'applysn':''
    }
    list_name = []
    #获取response响应数据
    response = requests.post(url,data=data,headers = headers).json()
    data1 = response['list']      #获取企业信息和ID号
    #print(data1)
    for i in data1:
        id = i['ID']
        list_name.append(id)
        #print(id)
    return list_name

#获取企业具体信息
def get_detail_info(id):
    url = 'XXXXXXX'  #请求详情的url链接,url相同,传参不同。
    data_detail= {
    'id': id
    }
    response_detail= requests.post(url,data = data_detail,headers = headers).json()
    #print(response_detail)

    epsName = response_detail['epsName']  #企业名称
    productSn = response_detail['productSn'] #许可证编号
    certStr = response_detail['certStr'] #许可项目
    qfManagerName = response_detail['qfManagerName'] #发证机关
    print('********开始爬取信息********')
    print('企业名称:%s'%epsName)
    print('许可证编号:%s'%productSn)
    print('许可项目:%s'%certStr)
    print('发证机关:%s'%qfManagerName)
    print('********结束爬取信息********\n')

if __name__ == '__main__':
    url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
    t = get_id(url)
    for i in t:
        time.sleep(3)
        get_detail_info(i)
    print('全部信息爬取结束')

总结

下面就是获取到的企业信息具体的一些数据,这里我只爬取了补一部分信息,有兴趣的同学可以自己按着思路去爬取全部信息,也可以把爬取到的数据保存到数据库等。

ps:最后再和大家做一下简单总结:

1、判断数据是否是动态加载,通过全局搜索或者翻页查看XHR中url是否新增。

2、获取动态加载的url、请求方式和数据

3、使用request构造请求拿到response数据。

代码中的url地址未给出,有需要的小伙伴可以私信获取,同时也请大家指出文章的不足(包括但不限于技术性、文章规范性、布局等)。

猜你喜欢

转载自blog.csdn.net/sl01224318/article/details/117880194