网络爬虫实战--天气、百度翻译和药品

网络爬虫的实战

  • 数据的加载方式(重要)

  • 爬取天气数据

  • 爬取百度翻译

  • 爬取药品许可证

 

数据加载方式

常见数据加载方式

  向服务页面发送请求,服务页面直接加载出全部数据

"""
如何验证数据是直接加载还是其他方式
    浏览器空白处鼠标右键 点击查看网页源码 在源码界面搜索对应的数据
        如果能收到就表示该数据是直接加载的(你可以直接发送相应请求获取)
"""

内部js代码请求

  向服务页面发送请求,服务页面不直接加载出全部数据,而是向各数据的源地址请求获取数据

'''
查找页面数据来源
需要借助浏览器的network监测对内部请求
  请求数据一般时json格式  
'''

如何判断加载方式

1.在当前数据页面,右键查看网络源代码

2.ctrl+f打开查询框,输入查询数据

3.结果:0/0 是一次或多次js请求

   如果不是,要再次通过network验证

 

爬取天气数据

网址:http://tianqi.2345.com/wea_history/54511.htm

1.查看前页面的数据加载方式

2.右键点击查看网页源码

3.ctrl+f搜索框输入查找数据,例如,将数据中任意一个数据输入搜索框。

4.继续验证按f12键查看network,点击XHR查看。

5.进行互动,点击"下一月",查看请求信息。

 

6.可以查看到源地址,所以为js请求加载,请求方式为get。

7.执行代码获取信息。

import requests
import pandas
import json

# 发送get请求获取信息
res=requests.get('http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=54511&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=8'
                 )
# 将获取的信息输出 print(res.text)

8.将信息分析,可以将它复制到https://www.bejson.com/,做深入了解。

 

 9.放入网站转义之后,可以发现data包含天气信息,data才是需要的结果。

# 将数据用json转义,获取data数据
print(res.json()['data'])

 

百度翻译

1.输入单词时,可发现看页面动态变化,打开网络源码,查询数据,发现不是直接加载

 

2.使用network查看,动态数据加载,例如:在百度翻译中输入英文

3.搜索到动态数据后可以看见,post请求、URL地址和data键值对

import requests

res=requests.post('https://fanyi.baidu.com/langdetect',
                  data={"query": "bi"}
                  )
print(res.text)

4.输出后,发现不是所有的内容,需要再次查找

 

5.执行新的代码,输出获取信息内容

import requests

res=requests.post('https://fanyi.baidu.com/sug',
                  data={"kw": "b"}
                  )
# 进行json格式转化为对应数据类型输出
print(res.json())

 6.发现data才是我们需要的数据

for d in res.json().get('data'):
    print(d)

 

 爬取药品许可证

需求:爬取药品企业生产许可证详细信息

网址:http://scxk.nmpa.gov.cn:81/xk/

1.查看目录数据的加载方式,复制数据,打开网络源码,ctrl+f输入复制数据内容

2.发现是动态加载

3.按f12,通过network查找xhr获取数据的地址和请求方式

 

4.执行post代码,查看获取数据结果

import requests

res=requests.post(url="http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList",
                  data={"on": "true",
"page": 1,
"pageSize": 15,
"productName":"",
"conditionType": 1,
"applyname":"",
"applysn":""}
                  )
print(res.json())

5.发现list是信息数据结果

6.打开详情页面,验证数据加载方式

7.发现是js动态加载,按f12、通过network查找xhr获取数据的地址和请求方式

 8.发现url地址,post请求方式和id号

 9.发现id数据与第一次爬取的公司简介里面的id一致

  结论:

  循环获取ID号,发送post请求,就可以循环获取每个公司的详情信息

# 获取信息
list_in=res.json().get("list")
# 循环字典每个键值对
for com_id in list_in:
  # 获取ID ID
=com_id.get("ID")
  # 执行post请求 res2
=requests.post('http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById', # 请求题为id
          data
={'id':ID} )
  # 输出结果 print(
res2.json())

"""
深入研究
    1.多页数据如何获取(思路非常重要)
        1.先点击页码查看url的变化
            如果数据变化url不变 那么数据肯定是动态加载的
            如果数据变化url也变 那么数据可能是直接加载也可能是动态
        2.针对上述案例 数据是动态加载 所以需要研究每一次点击页码内部请求
        3.研究请求体参数得知数据页由page控制 
        4.写一个for循环即可
    2.数据存储如何实现
"""

返回目录

posted @ 2021-09-17 16:33  微纯册  阅读(101)  评论(0编辑  收藏  举报