Python 爬虫:获取 JS 动态内容——应用宝搜索应用!
1.1 Ajax 异步加载生成网页内容
现在越来越多的网页使用 Ajax 异步加载方式,即网页中的一些内容由前端的 JS 动态生成。由于呈现在网页上的内容是由 JS 生成而来,我们能够在浏览器上看到,但是在 HTML 源码中却发现不了。
比如应用宝的搜索应用页面,显示如下:
从上面可以看到,搜索出来的应用列表信息是在 id="J_SearchDefaultListBox"
DOM 树下面。
查看当前网页的源码(使用快捷键 “Ctrl + U”)如下:
在源码中,发现元素 id="J_SearchDefaultListBox"
下面的内容为空,没有任何应用列表信息。
通过上面的分析可知,应用宝应用搜索页面中显示的应用列表是由 JS 动态生成加载的。
遇到这种情况,我们应该如何对网页内容进行爬取呢?一般有两种方法:
(1)从网页响应中找到 JS 脚本返回的数据(大多是 json 格式,也有 xml 格式。);
(2)使用 Selenium 对网页进行模拟访问。
下面我们将介绍第一种方法。第二种方法可以参考这里。
1.2 从网页响应中找到 JS 脚本返回的数据 既然网页内容是由 JS 动态生成加载的,那么 JS 就需要先对某个接口进行调用,然后根据接口返回的数据再进行加载和渲染。那我们可以先找到 JS 调用的数据接口,从数据接口中找到网页中最后呈现的数据。 下面我们就以应用宝的搜索应用页面为例,进行说明。
1.2.1 找到 JS 请求的数据接口
按照如下步骤进行操作:
将看到如下信息:
- 打开应用宝的搜索页面(https://android.myapp.com/myapp/search.htm)
- 按 F12 打开网页调试工具
- 选择 “Network” 选项卡
- 选择 “XHR”(即 XMLHTTPRequest,是 Ajax(Asynchronous JavaScript and XML,异步的 JavaScript 和 XML) 中的概念。 )
- 输入应用名(例如:微信)
在这里,我们看到只有一个 request(其他网页可能会存在多个)。点击这个 request,然后选择 “Preview”,可以看到如下数据:
在上面的数据中,我们发现了“微信”、“多开助手”等信息,这些就是搜索出来的应用列表信息。
通过上面的分析,可以知道搜索出来的应用列表信息正是通过这个 request 获取的。这个 request 对应 URL 为 https://android.myapp.com/myapp/searchAjax.htm?kw=%E5%BE%AE%E4%BF%A1&pns=&sid=(获取方法:将鼠标移动到这个 request 上 -> 然后右键单击 -> Copy -> Copy link address)。
将上面的 URL 在浏览器中打开,会返回一串数据。看起来似乎很乱,但实际上是 JSON 格式的数据。
这样,我们就找到了 JS 请求的数据接口。
1.2.2 URL 编码 上面我们找到的 JS 请求的数据接口是 https://android.myapp.com/myapp/searchAjax.htm?kw=%E5%BE%AE%E4%BF%A1&pns=&sid=,但是其中的 %E5%BE%AE%E4%BF%A1 代表什么意思呢?
实际上 %E5%BE%AE%E4%BF%A1
是中文 微信
的 URL 编码。在 Python 中,可以使用 urllib.parse.quote()
得到,即 '%E5%BE%AE%E4%BF%A1' = urllib.parse.quote('微信')
。
按照标准,URL 中只允许包含英文字母、数字以及部分符号,其他字符(比如中文)是不符合 URL 标准的。这个时候就需要进行 URL 编码。
1.2.3 代码实现
按照以下 4 步进行实现:
(1)引入相关的库;
(2)对 JS 请求的数据接口进行请求;
(3)对 HTTP 响应的数据进行 json 格式化;
(4)进行遍历获取列表中 App 的信息(App 名称、包名、版本号、apk 下载 URL等)
import json
import requests
from urllib.parse import quote# 对数据接口进行 http 请求
app_name = '微信'
url = 'https://android.myapp.com/myapp/searchAjax.htm?kw={}&pns=&sid='\.format(quote(app_name))
web_data = requests.get(url).text# 对 http 响应的数据进行 json 格式化
data = json.loads(web_data)
app_infos = data['obj']['appDetails']# 进行遍历获取列表中 App 的信息(App 名称、包名、版本号、apk 下载 URL等)
for app_info in app_infos:app_name = app_info['appName']pkg_name = app_info['pkgName']version_code = app_info['versionCode']version_name = app_info['versionName']download_url = app_info['apkUrl']print(app_name, pkg_name, version_code, version_name, download_url)
近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地
Python 爬虫:获取 JS 动态内容——应用宝搜索应用!相关推荐
- Python 爬虫:获取 JS 动态内容——应用宝搜索应用
本内容主要介绍如何获取网页中 JS 动态生成的内容. 文章目录 1.1 Ajax 异步加载生成网页内容 1.2 从网页响应中找到 JS 脚本返回的数据 1.2.1 找到 JS 请求的数据接口 1. ...
- python爬虫爬取今日头条_Python爬虫实战入门五:获取JS动态内容—爬取今日头条...
之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的. 有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成 ...
- python爬取今日头条热点新闻事件,Python爬虫实战入门五:获取JS动态内容—爬取今日头条...
之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的. 有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成 ...
- python爬取今日头条后台数据_Python爬虫实战入门五:获取JS动态内容—爬取今日头条...
之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的. 有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成 ...
- python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条
F12打开网页调试工具: 选择"网络"选项卡后,发现有很多响应,我们筛选一下,只看XHR响应.(XHR是Ajax中的概念,表示XMLHTTPrequest)然后我们发现少了很多链接 ...
- python爬取万方数据库,爬虫获取 js 动态数据 (万方数据库文献下载)
今天讲讲用爬虫下载万方数据库文献. 右键那个下载按钮 -> 检查,我们可以看见,按钮的点击事件是一个 js 函数 upload(). 在网页源代码中,寻找这个 upload() 函数,发现它只在 ...
- python爬虫获取百度贴吧内容
python爬虫获取百度贴吧内容 python爬虫获取百度贴吧内容 *声明:本文仅供学习交流使用,请勿用于商业用途,违者后果自负.* python爬虫获取百度贴吧内容 博主是一个比较懒的人,不会按时更 ...
- python爬虫之js链接跳转抓取_Python爬虫获取页面所有URL链接过程详解
如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解析,提取出所有的URL. 什么是Beautiful Soup ...
- Python 爬虫 - 获取百度关键字搜索内容
Python 爬虫 获取百度关键字搜索内容 https://www.cnblogs.com/w0000/p/bd_search_page.html Github headers内的参数,仅有UA时,返 ...
最新文章
- softmax函数_数学证明深度学习激活函数从Softmax到Sparsemax
- OVS DPDK--报文处理流程(八)
- C语言二进制转换为八进制(附完整源码)
- mysql 升级 openssl_【1分钟教程】LNMP架构应用实战 Openssl升级操作
- 对象输出流 ObjectOutputStream java
- 容器编排技术 -- AWS EC2快速入门
- css奇数、偶数样式
- python verilog就业_Verilog会被淘汰吗?
- 文件搭建后找不到变量/函数定义问题
- .NET网络编程学习(三)--网络蜘蛛程序(Spider)
- linux vi 字符串替换
- NODEJS数据库增删改查
- UI设计师如何通过兼职月入过万?
- linux系统实训总结报告,《linux操作系统实训》总结报告 - 图文
- 十大运动蓝牙耳机品牌排行榜,六款值得买的运动耳机推荐
- 如何用蓝牙网关广播蓝牙数据
- Springboot框架整合Mybatis-plus实战动态SQL以及常见的Mybatis面试题
- 华为鸿蒙电视配置,华为旗下荣耀智慧屏PRO55英寸AI摄像头鸿蒙系统4K超清电视机...
- Chrome网页翻译失效的解决方案
- 电脑儿童,【儿童玩电脑】儿童玩电脑好吗_儿童玩电脑的危害 - 妈妈网百科
热门文章
- Totoro中文分词第二版上线啦
- 谷歌离开游览器不触发_为什么很多做外贸的企业选择了谷歌推广?
- java基于ssm开发的花店系统
- 数组[Java](除去一个数组中的某个值并生成一个新数组)
- 关于cookie、MAC、sku、listing等亚马逊关联因素
- Adobe Photoshop CC 2018 下载
- Google:五亿Android设备激活
- 马云以2750亿财富第三次成为中国首富;扎克伯格:AWS云服务成本太高;小米否认冰箱由海尔代工 | EA周报...
- 关于运维,阿里云、字节、华科的专家如是说
- 软件质量与测试第4周小组作业:WordCountPro