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 动态内容——应用宝搜索应用!相关推荐

  1. Python 爬虫:获取 JS 动态内容——应用宝搜索应用

      本内容主要介绍如何获取网页中 JS 动态生成的内容. 文章目录 1.1 Ajax 异步加载生成网页内容 1.2 从网页响应中找到 JS 脚本返回的数据 1.2.1 找到 JS 请求的数据接口 1. ...

  2. python爬虫爬取今日头条_Python爬虫实战入门五:获取JS动态内容—爬取今日头条...

    之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的. 有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成 ...

  3. python爬取今日头条热点新闻事件,Python爬虫实战入门五:获取JS动态内容—爬取今日头条...

    之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的. 有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成 ...

  4. python爬取今日头条后台数据_Python爬虫实战入门五:获取JS动态内容—爬取今日头条...

    之前我们爬取的网页,多是HTML静态生成的内容,直接从HTML源码中就能找到看到的数据和内容,然而并不是所有的网页都是这样的. 有一些网站的内容由前端的JS动态生成,由于呈现在网页上的内容是由JS生成 ...

  5. python爬虫动态解析js_Python爬虫实战入门五:获取JS动态内容—爬取今日头条

    F12打开网页调试工具: 选择"网络"选项卡后,发现有很多响应,我们筛选一下,只看XHR响应.(XHR是Ajax中的概念,表示XMLHTTPrequest)然后我们发现少了很多链接 ...

  6. python爬取万方数据库,爬虫获取 js 动态数据 (万方数据库文献下载)

    今天讲讲用爬虫下载万方数据库文献. 右键那个下载按钮 -> 检查,我们可以看见,按钮的点击事件是一个 js 函数 upload(). 在网页源代码中,寻找这个 upload() 函数,发现它只在 ...

  7. python爬虫获取百度贴吧内容

    python爬虫获取百度贴吧内容 python爬虫获取百度贴吧内容 *声明:本文仅供学习交流使用,请勿用于商业用途,违者后果自负.* python爬虫获取百度贴吧内容 博主是一个比较懒的人,不会按时更 ...

  8. python爬虫之js链接跳转抓取_Python爬虫获取页面所有URL链接过程详解

    如何获取一个页面内所有URL链接?在Python中可以使用urllib对网页进行爬取,然后利用Beautiful Soup对爬取的页面进行解析,提取出所有的URL. 什么是Beautiful Soup ...

  9. Python 爬虫 - 获取百度关键字搜索内容

    Python 爬虫 获取百度关键字搜索内容 https://www.cnblogs.com/w0000/p/bd_search_page.html Github headers内的参数,仅有UA时,返 ...

最新文章

  1. softmax函数_数学证明深度学习激活函数从Softmax到Sparsemax
  2. OVS DPDK--报文处理流程(八)
  3. C语言二进制转换为八进制(附完整源码)
  4. mysql 升级 openssl_【1分钟教程】LNMP架构应用实战 Openssl升级操作
  5. 对象输出流 ObjectOutputStream java
  6. 容器编排技术 -- AWS EC2快速入门
  7. css奇数、偶数样式
  8. python verilog就业_Verilog会被淘汰吗?
  9. 文件搭建后找不到变量/函数定义问题
  10. .NET网络编程学习(三)--网络蜘蛛程序(Spider)
  11. linux vi 字符串替换
  12. NODEJS数据库增删改查
  13. UI设计师如何通过兼职月入过万?
  14. linux系统实训总结报告,《linux操作系统实训》总结报告 - 图文
  15. 十大运动蓝牙耳机品牌排行榜,六款值得买的运动耳机推荐
  16. 如何用蓝牙网关广播蓝牙数据
  17. Springboot框架整合Mybatis-plus实战动态SQL以及常见的Mybatis面试题
  18. 华为鸿蒙电视配置,华为旗下荣耀智慧屏PRO55英寸AI摄像头鸿蒙系统4K超清电视机...
  19. Chrome网页翻译失效的解决方案
  20. 电脑儿童,【儿童玩电脑】儿童玩电脑好吗_儿童玩电脑的危害 - 妈妈网百科

热门文章

  1. Totoro中文分词第二版上线啦
  2. 谷歌离开游览器不触发_为什么很多做外贸的企业选择了谷歌推广?
  3. java基于ssm开发的花店系统
  4. 数组[Java](除去一个数组中的某个值并生成一个新数组)
  5. 关于cookie、MAC、sku、listing等亚马逊关联因素
  6. Adobe Photoshop CC 2018 下载
  7. Google:五亿Android设备激活
  8. 马云以2750亿财富第三次成为中国首富;扎克伯格:AWS云服务成本太高;小米否认冰箱由海尔代工 | EA周报...
  9. 关于运维,阿里云、字节、华科的专家如是说
  10. 软件质量与测试第4周小组作业:WordCountPro