爬虫实战

概要

  • 数据的加载方式

  • 爬取天气数据

  • 爬取百度翻译

  • 爬取药品许可证

  • 多页数据如何获取与如何存储到文件中


详细

  • 数据的加载方式

# 常见的加载方式
1.直接加载
    朝服务器发送请求,返回全部页面数据并加载
2.间接加载(内部js代码多次请求)
    朝服务器发送请求,先加载页面主要结构,再朝其他地址发送请求获取具体数据
  • 爬取天气数据

思路:
    1.打开页面,先分析从数据加载的方式(空白处右键查看网页源代码)
    2.源代码中并无天气数据,此页面为间接加载
    3.查看打开该网页时会向哪些网址发送请求(空白处右键检查选network,get请求可直接将地址复制到浏览器地址栏访问)
    4.分析请求得到的结果是否是天气数据
    # 解析json字符串的网站:https://www.bejson.com/
    5.如果是就利用requests模块朝该地址发送get请求获取json数据
    6.分析历史天气url的规律,可爬取其他月份的数据
import requests
urlW = 'http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=9'
res = requests.get(urlW)
dictW = res.json().get('data')
print(dictW)

 

  • 爬取百度翻译

思路:
    1.打开页面,先分析从数据加载的方式(空白处右键查看网页源代码)
    2.源代码中并无输入单词的信息,此页面为间接加载
    3.该网页对单词的翻译是随着输入框变动动态获取的
    4.打开network,发现每次输入单词都会朝四个地址发送请求,其中sug频率固定
    # 解析json字符串的网站:https://www.bejson.com/
    5.利用requests模块朝sug请求的地址发送post请求获取json数据
        该请求用于显示输入框下拉菜单的数据
import requests
urlEng = 'https://fanyi.baidu.com/sug'
# 搜索框下拉数据
resE = requests.post(urlEng,
                     headers={
                         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36X-Requested-With: XMLHttpRequest'},
                     data={
                         'kw': 'q'
                     })
dataE = resE.json().get('data')
for d in dataE:
    print(d)

 

  • 爬取药品许可证

http://scxk.nmpa.gov.cn:81/xk/
思路:
1.打开页面,先分析从数据加载的方式(空白处右键查看网页源代码)
2.源代码中并无药企信息,此页面为间接加载
3.查看打开该网页时会向哪些网址发送请求
4.发现打开页面时会向一个地址发送post请求,查看其请求体
5.利用requests模块朝sug请求的地址发送post请求获取json数据
6.继续验证详情页的数据加载方式

# 1.引入requests模块用于发送网络请求
import requests
# 2.指定查找药企概要信息的url
urlXkzsList = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'
# 3.指定查找详情的url
urlXkzsDetail = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'
# 4.将请求体信息放入post请求并向概要url发送
res = requests.post(urlXkzsList,
                    data={
                        'on': 'true',
                        'page': 1,      # 页码
                        'pageSize': 15, # 每页数据行数
                        'productName': '',
                        'conditionType': 1,
                        'applyname': '',
                        'applysn': ''
                    })
# 5.获取上述的响应,为单页药企概要信息
dataList = res.json().get('list')
# 6.循环获取每家药企的信息
for d in dataList:
    # 7.向每家药企发送携带企业ID的post请求
    resD = requests.post(urlXkzsDetail, data={'id': d.get('ID')})
    # 8.将请求结果(单家药企信息)反序列化成字典
    resDict = resD.json()
    # 9.输出该企业信息
    print(resDict)

  • 多页数据如何获取与如何存储到文件中

思路:
1.先点击页码在network查看请求url的变化
    (1)如果数据变化且url不变 那么数据肯定是动态加载的
    (2)如果数据变化且url变 那么数据可能是直接加载或动态加载
2.针对上述案例,数据是动态加载,所以需要研究每一次点击页码内部请求
3.研究请求体参数得知数据页由page表示
4.在外层加一个for循环
5.将数据逐次存入文件

 

posted @ 2021-09-17 15:14  Leguan001  阅读(53)  评论(0)    收藏  举报