js 爬虫抓取网页数据(Ajax——实现动态页面Ajax一门 )
优采云 发布时间: 2022-01-21 05:18js 爬虫抓取网页数据(Ajax——实现动态页面Ajax一门
)
Ajax - 实现动态页面
Ajax 不是一种编程语言,而是一种使用 JavaScript 与服务器交换数据并更新网页部分而不更改与页面的连接的技术。在这个过程中,页面实际上是在后台与服务器交互的。获取数据后,通过 JavaScript 更新网页内容。除了一些比较老的或者轻量级的网站,现在的网站大部分都是动态页面,动态页面可以关联更多的数据,所以也是爬虫面对的主要网页形式。
网络 - 位置请求和数据
Ajax 有其特殊的请求类型,称为 XHR。要在 XHR 中查找请求,您需要使用开发人员工具栏中的网络。
第0行左侧,红色圆圈按钮为开启网络监控(默认高亮),灰色圆圈为清除面板信息。在右侧,选中复选框 Preserve log,用于“保留请求日志”。如果不点击,跳转页面时记录会被清除。所以在抓取一些会跳转的网页时,需要将其点亮。
第一行是对请求进行分类查看。最常用的有:ALL(查看全部)/XHR(只查看XHR)/Doc(文档,第0个请求一般在这里),Img(只查看图片)/Media(只查看媒体文件)/Other(其他) . JS和CSS是前端代码,负责发起请求和页面实现;字体是文本的字体。
第 2 行和第 1 行的中间是时间线。记录提出的时间和要求。第 2 行是每个请求。
第三行是统计有多少请求,总共有多大,用了多长时间。
Network 可以记录浏览器的所有实时网络请求,这些请求构成了 Elements 中的所有内容。清除面板中的信息后,点击红色按钮,通过“下拉”或点击“加载更多”、“下一页”等方式会记录相应的请求,您可以通过以下方式搜索所需的请求这些请求中的名称。数据对应于特定请求。
在XHR中点击请求后,从左到右依次为:Headers:header(请求信息),Preview:预览,Response:响应,Cookies:Cookies,Timing:时间。
Headers分为四个部分,Requests URL一般是所需数据的真实URL。
如果直接在浏览器中打开这个链接,由于没有解析响应,呈现的规律性较差,很难定位到具体的数据位置。
Json - 解析数据
JSON 是 XHR 传输数据的一种数据格式,非常类似于 Python 中的字典。XHR 返回的数据为 json 格式,由浏览器开发者工具自动解析并呈现在 Preview 中。“keys”和“values”逐层展开,很容易定位到具体的数据位置。JSON 是一种文本格式。不是所有的编程语言都能读取 Python 中的数据类型,但都支持 JSON 的简单数据类型。因此可以实现json数据,跨平台,跨语言工作。使用 json() 方法将 json 数据格式转换为列表/字典。
实战练习——QQ音乐周杰伦歌曲
# 引用requests库 import requests# 调用get方法,利用General里的Requests URL对应的真实地址爬取XHR的json数据res_music = requests.get('https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0')# 使用json()方法,将response对象,转为列表/字典json_music = res_music.json()# 一层一层地取字典,获取歌单列表list_music = json_music['data']['song']['list']# list_music是一个列表,music是它里面的元素for music in list_music: # 以name为键,查找歌曲名 print(music['name']) # 查找专辑名 print('所属专辑:'+music['album']['name']) # 查找播放时长 print('播放时长:'+str(music['interval'])+'秒') # 查找播放链接 print('播放链接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n')