爬虫小例--爬药监局(上)

”明月如霜,好风如水,清景无限 “

文远最近也算是爬虫入门吧,相信后面会慢慢熟悉。

直接上例子,爬取药监局的数据。目的是得到每家公司的详情数据,例:
具体网址
在这里插入图片描述
这是主页,下面详情信息:
在这里插入图片描述

分析,通过网页检查发现,主网页上没有公司相关数据,观察XHR中的Ajax请求发现,公司信息都是动态数据(方便更新),点击发现每个公司
的详情信息通过ID号这个参数区别,那么可以确定思路是先得到每个公司的ID号,然后在通过ID对应每一个详细网站,同样右键检查发现只有XHR中才有对应网页的内容,说明详情网页也是动态数据。

来看具体代码:

import requests
import json
​
all_data_list=[]
id_list=[]
url='http://scxk.nmpa.gov.cn: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/86.0.4240.193 Safari/537.36' 
}

此时,会出现一个换页问题,文远选择先绕过去不去寻找总页面,因为最后一页还需要调整参数:pageSize

page_len=50
for page in range(1,page_len):
    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'])

此时,出了一个问题,先跳过,将爬取详细界面讲完:

获取具体的页面信息

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

将得到的ID数据传入post请求,获取每个公司(ID)对应的详细信息。

持久化存储

with open('./all_yao_page_len'+str(page_len)+'.json','w',encoding='utf-8') as fp:
    json.dump(all_data_list,fp=fp,ensure_ascii=False)print("spider over----------------end---------------------")

最后保存一下。

有一个有意思的问题是:获取公司ID,当页面过大时,会报错。猜测是网站的反爬机制,等以后会了高级的反反爬策略再来扒拉它。如图:
在这里插入图片描述

解释一下代码中的url来源(动态加载数据),右键检查对应的XHR请求:
在这里插入图片描述
完整的原代码,可直接 阅读原文,记得码云Star。

END

作者:不爱夜跑的影迷不是好程序猿
喜欢的话请关注点赞👇 👇👇 👇
在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值