爬虫实战练习
目录
- 数据的加载方式
- 爬取天气数据
- 爬取百度翻译
- 爬取药品许可证
- 爬取北京新发地蔬菜价格表
数据的加载方式
1.常见的加载方式
朝服务器发请求 页面数据直接全部返回并加载
2.内部js代码请求
先加载一个页面的框架,之后再朝各项数据的网址发送请求获取数据
如何验证数据是直接加载还是其他方式
浏览器空白处鼠标右键,点击查看网页源码,在源码界面搜索对应的数据
如果能收到就表示该数据是直接加载的

如何查找关键性的数据来源
需要借助于浏览器的network监测核对内部请求
请求的数据一般都是json格式

爬取天气数据
思路
1.拿到页面之后先分析数据加载方式 2.发现历史数据并不是直接加载的 3.查找到可疑的网址并查看请求方式 如果是get请求那么可以直接拷贝网址在浏览器地址访问 4.将请求获得的数据稍作分析 网站:https://www.bejson.com/ 5.利用requests模块朝发现的地址发送get请求获取json数据 6.可以研究历史天气数据的url找规律,即可爬取指定月份的数据
代码演示
import requests res = requests.get('http://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=8') real_data_html = res.json().get('data') print(real_data_html)

爬取百度翻译
思路
1.在查找单词的时候页面是在动态变化的 2.并且针对单词的详细翻译结果数据是动态请求获取的 3.打开network之后输入英文查看内部请求变化 发现sug请求频率固定且较高 4.研究sug请求发现每次输入的单词都会朝固定的一个网址发送post请求 并且请求体携带了改单词数据
代码演示
import requests keyword = input('请输入你想要翻译的单词>>>:') res = requests.post('https://fanyi.baidu.com/sug', data={'kw':keyword} ) data_list = res.json().get('data') for d in data_list: print(d)

爬取药品许可证
思路
# 需求:爬取药品企业生产许可证详细信息 1.先明确是否需要爬取页面数据 如果需要则先查看数据的加载方式 2.通过network查看得知数据是动态加载的 网页地址只会加载一个外壳 3.通过network点击fetch/xhr筛选动态获取的地址和请求方式

4.利用requests模块发送相应请求获取数据 之后再分析 5.利用浏览器点击详情页查找关键数据 http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=911d4f256300476abb78012427d38c9d

6.由于我们需要爬取详情页的数据所以要验证数据的加载方式 7.详情页核心数据也是动态加载的 发现是post请求并携带了一个id参数 id: 911d4f256300476abb78012427d38c9d 8.通过比对得知id数据与第一次爬取的公司简介里面的id一致 从而得出结论 循环获取格式简介id 然后发送post请求 获取每个公司的详细数据

代码演示
import requests res = requests.post('http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList', data={ "on": "true", "page": 1, "pageSize": 15, "productName":'', "conditionType": 1, "applyname":'', "applysn": '' } ) # data_dict = res.json() # data_list = data_dict.get('list') # 上述两步合成一步 data_list = res.json().get('list') # 循环获取格式id值 for d in data_list: # 字段取值 获取id值 ID = d.get("ID") # 发送网络请求 res1 = requests.post('http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById', data={'id':ID} ) # 获取数据结果 data_dict = res1.json() print(data_dict)

多页数据如何获取与如何存储到文件中
思路
1.先点击页码查看url的变化 如果数据变化url不变 那么数据肯定是动态加载的 如果数据变化url也变 那么数据可能是直接加载也可能是动态 2.针对上述案例 数据是动态加载 所以需要研究每一次点击页码内部请求 3.研究请求体参数得知数据页由page控制 4.写一个for循环即可
5.并将数据写入文件存储起来
代码演示
import os import requests import json if not os.path.exists(r'company_info'): os.mkdir(r'company_info') headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'} url1 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList' for p in range(1,381): res1 = requests.post(url1, headers=headers, data={ 'on': 'true', 'page': p, 'pageSize': 15, 'productName': '', 'conditionType': 1, 'applyname': '', 'applysn': '' } ) com_list = res1.json().get('list') for i in com_list: id = i.get('ID') url2 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById' res2 = requests.post(url2, headers=headers, data={'id': id} ) com_detail = res2.json() name = com_detail.get('epsName') info_add = os.path.join(r'company_info', name) with open(info_add, 'w', encoding='utf8') as f: json.dump(com_detail, f)

浙公网安备 33010602011771号