一、爬虫的理解与分类
1、爬虫:通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程
2、爬虫分类:
- 通用爬虫(抓取系统中重要组成部分,抓取的是一整张页面数据)
- 聚焦爬虫(抓取页面中特定的局部内容)
- 增量式爬虫(只抓取网站中更新的数据)
3、爬虫的基本步骤
前期须知:
----用到requests库模拟浏览器请求,需install--requests
----存储用到文件操作,需install--os
----如需爬取json类型数据,需install--json
步骤分析:想要爬取别人的数据,首先要知道目的地,也就是url,其次不能被人发现我们不是真实的浏览器请求,所以就需要伪装UA,然后用requests里面的方法模拟请求,获取response数据,提取我们自己想要的数据,再用文件流操作持久化存储,供后续使用,总结为以下五步骤。
1)指定url
2)UA伪装
3)发起请求,参数处理
4)获取响应数据
5)持久化存储
二、实例爬虫项目分析
需求:爬取国家药监总局化妆品生产许可证相关数据
http://scxk.nmpa.gov.cn:81/xk/
1、需求拆解
1)我们先看一看这个请求过去,是否有接口能否返回我们想要的内容,经过查找没有-----No,而且我们发现他是动态加载数据的,所以没办法用get请求直接获取到数据,所以我们需要找ajax请求
2)但是我们点击详情进入到,有我们想要的许可证相关信息的详情页面,发现每个页面只有标识id不同,所以我们无论如何都需要从主页某个接口获取到id,将它取出来,再拼接到这个url 作为参数爬取我们想要的数据
3)仔细分析详情页面的接口,发现它也是动态加载数据,无法用get请求直接获取到,经过f12,查看接口,我们找到这个接口可以获取到我们想要的详情数据
而且他的请求参数只有一个,就是id,机会就来了,所以我们现在重点就是需要找到id,可以将它存储在list中,再读取,作为参数,供下面的接口使用,最终爬取我们想要的数据
4)我们返回首页,f12查看接口,找到这个接口可以获取id数据,符合我们预期,现在所有的有用的资料都已收集完毕,我们开始撸代码
三、实例爬虫项目实战
---根据以上分析进一步分步骤写代码
1、导入相关的包
2、批量获取id值
# 批量获取id值
url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
data={'on':'true','page':1,'pageSize':15,'productNam':'','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'])
3、获取企业详情数据,并将id拼接
post_url='http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
for id in id_list:
data={'id':id}
detail_json= requests.post(url=post_url,headers=headers,data=data).json()
all_data_list.append(detail_json)
4、持久化存储
# 持久化存储
fp=open('./allData.json','w',encoding='utf-8')
json.dump(all_data_list,fp=fp,ensure_ascii=False)
以上呢写的是爬取第一页的数据,优化后爬取所有页面数据的完整代码见如下
import requests
import json
import os
if __name__ == '__main__':
# 批量获取id值
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/87.0.4280.88 Safari/537.36'
}
# 获取存储企业id
id_list = []
# 存储所有企业的详情数据
all_data_list = []
# 动态获取所有页面数据
for page in range(1,10):
page=str(page)
data={'on':'true','page':page,'pageSize':15,'productNam':'','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}
detail_json= requests.post(url=post_url,headers=headers,data=data).json()
all_data_list.append(detail_json)
# 持久化存储
fp=open('./allData.json','w',encoding='utf-8')
json.dump(all_data_list,fp=fp,ensure_ascii=False)