跟随B站-波波老师学爬虫(一)——requests

一、爬虫的理解与分类

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)

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值