网络爬虫实战--天气、百度翻译和药品
网络爬虫的实战
-
-
爬取天气数据
-
爬取百度翻译
-
数据加载方式
常见数据加载方式
向服务页面发送请求,服务页面直接加载出全部数据
""" 如何验证数据是直接加载还是其他方式 浏览器空白处鼠标右键 点击查看网页源码 在源码界面搜索对应的数据 如果能收到就表示该数据是直接加载的(你可以直接发送相应请求获取) """
内部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.数据存储如何实现 """