”明月如霜,好风如水,清景无限 “
文远最近也算是爬虫入门吧,相信后面会慢慢熟悉。
壹
直接上例子,爬取药监局的数据。目的是得到每家公司的详情数据,例:
具体网址
这是主页,下面详情信息:
贰
分析,通过网页检查发现,主网页上没有公司相关数据,观察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
作者:不爱夜跑的影迷不是好程序猿
喜欢的话请关注点赞👇 👇👇 👇