05>>>爬取数据实战

爬取数据实战

 

浏览器功能介绍

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()
结合实际需求,保存相应的数据,方法:文件操作,数据库等等……

 

 
posted @ 2021-09-18 03:04  veryjoe  阅读(109)  评论(0)    收藏  举报