爬取数据实战
浏览器功能介绍
Elements 查看页面被浏览器渲染之后的html代码
Console 相当于一个JavaScript编写环境
Sources 以文件目录的形式存放各种资源
Network 监控网络请求
φ 清空记录
Hide data URLs旁边一串 筛选服务器请求。
Fetch/XHR 阿贾克斯请求
Application 数据存储相关,里面就保存有cookies
数据的加载方式(重要)
1.常见的加载方式:
朝服务器发送请求,页面数据直接全部返回并加载。
"""
如何验证数据是直接加载还是其他方式?
浏览器空白处右键点击查看网页源代码,在源代码界面搜索对应的数据。如果能收到就表示该数据是直接加载的(意味着可以直接发送相应请求获取)
"""
2.内部js代码请求:
先加载一个页面的框架,之后再朝各项数据的网址发送请求获取数据。
范例:
B站随意选取一个视频标题,在源代码里检查。
没有,并且主页源代码非常少
"""
如何查找关键性的数据来源?
需要借助于浏览器的network监测核对内部请求。请求的数据一般都是json格式。
"""
天气数据
先从简单的开始,素材来源自2345天气王
网址:tianqi.2345.com
# 需求:查看某地区的历史天气
1.拿到页面之后先分析数据加载方式
拷贝任意一条数据,然后查看网页源代码,看看是否能查找到数据。
有(配图)
2.发现历史数据并不是直接加载的
统一的研究方向>>>利用Network(可以先清空历史数据)
3.查找到可疑的网址并查看请求方式
如果是get请求,那么可以直接拷贝Request URL并用浏览器打开
4.将请求获得的数据稍作分析
www.bejson.com可以转义json格式数据。
5.利用request模块朝发现的地址发送get请求获取json数据
import requests
res = requests.get('')
print(res.json()) # 反序列化成字典之后,比对一下数据在哪个键值对中
(配图)
real_data_html = res.json().get('data')
print(real_data_html)
(配图)
"""扩展阅读,后期再学"""
import pandas
df1 = pandas.read_html(real_data_html)[0] # 生成了列表
df1.to_excel(r'tianqi.xlsx') # 生成了一份excel表格文件
练习
可以研究历史天气数据的url找规律,即可爬取指定月份的数据
百度翻译
这次我们试着研究研究字典。素材使用百度翻译。
网址:fanyi.baidu.com
# 需求:爬取百度翻译结果
1.在查找单词的时候,页面是在动态变化的
由此可知内容也是动态加载的。
2.并且针对单词的详细翻译结果是动态请求获取的
3.打开network之后,输入英文查看内部请求变化
可以发现sug请求频率固定且较高。
4.研究sug请求发现
import requests
res = requests.post('https://fanyi.baidu.com/sug',
data={'kw':'money'}
)
data_dict = res.json()
print(data_dict) # 可以查看一下
(配图)
data_list = data_dict.get('data')
for d in data_list:
print(d)
(配图)
现在我们可以制作一个pycharm翻译器了。
import requests
keyword = input('请输入英语单词>>>:')
res = requests.post('https://fanyi.baidu.com/sug',
data={'kw':keyword}
)
data_dict = res.json()
data_list = data_dict.get('data')
for d in data_list:
print(d)
(配图)
爬取药品许可证
这次来点刺激的,爬取药监局的资料。放心,这些都是合法公开的数据,不会有麻烦的^_^。
地址:scxk.nmpa.gov.cn:81/xk/
# 需求:爬取所有药品企业的生产许可证详细信息
# 主页面部分
1.先明确是否需要爬取页面数据,如果需要则先查看数据的加载方式
2.通过network查看得知数据是动态加载的,网页地址只会加载一个空壳
Preview可以预览网页展示效果
3.通过Network点击fetch/XHR筛选出动态获取的地址和请求方式
(配图)
4.利用requests模块发送相应请求获取数据,之后再分析
import requests
res = requests.post('',
data={
'one':'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')
print(data_list)
(配图)
5.利用浏览器点击详情页获取生产许可证详细信息
# 详情页面部分
6.验证详情页数据的加载方式
7.详情页核心数据也是动态加载的,发现是post请求,并携带了id参数。
核心数据详情页地址:http://scxk.nmpa.gov.cn:81/xk/itownet/portal/dzpz.jsp?id=911d4f256300476abb78012427d38c9d
核心数据请求地址:http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById
核心数据请求id:911d4f256300476abb78012427d38c9d
8.通过比对得知:id数据与第一次爬取的公司简介中的id一致,从而可得出结论:
循环获取格式简洁id,然后发送post请求,获取每个公司的详细数据
# 循环获取公司id
for d in data_list:
# 字段取值,获取id值
ID = d.get('ID')
# 发送网络请求
res1 = request.post('',data={'id':ID})
# 获取数据结果
data_dict = res1.json()
结合实际需求,保存相应的数据,方法:文件操作,数据库等等……